使用 ffmpeg 的显式时间基准和 mp4 中的可变帧速率

使用 ffmpeg 的显式时间基准和 mp4 中的可变帧速率

我需要连接多个具有不同帧速率的视频文件,以便使用 Raspberry PI 上的 OMXPlayer 播放它们(连接也是在 PI 上完成的)。

原始文件和拼接文件都是 mp4/h264,原始文件也是由我的一些软件创建的。

当文件具有不同的时间基准时,使用 ffmpegs 复制复用器不起作用。

所以我在想,我制作的原创视频带有一种明确的时间基准120(120 可以被 25 和 30 整除,这是我唯一关心的帧速率)。

考试

ffmpeg.exe -i .\ballon.mp4 -enc_time_base 1:120 .\ballon-120.mp4

看起来很有希望:ffmpeg 表示它可以生成 30fps 的视频(原始视频为 30fps),输出时间基准为 120。

但是,它还说它“重复帧”很多,并且以下命令告诉我我拥有的帧数是实际应该拥有的帧数的 4 倍:

ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 .\ballon.mp4

ffprobe 也认为帧速率现在是 120,而 OMXPlayer 确实抱怨帧速率太高并且播放视频有点慢。

我想要的是更改时间基准,而不是帧速率或帧数。我该怎么做?

答案1

使用私有 MP4 复用器选项

ffmpeg.exe -i .\ballon.mp4 -c copy -video_track_timescale 120 .\ballon-120.mp4

按照你的命令,重新编码视频并向编码器提供时间基准,ffmpeg 使用该时间基准进行帧复制/丢弃决策。

答案2

关键是使用vsync如下选项:

ffmpeg.exe -i .\ballon.mp4 -enc_time_base 1:120 -vsync vfr .\ballon-120.mp4

相关内容