我有几个 30fps 的视频需要使用以下命令转换为 DVD 可接受的分辨率和帧率的视频:
ffmpeg.exe" -i "INPUT.MP4" -vf "select='mod(n,6)',crop=720:576:x=280:y=72" -r 25 -metadata:s:v:0 language= -metadata:s:a:0 language= -acodec pcm_s16le -ar 48000 "OUTPUT.MKV"
这基本上符合我的预期。但是,我希望命令使用以下算术序列选择要删除的帧:6x-3(3、9、15、21 等)。我尝试了模数函数,但是无法获得所需的结果。
我对 FFmpeg 不是很有经验,我想避免从视频中提取帧、删除帧并重新编码视频。
有什么建议或解决方案吗?
答案1
为了从第三帧开始删除每 6 个帧,我们可以使用:
select='mod(n+4,6)'
帧计数从零开始,当mod(n + 4,6)= 0时,表示未选择该帧。
mod(0+4,6) = 4
- 选择了第一帧。mod(1+4,6) = 5
- 选择了第二帧。mod(2+4,6) = 0
- 未选择第三帧。
使用-r 25
作为输出参数,复制帧。
除了-r 25
作为输出,我们可以使用-vsync 0
(passthrough) 和设定点用于校正时间戳的过滤器。我们还可以添加-r 25
输入参数来校正帧周期:
ffmpeg -y -r 25 -vsync 0 -i test.mp4 -vf "select='mod(n+4,6)',setpts='N/25/TB'" "OUTPUT.MKV"
测试:
构建带有运行计数器的 30fps 合成视频:
ffmpeg -y -r 30 -f lavfi -i testsrc=size=192x108:rate=1:duration=60 -vf setpts=N/TB/30 test.mp4
从第三帧开始删除每 6 帧,然后转换为 25fps:
ffmpeg -y -r 25 -vsync 0 -i test.mp4 -vf "select='mod(n+4,6)',setpts='N/25/TB'" "OUTPUT.MKV"
转换为 PNG 图像序列(用于测试):
ffmpeg -i OUTPUT.MKV %04d.png
我们可以看到第 2 帧和第 8 帧缺失了。
我们还可以使用以下命令验证帧速率是否为 25fps媒体信息工具:
ID : 1
Format : AVC
Duration : 2 s 0 ms
Frame rate mode : Constant
Frame rate : 25.000 FPS
答案2
我会用shuffleframes
:
ffmpeg -i INPUT.mp4 -vf "**shuffleframes**=0 1 -1 2 3 4", setpts=N/(25*TB) -r 25 OUTPUT.mp4
第三个索引-1
指示 FFmpeg 删除第三帧。