容器格式(MP4、CMAF、MPEG-TS、Matroska)通用指南

容器格式是一种将多个数据流嵌入到单个文件中的方式,常用于在线视频、下载电影或使用流媒体服务中。常见的容器格式包括MP4、MKV、AVI和MOV等。本文从基本的专业术语到各种容器文件类型(包括MP4、CMAF、MPEG-TS、Matroska)都作了详细介绍。

来源:BITMOVIN
题目:The Definitive Guide to Container File Formats [2022]
作者:Armin Trattnig
链接:https://bitmovin.com/container-formats-fun-1/#MP4_Container_Formats
内容整理:李雨航

术语注释

在开始之前,以下是一些关于术语的注释:

编解码器用于以二进制形式存储媒体信号。大多数编解码器以有损方式压缩原始媒体信号。

最常见的媒体信号是视频、音频和字幕。电影由不同的媒体信号组成。大多数电影除了动画外还有音频和字幕。

视频编解码器的示例有:H.264、HEVC、VP9 和 AV1。音频有:AAC、MP3 或 Opus。每种媒体信号都有许多不同的编解码器。

单个媒体信号通常也称为基本流或简称为流。当人们将视频流称为编解码器、媒体或 H.264 流时,表达的是同一个意思。

什么是媒体容器?

容器格式是一种描述不同的多媒体数据元素(数据流)和元数据如何在文件中共存的元文件格式规范。容器格式提供以下内容:

  • 流封装 : 一个或多个媒体流可以存在于一个文件中。
  • 定时/同步 : 容器添加有关文件中不同流如何被一起使用的数据。例如。将视频流中的口型与音频流中的语音同步的正确时间戳。
  • 寻址 : 容器提供了电影可以跳转到哪个时间点的信息。例如。观众只想观看整部电影的一部分。
  • 元数据 : 元数据有很多种。可以使用容器格式将它们添加到电影中,有时字幕也被视为元数据。

常见的容器格式有 MP4、MPEG2-TS 和 Matroska,可以表示不同的视频和音频编解码器。每种容器格式都有其优点和缺点。这些属性可能与兼容性、流式传输和大小开销有关。

容器文件术语

编码

将原始媒体信号转换为编解码器的二进制文件的过程。例如,将一系列原始图像编码为视频编解码器 H.264。编码也可以指将非常高质量的原始视频文件转换为夹层格式以便于共享和传输的过程——例如:采用大小为 12.4MB 的未压缩 RGB 16 位帧,持续 60 秒(以 24 帧/秒)总计 17.9GB – 并将其压缩为每帧 3.11MB 大小的 8 位帧,对于相同的 60 秒 24fps 视频,总共为 2.9GB。有效压缩视频文件大小15GB!

解码

与编码相反;解码是将二进制文件转换回原始媒体信号的过程。例如:H.264 编解码器流式传输到可视图像中。

转码

将一个编解码器转换为另一个(或相同)编解码器的过程。解码和编码都是实现成功转码的必要步骤。最好描述为:解码源编解码器流,然后将其再次编码为新的目标编解码器流。虽然编码通常是有损的,但帧插值和放大等附加技术可以提高压缩视频格式的转换质量。

复用

将一个或多个编解码器流添加到容器格式中的过程。

解复用

从容器格式中提取编解码器流。

转复用

从一种容器格式中提取流并将它们放入不同(或相同)的容器格式中。

多路复用

将音频和视频交织成一个数据流的过程。例如:来自编码器的基本流(音频和视频)被转换为数字电视基本码流(PES),然后转换为传输流(TS)。

解多路复用

多路复用的逆操作。即从媒体容器中提取基本流。例如:从 mp4 音乐视频中提取 mp3 音频数据。

带内事件

这是指与特定时间戳关联的元数据事件。这通常意味着这些事件与视频和音频流同步。例如:这些事件可用于触发动态内容替换(广告插入)或补充内容的呈现。

容器格式(MP4、CMAF、MPEG-TS、Matroska)通用指南
图 1 编码、解码、转码、复用、解复用、转复用过程示意

OTT 媒体交付中的容器格式

容器几乎存在于任何有数字媒体的地方。例如用手机录制视频,捕获的音视频都存储在一个容器文件中,比如 MP4。另一个例子是互联网上的媒体流。在端到端过程中,处理的媒体数据的主要实体就是容器。在内容生成结束时,打包器将编码好的数据多路复用到容器中,然后根据客户端设备的请求进行网络传输。容器在客户端设备被解复用,内容被解码并最终呈现给最终用户。

