我有一个包含 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 与原始格式完全相反。