使用 ffmpeg 制作视频缩略图

使用 ffmpeg 制作视频缩略图

我正在寻找一种简单易行的方法来为任何给定的视频文件创建一系列缩略图。我使用 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"

这不一定非要在命令行上进行,但它总是最简单的。

答案1

查看ffmpeg 手册页。 你要-vframes

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

另请参阅这个例子有人做同样的事情。原始消息指出,当-r参数少于一个时,它似乎无法正常工作。相反,建议使用这种命令行来抓取一帧(其中 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

相关内容