为什么在给出“-codec copy”时 ffmpeg 会改变时间戳,以及如何防止这种情况?

为什么在给出“-codec copy”时 ffmpeg 会改变时间戳,以及如何防止这种情况?

我目前正在尝试使用 ffmpeg 从一堆m2ts文件中删除某些音轨(主要是为了节省空间)。在此过程中,我希望删除这些音轨成为仅有的应用于文件的操作。因此,我使用以下命令行模式:

ffmpeg -i input.m2ts -map 0:0 -map 0:2 -codec copy output.m2ts

这里,轨道 0 是视频轨道,轨道 2 是我想要保留的音频轨道。输入文件还包含轨道 1,这是一条我想要丢弃的音频轨道,因此未映射。

由于我正在使用-codec copy,我希望每个映射的轨道都被复制完全一样并且没有任何改变,包括各种时间戳。但和很多人一样,我在执行这个命令时遇到了问题。有很多错误消息,例如:

Non-monotonic DTS in output stream 0:7; previous: 12978089, current: 12978087; changing to 12978090. This may result in incorrect timestamps in the output file.

该消息明确指出时间戳的改变可能会导致问题。

关于如何处理该消息,有很多问题和答案。据我所知,通常的建议是为 ffmpeg 提供选项,使其忽略这些错误并使其从 PTS 计算 DTS。换句话说,常见的解决方案还会让 ffmpeg 更改 DTS 时间戳。

我现在有以下问题:

为什么 ffmpeg 会在给定时关心错误的时间戳-codec copy?时间戳是轨道的一部分,不是吗?如果是,则无论它们是否正确,都应将其原封不动地从源文件复制到目标文件中,对吗?

我可以给 ffmpeg 提供哪些选项来实现这一点(也就是说防止其改变时间戳以任何方式)?

答案1

-codec copy只是意味着不重新编码流,而是中继编码的比特流包。

时间戳不是编码比特流本身的一部分。它们是与数据包相关的信号元数据。它们应该是单调的,即按顺序不减少,因为播放器无法回到过去显示帧。但由于错误或拼接/连接操作,人们可以在输入中获得非单调的时间戳。当复用器遇到这些时,它会通过为当前数据包分配尽可能低的下一个值(通常在最后一个输出时间戳上加 1)使它们单调,然后再将其写入输出。FFmpeg 不允许您绕过此调整,实际上,它不会产生任何影响。

相关内容