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

10 ffmpeg timestamp

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

ffmpeg -r 25 -i infile -c copy outfile
Run Code Online (Sandbox Code Playgroud)

但即使“-r”的文档说:

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

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

ffmpeg -fflags +genpts -i infile -c copy outfile
Run Code Online (Sandbox Code Playgroud)

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

Bra*_*rad 10

事实证明,该-r选项仅适用于原始流数据。(这可以是H.264流...它必须是公正的像素数据。)

在这个例子中,我使用 MP4 容器。首先,提取流:

ffmpeg -i source.mp4 -map 0:v -vcodec copy -bsf:v h264_mp4toannexb source-video.h264
Run Code Online (Sandbox Code Playgroud)

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

ffmpeg -fflags +genpts -r 60 -i source-video.h264 -vcodec copy output.mp4
Run Code Online (Sandbox Code Playgroud)

  • `-bsf:v h264_mp4toannexb` 到底是做什么的?第二,如果不应用 `+genpts` 会发生什么? (12认同)
  • h264 解码器需要知道“片段”(NALU)在比特流中从哪里开始。当 h264 数据位于 MP4 容器内时,MP4 容器会处理此问题(使用示例表)。如果您想要没有容器的“原始”h264,则需要向每个 NALU 添加额外的“起始代码”,如 h.264 标准附录 B 中所定义。h264_mp4toannexb 比特流过滤器正是这样做的:向每个 NALU 添加起始码。 (4认同)

小智 5

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

ffmpeg -vsync drop -i source.mp4 -map 0:v -vcodec copy output.mp4
Run Code Online (Sandbox Code Playgroud)

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

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

顺便说一下,H.264 与 raw 完全相反。

  • 这给了我一个警告和一个致命错误。 (3认同)