我有一个包含 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)
小智 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 完全相反。