FFmpeg:无需重新编码即可重新创建时间戳

FFmpeg:无需重新编码即可重新创建时间戳

我有一个包含 H264 视频(25 FPS)的 MP4 文件。某些时间戳不正确(出于某些原因...)。我可以处理该文件并只重新生成时间戳而不重新编码吗?我试过这个

ffmpeg -r 25 -i infile -c copy outfile

但即使“-r”的文档说明了这一点,outfile 中的时间戳仍然与原始时间戳一样:

作为输入选项,忽略文件存储的任何时间戳,并 而是假设恒定帧速率 fps 来生成时间戳。

我也尝试过提到的建议这里在底部:

ffmpeg -fflags +genpts -i infile -c copy outfile

这也不会改变输出文件中的时间戳。还有其他方法可以执行此任务吗?时间戳是一种元数据,所以我认为应该可以以某种方式实现。

答案1

事实证明,该-r选项仅适用于原始流数据。(这可以是 H.264 流……它确实如此。)不是必须只是像素数据。

在此示例中,我使用的是 MP4 容器。首先,提取流:

ffmpeg -i source.mp4 -map 0:v -vcodec copy -bsf:v h264_mp4toannexb source-video.h264

接下来,获取该流并重新混合它,但具有特定的帧速率和生成的时间戳。

ffmpeg -fflags +genpts -r 60 -i source-video.h264 -vcodec copy output.mp4

答案2

选项-fps_mode用于控制输出时间戳,而不是-r选项。drop参数重置输入时间戳并生成新的时间戳。

ffmpeg -i source.mp4 -fps_mode drop -map 0:v -vcodec copy output.mp4

选项-r输入告诉 FFmpeg 以恒定模式读取指定数量的帧。FFmpeg 有时很难确定输入帧数。通过指定确切的数字,您可以消除误解。

-r选项适用于所有类型的数据,无论是原始数据还是编码数据。

顺便说一下,H.264 与原始格式完全相反。

相关内容