使用 ffmpeg select 过滤器

use of ffmpeg select filter

我坚持使用 ffmpeg select 过滤器,因为我只想获取输入视频的结束帧,但我无法弄清楚过滤器的 selection 表达式完成工作, 我的代码如下所示:

ffmpeg -i in.mp4  -filter_complex  "select=expr_selecting_lastest_frame, overlay=overlay_expr"  out.jpg

现在我该如何编码 expr_selecting_lastest_frame? 你们有想法吗? 还有其他方法可以完成工作吗?请帮忙,谢谢!

使用 ffprobe 获取总帧数并将其分配给 var

$frame_count="$(ffprobe -v 0 -select_streams v:0 -count_frames -show_entries stream=nb_read_frames -of csv=p=0 in.mp4)";

使用 select 过滤器中的变量

ffmpeg -i in.mp4 -filter_complex "select='eq(n,$frame_count)'" -vframes 1 out.jpg

或倒数第二帧

ffmpeg -i in.mp4 -filter_complex "select='eq(n,$frame_count-1)'" -vframes 1 out.jpg

对于具有已知持续时间和全局 header 的格式,例如 MP4 或 MKV,您可以

ffmpeg -sseof -3 -i file -vsync 0 -q:v 1 -update true out.jpg

sseof 从末尾开始查找 - 我使用值 3 来说明具有较长音频流的文件。 -update 是一个 image2 muxer 选项,它告诉 ffmpeg 覆盖输出文件。所以最后一次覆盖输出是在处理最后一帧时。