我正在尝试从视频中提取少量帧,如下所示:
ffmpeg -i input.mp4 -vf 'select=eq(n\,1395)+eq(n\,2790)+eq(n\,4185)+eq(n\,5580)' \
'img%01d.jpg'
然而,我得到的是 ffmpeg 提取视频中的所有帧,而不仅仅是我想要的帧。我可以做得更好吗?
我正在尝试从视频中提取少量帧,如下所示:
ffmpeg -i input.mp4 -vf 'select=eq(n\,1395)+eq(n\,2790)+eq(n\,4185)+eq(n\,5580)' \
'img%01d.jpg'
然而,我得到的是 ffmpeg 提取视频中的所有帧,而不仅仅是我想要的帧。我可以做得更好吗?
我们可以添加
-vsync 0
或-fps_mode:v passthrough
论证:对于较新版本的 FFmpeg 添加
-fps_mode
:ffmpeg -i input.mp4 -fps_mode:v passthrough -vf "select='eq(n\,1395)+eq(n\,2790)+eq(n\,4185)+eq(n\,5580)'" img%01d.jpg
对于旧版本的 FFmpeg 使用
vsync
:ffmpeg -vsync 0 -i input.mp4 -vf "select='eq(n\,1395)+eq(n\,2790)+eq(n\,4185)+eq(n\,5580)'" img%01d.jpg
执行FFmpeg时,出现警告消息:“超过1000帧重复”。
输出图像并非所有输入视频帧,而是同一帧的大量重复图像。
帧 1395 的多个重复,然后帧 2790 的重复...
FFmpeg 复制帧以实现恒定的输出帧速率。
原因是默认情况下
fps_mode
应用auto (-1)
“根据复用器功能在 cfr 和 vfr 之间进行选择”。。cfr
被选中,因此“帧将被复制和丢弃,以准确实现所请求的恒定帧速率”。为了实现恒定的“(输出)帧,复制最后一个选定的帧,直到下一个选定的帧......
测试:
使用帧计数器构建 10fps 输入视频(用于测试)
ffmpeg -y -f lavfi -r 10 -i testsrc=size=192x108:rate=1:duration=600 -vf setpts=N/10/TB -c:v libx264 -pix_fmt yuv420p input.mp4
:.执行:
ffmpeg -i input.mp4 -fps_mode:v passthrough -vf "select=eq(n\,1395)+eq(n\,2790)+eq(n\,4185)+eq(n\,5580)" img%01d.jpg
输出为 4 个 JPEG 图像:
img1.jpg
,img2.jpg
,img3.jpg
,img4.jpg
:, , ,
在 Windows 10 下使用 FFmpeg 版本 5.1.2-full_build-www.gyan.dev 进行测试。