容器格式(MP4、CMAF、MPEG-TS、Matroska)通用指南
图 2 在线媒体交付工作流程

在播放器中处理容器格式

提取数据元

在客户端,播放器需要从容器中提取有关媒体的一些基本信息,例如片段的播放时长、持续时长和编解码器。

此外,容器中通常存在大多数浏览器不会提取或在盒子外处理的元数据。这需要播放器实现所需的适当处理。例如 CEA-608/708 字幕、带内事件(fMP4 的 emsg 盒子)等,播放器必须从媒体容器格式解析相关数据,跟踪时间线并在正确的时间进一步处理数据(比如在正确的时间显示正确的字幕)。

容器格式(MP4、CMAF、MPEG-TS、Matroska)通用指南
图 3 fMP4 段的 EMSG 盒子

用户端转复用

浏览器通常不支持某些容器格式。例如 Chrome、Firefox、Edge 和 IE 不(正确)支持 MPEG-TS 容器格式。

MPEG(Moving Picture Experts Group,动态影像专家组,一个由 ISO 和 IEC 组成的工作组)传输流格式是专门为数字视频广播 (DVB) 应用设计的。由于 MPEG-TS 仍然是一种常用格式,唯一的解决方案是将媒体从 MPEG-TS 转换为这些浏览器支持的容器格式(即 fMP4)。

这个转换步骤可以在将内容转发到浏览器的媒体堆栈以进行解复用和解码之前在客户端完成。它基本上包括解复用 MPEG-TS,然后将基本流重新复用为 fMP4。这个过程通常被称为 transmuxing(转复用)。

容器格式(MP4、CMAF、MPEG-TS、Matroska)通用指南
图 4 转复用器将媒体从传输过程中使用的 MPEG-TS 转换为用户浏览器支持的 fMP4 格式

MP4 容器格式

标准概述

MPEG-4 Part 14 (MP4) 是最常用的容器格式之一,通常以 .mp4 文件结尾。它用于基于 HTTP 的动态自适应流式传输 (DASH),也可用于 Apple 的 HLS 流式传输。MP4 基于 ISO 基本媒体文件格式(MPEG-4 Part 12),而后者则基于 QuickTime 文件格式。

MPEG 代表动态影像专家小组,是国际标准化组织 (ISO) 和国际电工委员会 (IEC) 的合作组织。MPEG 的成立是为了制定音频和视频压缩和传输的标准。MPEG-4 指定了视听对象的编码。

MP4 支持多种编解码器。最常用的视频编解码器是 H.264 和 HEVC。AAC 是最常用的音频编解码器。AAC 是著名的 MP3 音频编解码器的继承者。

容器格式(MP4、CMAF、MPEG-TS、Matroska)通用指南
图 5  MP4 文件格式是在原有 ISO 基本媒体文件格式基础上的扩展

ISO 基本媒体文件格式

ISO 基本媒体文件格式(ISOBMFF,MPEG-4 Part 12)是 MP4 容器格式的基础。ISOBMFF 是定义基于时间的多媒体文件的标准。时基多媒体一般指指音频和视频,它们通常以稳定的流形式传送。它很灵活且易于扩展,支持多媒体数据的可交换性、管理、编辑和可呈现性。ISOBMFF 的基本组件是盒子(box),也称为原子(atom)。该标准通过使用类和面向对象的方法来定义盒子。使用继承,所有盒子都扩展了一个基类 Box,并可通过添加新的类属性来达成特定目的。

基类例如 FileTypeBox:FileTypeBox 用于标识 ISOBMFF 文件的用途和用法。常位于文件的开头。一个盒子也可以有子盒子,形成一棵盒子树。例如 MovieBox (moov) 可以有多个 TrackBoxes (trak)。在 ISOBMFF 背景下的轨道是单一媒体流。例如。MovieBox 包含一个视频轨道盒和一个音频轨道盒。进制编解码器数据可以存储在媒体数据盒 (mdat) 中。轨道通常引用其二进制编解码器数据。

容器格式(MP4、CMAF、MPEG-TS、Matroska)通用指南
图 6 MP4封装

片段化 MP4(fMP4)

容器格式(MP4、CMAF、MPEG-TS、Matroska)通用指南
图 7 MP4容器格式

使用 MP4 也可以将电影分成多个片段。这样做的好处是,对于使用 DASH 或 HLS,播放器软件只需要下载观众想要观看的片段。fMP4 文件由通常的 MovieBox 和 TrackBoxes 组成,以表示哪些媒体流可用。Movie Extends Box (mvex) 用于表示电影在片段中继续。

