多个音频流、视频流和字幕存储在一个容器中,并一起播放。
容器格式中的同步信息存储在哪里?在元数据中还是其他地方?
答案1
这取决于容器本身。不同的容器处理同步的方式不同。不同之处在于数据本身的存储方式。
例如,容器可以选择只将应该同时呈现的部分存储在一起,或者每隔一段时间插入同步点,甚至为每个数据块赋予一个时间戳。
有些容器可以基于时间,而有些则只是数据流。当然,后者具有性能优势,但同步可能被关闭,并且如果没有特定索引就无法进行查找(例如在 AVI 中)。
例如,MPEG-2 传输流是一种非常早期的容器格式,使用分组基本流来存储数据。例如,您将有一个用于视频的分组流和一个用于音频的分组流。为了同步它们,有一个程序时钟参考字段:
为了使解码器能够呈现同步内容(例如与相关视频匹配的音轨),至少每 100 毫秒在 MPEG-2 传输流数据包的适配字段中传输一次节目时钟参考(或 PCR)。MPEG-2 节目的 PID 和 PCR 由相关节目映射表中的 pcr_pid 值标识。如果正确使用,PCR 的值可用于在解码器中生成 system_timing_clock。如果正确实施,STC 解码器可提供高精度时间基准,用于同步音频和视频基本流。
热门MP4容器基于QuickTime 文件格式因此具有共同的特征基础。其规范可以找到这里. 同步是不是元数据的一部分,它是实际数据本身的一部分。不过我还没有研究过细节。
使用 RTP 时提示轨迹,可以通过指示哪些数据包与媒体中的哪个时间戳相关来准备 MP4 文件以进行流式传输。因此,例如,提示轨道会说:此处的数据包由以下部分组成这视频数据和那音频数据。但本地播放时会忽略这些数据。
AVI容器基于里夫。它们将单个数据帧存储在“块”中。由于数据本身可以拆分成单个帧(例如视频帧、音频帧),因此这甚至适用于可变比特率内容,因为帧长度始终相同。这个文件对AVI格式有详细的解释。同步的重要方面是AVI是否正确复用。
这Matroska 容器与 MP4 和其他格式类似。它完全基于时间码,如您在此图。数据本身(例如视频、音频)被分成簇,然后分成块。时间码或多或少被视为演示时间戳。
不过,为了避免混淆,我确实想提一下时间码。眼尖的人会注意到每个 Cluster 都显示一个时间码,然后 Block 结构本身中还有另一个时间码。其工作原理是 Cluster 中的时间码与整个文件相关。它通常是 Cluster 中第一个 Block 需要播放的时间码。Block 本身中的时间码与 Cluster 中的时间码相关。例如,假设 Cluster 中的时间码设置为 10 秒,并且该 Cluster 中有一个 Block 应该在剪辑的 12 秒处播放。这意味着 Block 中的时间码将设置为 2 秒
分组定义了如何在同一物理比特流中按页交织多个逻辑比特流。例如,在不同的逻辑比特流中使用不同的编解码器交织视频流和多个同步音轨时,需要进行分组。
但是,Ogg 对编解码器和“时间”概念一无所知:
Ogg 没有“时间”的概念:它只知道按顺序增加的无单位位置标记。应用程序只能通过更高层获取时间信息,这些更高层可以访问编解码器 API 来分配和转换粒度位置或时间。