使用ffmpeg的视频缩略图


3

我正在寻找一种简便的方法来为任何给定的视频文件创建一系列缩略图。我几乎在用ffmpeg了,这就是我所拥有的:

ffmpeg -i /tmp/video.avi -r 1 -ss 60 -r 1 foo-%03d.jpeg`

唯一的问题是,它每秒拍摄一次,而我想每分钟左右拍摄一次。我试过设置-r1/60.02无济于事。

作为参考,这是我使用的旧脚本,仅适用于某些文件:

#!/bin/bash
# grab a screenshot every 60 seconds
file=$1
orig_dir=`pwd`
mins=`exiftool "$file" | grep "Duration" | awk -F : '{print $2}' | grep --only-matching '[0-9]*'`
dir="$file-screenshots"
mkdir "$dir"
cd "$dir"
mplayer -vo png -vf screenshot -sstep 60 -frames $mins -ao null "../$file"
cd "$orig_dir"

这不必在命令行上,只是它总是最简单。


看一下这个问题superuser.com/questions/135117/how-to-convert-video-to-images/…也许在这里找到的信息可以解决这个问题。如果是这样,请回答另一个问题,因为这可能会重复出现。
Nifle

Answers:


3

请参见ffmpeg联机帮助页。您要-vframes

-vframesnumber
设置要录制的视频帧数。

另请参见此人在做相同事情的示例。原始消息指出,-r参数小于1的参数似乎无法正常工作。相反,建议使用这种命令行抓取一帧(其中X是在文件中向前搜索的时间):

ffmpeg -ss X -i input.movie.file -an -vframes 1 ouput.png

然后使用shell脚本循环播放,并根据(a)您要抓取多少帧和(b)视频多长时间自动生成X。由于您的旧示例脚本已经找到(b),因此(a)是唯一需要的输入:

# generate NFRAMES frames in a movie 90 minutes long

mins=$(exiftool "$file" | grep "Duration" | awk -F : '{print $2}' | grep --only-matching '[0-9]*')
dir="$file-screenshots"
mkdir "$dir"

for i in $(seq 1 $NFRAMES);
do
  ffmpeg -ss $(echo "$i * $mins" | bc -l) -i "$file" -an -vframes 1 "$dir/$i.png";
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.