另一个好处是片段可以存储在不同的文件中,片段由 Movie Fragment Box (moof) 组成,它与 Movie Box (moov) 非常相似,包含了有关单个片段中包含的媒体流的信息。例如,它包含存储在片段中的 10 秒视频的时间戳信息。每个片段都有自己的 Media Data (mdat) 盒子。

fMP4 文件调试

查看 (f)MP4 文件的盒子(原子)通常是发现特定盒子的错误以及其他不需要的配置所必需的。要总结媒体文件包含的内容,最好的工具是:

  • ediaInfo(https://mediaarea.net/en/MediaInfo/Download) -ffprobe, which is part of the ffmpeg binaries (https://ffbinaries.com/downloads)

以上工具不会显示 (f)MP4 文件的盒子结构。为此,您可以使用以下工具:

  • oxdumper (https://github.com/l-smash/l-smash)
  • soViewer (https://github.com/sannies/isoviewer)
  • P4Box.js (http://download.tsi.telecom-paristech.fr/gpac/mp4box.js/filereader.html)
  • p4dump (https://www.bento4.com/)

CMAF 容器格式

MPEG-CMAF(通用媒体应用格式)

事实证明,将每个平台作为内容分发者提供服务具有挑战性,因为某些平台仅支持特定的容器格式。

要分发特定内容,可能需要将同一内容的副本以不同的容器格式来承载和分发,例如MPEG-TS 和 fMP4。显然,这会提高用于内容生成的设备成本,以及托管同一内容多个副本的存储成本。最重要的是,它还降低了 CDN 缓存的效率。MPEG-CMAF 旨在解决这些问题,不是通过创建另一种容器格式,而是通过融合一个已经存在的用于 OTT 媒体传输的容器格式。因为 CMAF 与 fMP4 密切相关,这使得从 fMP4 到 CMAF 的过渡非常容易。此外,随着 Apple 参与 CMAF,未来可能不需要将内容混合在 MPEG-TS 中以服务于 Apple 设备,CMAF 可以在任何地方使用。

有了 MPEG-CMAF,使用 MPEG-CENC(Common Encryption,通用加密)的 DRM (Common Encryption,数字版权管理)解决方案的互操作性也得到了改进。理论上可以对内容进行一次加密,并且仍可以将其与各种最先进的 DRM 系统一起使用。然而,并没有标准化的加密方案。而且还存在其他方案与之竞争,例如 Widevine 和 PlayReady,它们彼此不兼容,但 DRM 行业正在慢慢向着一种通用加密格式发展。

分块 CMAF

MPEG-CMAF 的一个有趣特性是可以将片段编码为所谓的 CMAF 块。这种内容的分块编码与使用 HTTP 分块传输编码传输媒体文件相结合,可以在实时流媒体用例中达到比以往更低的延迟。

容器格式(MP4、CMAF、MPEG-TS、Matroska)通用指南
图 8 传统 fMP4 段与分块 CMAF 段对比

在传统的 fMP4 中,整个片段必须完全下载才能播放。而使用分块编码后,片段中的任何加载完成的块都可以被解码和播放,与此同时仍可加载片段的其余部分。因此,可实现的实时延迟不再取决于片段持续时间,因为不完整片段的多路复用块已经可以在客户端加载和播放。

MPEG 传输流 (MPEG-TS) 容器格式

MPEG 传输流已在 MPEG-2 第 1 部分中标准化,专为数字视频广播 (DVB) 应用而设计。与其对应的 MPEG 节目流(旨在存储媒体并在 DVD 等应用中找到它的用途)相比,MPEG 传输流是一种更面向传输的格式。

MPEG 传输流由小的单独数据包组成,这些数据包应该是实现弹性的措施,并将此类损坏或丢包的影响降至最低。此外,该格式包括使用前向纠错 (FEC) 技术以允许在接收器处纠正传输错误。该格式显然是为在有损传输信道上使用而设计的。

复用:ES → PES → TS

来自编码器的基本流首先被转换为 Packetized Elementary Stream(PES)。由此添加的 PES 标头包括流标识符、PES 数据包长度和有关媒体时间戳的信息等。在下一步中,PES 被分成 184 字节的块,并通过向每个块添加 4 字节的标头来转换为 Transport Stream (TS)。生成的 TS 由固定长度为 188 字节的数据包组成。每个 TS 数据包的标头都带有相同的 Packet Identifier(PID),它将数据包与其来源的基本流相关联。

容器格式(MP4、CMAF、MPEG-TS、Matroska)通用指南
图 9 复用过程示意

多基本流复用

一个基本流代表音频或视频内容。给定一个视频基本流,我们通常也至少会一个音频基本流。这些相关的 ES 将被复用到相同的传输流中,不同的 ES 及其数据包有单独的 PID。

容器格式(MP4、CMAF、MPEG-TS、Matroska)通用指南
图 10 多基本流复用示意

多程复用

MPEG-TS 有节目的概念。一个节目基本上是一组相关基本流,例如视频和与其匹配的音频。单个传输流可以携带多个节目,例如,每个节目都是不同的电视频道。

容器格式(MP4、CMAF、MPEG-TS、Matroska)通用指南
图 11 多程复用示意

节目关联

从底层的角度来看,一个传输流就是一个 188 字节长的 TS 数据包序列。如前所述,可以有许多节目,每个节目都有多个基本流,但客户端通常一次只能呈现一个节目。因此,它必须以某种方式知道在接收到传输流时要使用哪些数据包以及要丢弃哪些数据包。为此,有两种特殊数据包:

  • Program Association Table ( pat ) :pat数据包具有保有 0 的 PID,并包含传输流的所有节目的节目映射表的 PID。
  • Program Map Table (PMT) :PMT 表示单个节目并包含节目的所有基本流的 PID。
容器格式(MP4、CMAF、MPEG-TS、Matroska)通用指南
图 12 TS流结构

图中:

  1. 检查 PID 为 0 的 TS 数据包,其中包含 pat
  2. 找到播放器应在 pat 中播放的节目的 PMT-PID(在这个例子中:200)
  3. 获取带有相关 PMT-PID 的 TS 数据包,其中包含 PMT(在本例中:PID 200)
  4. PMT 包含所有媒体轨道的 PID,它们是要播放的节目的一部分

接收传输流的客户端将首先读取它收到的第一个 pat 数据包,并根据用户的选择选择要呈现的节目。

从 pat 中获得所选节目的 PMT,它提供节目的基本流及其 PID。现在客户端只需筛选这些 PID,每个 PID 代表所选程序的一个单独的 ES,将其解复用、解码并呈现给用户。

OTT 特定方面和结论

前面的解释都是面向广播的,但是在OTT中,有一些需要特别注意的地方。OTT 客户端的网络连接不稳定并且没有保证的带宽,这要求只加载将要呈现的内容。鉴于客户端一次只能呈现一个节目,在同一传输流中传输并加载多个节目将浪费带宽,而这部分带宽本可更好地被使用,例如用于视频质量的自适应。因此,对于 OTT,我们永远不会在一个传输流中包含多个节目。对于多音频内容,类似的争论适用于多路复用基本流,即所有这些都应该多路复用到它们自己的传输流中。MPEG-TS 仍然广泛用于 OTT,特别是在针对 Apple 生态系统时。MPEG-TS 的缺点是对于较小的数据包大小和所有数据包标头,与 fMP4 相比开销更高。MPEG-TS 是面向传输的,包括对有损通信通道的考虑,这并不完全适合基于 HTTP 的媒体传输,因为在基于 HTTP 的媒体传输中,传输丢包已经由网络协议栈处理了。

MPEG-TS 的调试与检查

  • http://www.digitalekabeltelevisie.nl/dvb_inspector/ (GUI, 开源)
  • http://thumb.co.il/ (GUI/Web, 开源)
  • http://dvbsnoop.sourceforge.net/ (CLI, 开源)
  • http://dvbsnoop.sourceforge.net/ (CLI, 开源)

Matroska(Webm)容器格式

Matroska 是一种免费且开放的标准容器格式。它基于 Extensible Binary Meta Language (EBML),该语言基本上是二进制形式的 XML。这使得标准易于扩展,几乎可以支持任何编解码器。

WebM

WebM 基于 Matroska 容器格式。开发主要由谷歌推动,以便在网络上使用免费和开放的 MP4 和 MPEG2-TS 替代品。它还支持 Google 的开放和免费编解码器,例如:用于视频的 VP8、VP9 以及用于音频的 Opus 和 Vorbis。也可以将 WebM 与 DASH 结合使用,通过网络流式传输 VP9 和 Opus。

容器格式资源

  • Video Player Datasheet :https://bitmovin.com/video-player-datasheet/
  • Video Encoding Datasheet :https://bitmovin.com/video-encoding-data-sheet/
  • Video Analytics Datasheet :https://bitmovin.com/bitmovin-analytics-datasheet/
  • AV1 Datasheet :https://bitmovin.com/av1-datasheet/

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论