我目前正在尝试使用 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 提供哪些选项来实现此目的(即防止它以任何方式更改时间戳)?
-codec copy
只是意味着不重新编码流,而是中继编码的比特流数据包。时间戳不是编码比特流本身的一部分。它们是与数据包相关的信令元数据。它们应该是单调的,即序列不递减,因为玩家无法及时返回来显示帧。但由于错误或拼接/连接操作,人们可能会在输入中获得非单调时间戳。当复用器遇到这些情况时,它会通过为当前数据包分配尽可能低的下一个值(通常在将其写入输出之前将最后一个输出时间戳加 1)来使它们单调。FFmpeg 不允许您绕过此调整,并且在实践中,它不会产生任何影响。