我有一个 mp4 视频文件,想从中提取几张图片,然后缩小每张提取的图片。我采纳了类似帖子的建议,使用选择提取图片,但当我添加缩放时,选择过程没有任何作用,每一帧都被提取出来了。
我已经尝试了这两个命令,它们仅在命令中的缩放位置上有所不同:
ffmpeg -i "$input" -filter:v "select='lt(prev_pts*TB\,1.0)*gte(pts*TB\,1.0) +lt(prev_pts*TB\,6.0)*gte(pts*TB\,6.0) +lt(prev_pts*TB\,11.0)*gte(pts*TB\,11.0)'" -vf scale=480:-1 -vsync drop "/var/tmp/image_i_%d.jpg"
和
ffmpeg -i "$input" -filter:v "select='lt(prev_pts*TB\,1.0)*gte(pts*TB\,1.0) +lt(prev_pts*TB\,6.0)*gte(pts*TB\,6.0) +lt(prev_pts*TB\,11.0)*gte(pts*TB\,11.0)'" -vsync drop vf scale=480:-1 "/var/tmp/image_i_%d.jpg"
遇到同样的问题,选择什么也不做。
此命令不进行缩放,而是提取所需的图像,但我需要对它们进行缩放:
ffmpeg -i "$input" -filter:v "select='lt(prev_pts*TB\,1.0)*gte(pts*TB\,1.0) +lt(prev_pts*TB\,6.0)*gte(pts*TB\,6.0) +lt(prev_pts*TB\,11.0)*gte(pts*TB\,11.0)'" -vsync drop "/var/tmp/image_i_%d.jpg"
我在 Buster 上使用最新的 ffmpeg,但我尝试使用更旧的版本,也遇到了同样的问题。我的帧速率不是整数,所以我使用 lt 和 gte 的组合,但这不是问题所在。问题是使用缩放会终止选择过程。缩放按预期执行。
在使用“select”之前,我使用了一系列三个命令,每个命令都有不同的 seek_time,但这样做效率低下并且耗时太长,因为我有数百个这样的操作要做。
我怎么解决这个问题 ?
答案1
作用于流的多个过滤器应应用于同一个过滤器链中,并以逗号分隔。
所以,
ffmpeg -i "$input" -filter:v "select='lt(prev_pts*TB\,1.0)*gte(pts*TB\,1.0) +lt(prev_pts*TB\,6.0)*gte(pts*TB\,6.0) +lt(prev_pts*TB\,11.0)*gte(pts*TB\,11.0)',scale=480:-1" -vsync drop "/var/tmp/image_i_%d.jpg"