ffmpeg:如何从流中选择特定模式的帧?

ffmpeg:如何从流中选择特定模式的帧?

有人能帮我将 30 fps 的视频流转换为 24 fps 吗?

原始材料是一部电影。它似乎是以 24 fps 拍摄的,因为流似乎由一系列 4 帧组成,后面跟着一个重复,然后再重复一遍。4 帧,1 个重复,4 帧,1 个重复,4 帧,1 个重复,等等,每秒有 24 帧,每秒有 6 个重复。

当我要求 ffmpeg 将该素材转换为 24 fps 时,发生了奇怪的事情。

当我将 20 秒的剪辑 3 分钟转换为电影,并以 24 fps 的速度转换为 mpeg2video(使用标志 -r 24)时,我得到了一部流畅的电影,除了前几帧是重复的。但是,当我第一次尝试将同一剪辑复制到单独的文件中,然后尝试将其转换为 mpeg2video 时,我得到了几个帧的断断续续的运动,然后是一个重复的帧,然后是更多的帧,一个重复的帧等等,重复帧之间的帧数似乎是随机的。所以 - 同一个剪辑,但在第一种情况下是流畅的,在第二种情况下是断断续续的!

但是,当我使用 ffmpeg 将完全相同的文件转换为 x264 时,我得到了大约 30 帧的相同断奏运动,然后运动变得完全流畅!

这里可能发生什么事?

是否有某种方法可以具体告诉 ffmpeg 仅使用 4 帧,然后跳过一帧,并在整个电影中循环播放?

谢谢。

答案1

有一个具体的问题,您可以使用选择过滤器,或者有一个一般的问题,即删除在电视电影处理过程中引入的未知模式中存在的重复帧。

对于前者,

ffmpeg -i in.mp4 -vf select='mod(n+1,5)',setpts=N/24/TB out.mp4

对于后者,抽取过滤器可能有用

ffmpeg -i in.mp4 -vf mpdecimate,setpts=N/24/TB out.mp4

相关内容