本文为媒矿工厂编译的技术文章
原标题:Fun with Container Formats – Part 1
作者:Armin Trattnig
翻译整理:陈晋进
基础术语的说明
编解码器(codec)能够以二进制形式存储媒体信号,大多数编解码器以有损方式压缩原始媒体信号。最常见的媒体信号有视频,音频和字幕。电影由不同的媒体信号组成,除了动态影像之外,大多数电影都有音频和字幕。视频编解码器有H.264,HEVC,VP9和AV1等,而音频的编解码器则有:AAC,MP3或Opus等。每个媒体信号有许多不同的编解码器。单个媒体信号通常也称为基本流(ElementaryStream)或仅流(just Stream)。
图1 容器
何为容器格式
容器格式即二进制元文件的格式规范,用于描述不同的多媒体数据元素(流)和元数据(metadata)在文件中共存的方式。
每个容器格式都提供以下内容:
常见的容器格式有MP4,MPEG2-TS和Matroska,它们都是不同的一些视频和音频编解码器。每种容器格式都有其优点和缺点,反映在兼容性,文件大小等方面。
更多的术语
图2 更多的术语
编码(encoding)将原始媒体信号转化为适用特定编解码器的二进制文件。例如,将一系列原始图像编码到H.264格式。
而如果有人想要查看编码视频,他们需要解码(decoding)H.264编解码器流以获得实际可视图像。
从一个编解码器转换到另一个(或相同的)编解码器称为转码(transcoding)。转码将执行解码和编码两个步骤,先对源编解码器流进行解码,然后再将其使用目标编解码器流进行编码。
将一个或多个编解码器流放入容器格式称为多路复用(muxing)。
而从容器格式中提取编解码器流称为解复用(demuxing)。
从一种容器格式中提取流,并将它们放在不同(或相同)的容器格式中称为转复用(transmuxing)。
互联网服务(OTT)中的容器
容器在数字媒体的几乎任何领域都有应用。例如用户使用智能手机录制视频时,捕获的音频和视频都存储在一个如MP4的容器文件之中。互联网之中的媒体流也是一个例子。在所有的过程,容器都负责处理媒体数据。在内容生成之后,编码的媒体数据经多路复用打包到容器中,然后根据客户端设备在另一端的请求通过网络传输,而后容器被分解为几个编码数据,最终经解码,内容被呈现给用户。
图3 互联网服务(OTT)中的容器
元数据提取
在客户端处,播放器首先需要从容器中提取有关媒体的一些基本信息,例如,片段的播放时间,持续时间和编解码方式。
此外,容器中经常存在有元数据,而大多数浏览器都不能直接提取或处理元数据,因此,播放器需要进行一些适当的处理。例如对于CEA-608/708字幕或者带内事件(fMP4的emsg box)等情况,播放器必须从媒体容器格式解析相关数据,跟踪时间线并在正确的时间进一步对数据进行处理(比如在合适的时间显示正确的字幕)。
图4 元数据提取
客户端处的转复用
浏览器通常缺乏对某些容器格式的支持,例如Chrome,Firefox,Edge和IE都没有(完全)支持MPEG-TS容器格式。MPEG传输流格式则专门用于数字视频广播(DVB)的应用,将在之后的篇章详细讲述。由于MPEG-TS仍然是常用格式,唯一的解决方案是将媒体从MPEG-TS转换为这些浏览器支持的容器格式(即fMP4)。在将内容转发到浏览器的媒体堆栈以进行解复用和解码之前,可以在客户端完成此转换步骤。它基本上包括解复用MPEG-TS,然后将基本流重新多路复用到fMP4。这个过程通常被称为转复用。
图5 客户端处的转复用
总结
本文翻译自Bitmovin博客上的《Fun with container formats》系列博文的第一篇,这个系列总共有三篇,分析四种最常见的容器格式及其重要性。这篇介绍了容器格式的术语以及播放器的处理方式。