FFmpeg 从第 3 帧开始删除每 6 帧

FFmpeg 从第 3 帧开始删除每 6 帧

我有几个 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 删除第三帧。

相关内容