2022容器格式全面指南

▲扫描图中二维码了解音视频技能大会更多信息▲

作者:Armin Trattnig

翻译:Alex

技能审校:赵志立

特别阐明:This article was originally published by our friends/colleagues at Bitmovin on June 14, 2022. A copy of the original article can be found here:

bitmovin.com/container-f…


本文是一篇介绍2022年容器格局的全面攻略,由Bitmovin公司中一些世界级的视频工程师和专家创造。

咱们创造这篇攻略的意图是希望你能全面了解关于容器格局的一切知识:从最根本的技能术语到深化探求不同的容器格局。

你能够从头开端阅览本篇文章,也能够跳到自己感兴趣的章节阅览。

让咱们开端吧!

在正式开端之前,让咱们先来了解一些技能术语。

编解码器(Codec)用于存储二进制格局的媒体信号,大部分编解码器都会以一种有损的方法紧缩原始媒体信号。

最常见的媒体信号有视频、音频和字幕。电影包括不同的媒体信号,大部分电影除了视频外,还有音频和字幕。

常见的视频编解码器有:H.264、HEVC、VP9和AV1。音频编解码器有:AAC、MP3和Opus。

每种媒体信号都能够运用多种不同的编解码器。

2022容器格式全面指南

编解码器类型

单一媒体信号一般被称为ES流(Elementary Stream)或许数据流。一般人们会用编解码器、媒体或许H.264流表明视频流。

01

什么是媒体容器?

容器格局=描绘多媒体数据流和元数据如安在文件中共存的元文件格局规范。

容器格局供给如下功用:

数据流封装(Stream Encapsulation)

单一文件能够包括一个或许多个媒体数据流。

定时/同步(Timing/Synchronization)

容器增加如安在一个文件中运用不同数据流的数据。比方,将视频流中的唇动与音频流中的语音同步的正确时刻戳。

跳转播映(Seeking)

容器供给电影跳转到某个时刻点的信息。比方,当观众想观看一部分电影内容(而非整部电影)时。

元数据(Metadata)

元数据有很多种。运用容器格局能够将它们增加到电影中。比方,音频流所运用的言语(中文、英文等)。

有时字幕也被认为是元数据。

常见的容器格局包括MP4、MPEG2-TS和MKV(Matroska),能够承载不同的视频和音频编解码器。每种容器格局都有其优点和缺陷。这些特点与兼容性、传输和数据冗余有关。

02

容器格局技能术语

编码(Encoding)

将原始媒体信号转换为编解码器的二进制文件的进程被称为编码。比方,运用视频编码器H.264将一系列原始图画进行编码。编码也指将十分高质量的原始视频文件转换为更简单分享和传输的中间格局的进程:以未紧缩的RGB 16位帧为例,它每帧巨细为12.5MB,持续时刻为60秒(依照每秒24帧核算),算计为17.9GB。现在将它紧缩为3.11MB每帧的8位帧,帧率为24fps的60秒相同视频,只需2.9GB。经过高效紧缩后,视频文件巨细整整少了15GB!

解码(Decoding)

解码对应上文说到的编码。解码是将二进制文件转换回媒体信号的进程。比方:H.264编码器将数据流通换为可观看的图画。

转码(Transcoding)

是指将一个编码格局转换为另一个(或许相同)编码格局的进程。编码和解码是完成成功转码的必要进程。其最佳描绘为:将源编码格局的数据流解码,然后编码为新的方针编码格局数据流。尽管编码一般是有损的,但插帧和上采样等技能可提升转码视频的质量。

封装(Muxing)[1]

是指将一个或多个编解码器数据流增加到一个容器格局的进程。

[1]审校者注:实践上Muxing是Multiplexing的简写,Demuxing是Demultiplexing的简写,一般没有差异;可是看这儿的描绘有意做了细微的区别,封装/解封装 vs 复用/解复用算是契合作者表达的含义,前者着重装进去和提取出来,后者着重以何种方法混合和别离音视频。

解封装(Demuxing)

从容器格局中提取编解码器数据流。

转封装(Transmuxing)

从一个容器格局中提取数据流,然后将它们放入不同的(或许相同)容器格局中。

多路复用(Multiplexing)

是指将音频和视频混合为一个数据流的进程。比方,来自编码器的ES流被转换为PES流(Packetized Elementary Stream),再被转换为TS流(Transport Stream)。

解复用(Demultiplexing)

多路复用的反向操作。意味着从媒体容器中提取ES流。比方,从MP4音乐视频中提取MP3音频数据。

带内事情(In-Band Events)

是指与详细时刻戳相关的元数据事情。一般意味着这些事情与视频和音频流同步。比方,这些事情能够用来触发动态内容替换(广告刺进)或许补充内容出现。

03

OTT媒体传输中的容器格局

简直只要有数字媒体存在的地方,就会有容器。比方,如果你运用智能手机录制视频,采集到音频和视频就会被存储在一个容器文件中(如MP4文件)。

容器格局的另一个实践运用场景是网络流媒体传输范畴。端到端处理媒体数据的实体便是容器。

在内容出产端,打包器会将多路编码的媒体数据打包到容器中,然后在客户端设备的请求下经过网络进行传输。

然后容器被解复用,其间的内容被解码并最终出现给终端用户。

2022容器格式全面指南

在线媒体分发作业流程

04

播映器对容器格局的处理

提取元数据

在客户端,播映器需求从容器中提取根底的媒体信息。比方,切片播映时刻、时长信息和编码格局等。

除此之外,大部分浏览器一般不会直接提取和处理容器中的元数据。

这就要求播映器完成能够妥善处理元数据。

比方CEA-608/708字幕、带内事情(fMP4的emsg box)等,播映器需求剖析媒体容器格局中的相关数据,跟踪时刻线并在正确的时刻点进一步处理数据(比方在正确时刻显现正确字幕)。

2022容器格式全面指南

fMP4切片的EMSG box

客户端转封装

浏览器一般缺少关于特定容器格局的支撑。一个常见比方是,Chrome、Firefox、Edge和IE没有(完整)支撑MPEG-TS容器格局,从而引发了各种问题。

MPEG-TS格局是专为DVB(数字视频播送,Digital Video Broadcasting)运用规划的。

由于MPEG-TS现在仍然是常用格局,所以唯一的处理方法便是将媒体从MPEG-TS转换为这些浏览器支撑的容器格局(如fMP4)。

转封装环节能够在端侧完成,在将内容发送给浏览器媒体栈进行解复用和解码之前履行。

根本上,该步骤包括多路分化MPEG-TS,然后再一次将ES流多路复用到fMP4。

这个进程一般被称为Transmuxing,即转封装。

05

MP4容器格局

规范概览

MPEG-4 Part 14(MP4)是最常用的容器格局,一般以.mp4作为文件后缀名。它能够用于DASH,也能够用于Apple的HLS。

MP4依据ISO根底媒体文件格局(MPEG-4 Part 12),该格局以QuickTime文件格局为根底。

MPEG表明Moving Pictures Experts Group(动态图画专家作业组),由ISO(国际规范化组织)和IEC(国际电工委员会)共同建立。MPEG的意图是为音频、视频紧缩和传输建立规范。MPEG-4明确规定了音视频对象编码。

MP4支撑多种编码格局。H.264和HEVC是最常用的视频编解码器。AAC是最常用的音频编解码器,它是大名鼎鼎的MP3的继任者。

2022容器格式全面指南

ISO 根底媒体文件格局(ISO Base Media File Format)

ISO文件格局(ISOBMFF, MPEG-4 Part 12)是MP4容器格局的根底。ISOBMFF规范界说了依据时刻的多媒体文件——一般指音频和视频,并以稳定的数据流传输。ISO既灵敏,又易于扩展。它支撑多媒体数据的互操作性、办理、修改和出现。

构成ISOBMFF的根本单元是box,也被成为atom。该规范经过运用类和面向对象方法界说了box。一切box承继自基类Box,并经过扩展增加新的类特点以完成特定功用。

基类:

示例FileTypeBox:

FileTypeBox被用来识别ISOBMFF文件的意图和用途,一般坐落文件的开头。

box也能够有子box,并形成box树。比方,MovieBox(moov)就有多个TrackBox(trak)。ISOBMFF中的track便是单一媒体流。如MovieBox能够包括一个视频track box和一个音频track box。

二进制编码数据能够被存储于mdat(Media Data Box)中。Track对二进制编码数据做引用/索引。

2022容器格式全面指南

Fragmented MP4 (fMP4)

2022容器格式全面指南

运用MP4,也能够将一部电影分割成多个片段(fragment)。MP4在此处发挥了优势:经过DASH或许HLS,播映器软件只需下载观众想要观看的视频片段。

fMP4(fragmented MP4)文件包括一般的MovieBox和TrackBox,用以表明哪些媒体流可用。Movie Extends Box (mvex) 用于指示后面跟随着MP4片段。

另一个优势是,这些片段能够被存储在不同的文件中。片段中包括与Movie Box(moov)十分相似的Movie Fragment Box(moof)。moof用于描绘片段中的媒体信息。比方,一个10秒的视频片段,moof存储了这10秒片段的时刻戳信息。每个片段都有自己的mdat。

调试(f)MP4文件

为了发现详细box的bug和其他不必要的配置,很有必要检查(f)MP4文件的box(atom)。

检查媒体文件内容的最佳东西包括:

MediaInfo (mediaarea.net/en/MediaInf…)

ffprobe(ffmpeg东西集的一部分)(ffbinaries.com/downloads)

这些东西并不会向你展现(f)MP4文件的box结构[2]。你能够运用下面这些东西进行展现:

[2]审校者注:此处为原文技能遗漏,mediainfo能够展现box结构,例如,命令行履行mediainfo可经过增加–Details=1参数来完成。

Boxdumper (github.com/l-smash/l-s…)

IsoViewer (github.com/sannies/iso…)

MP4Box.js (download.tsi.telecom-paristech.fr/gpac/mp4box…)

Mp4dump (www.bento4.com/)

2022容器格式全面指南

Isoviewer的截图

06

CMAF容器格局

MPEG-CMAF

由于某些平台仅支撑特定容器格局,所以作为内容发行商为每个平台供给服务无疑困难重重。

想要发行特定内容,需求生成和供给不同的容器格局(即MPEG-TS和fMP4)。很明显,这会增加根底设施中内容出产的本钱,以及托管相同内容的多个副本的存储本钱。最重要的是,它还会下降CDN缓存效率。MPEG-CMAF的意图便是处理上述问题:不是经过创立另外的容器格局,而是融合进一个现已存在的、用于OTT媒体传输的容器格局。CMAF与fMP4严密相关,这使得从fMP4到CMAF的过渡十分简单。除此之外,随着Apple支撑CMAF,将内容封装为MPEG-TS并供给给Apple设备这一方法很有可能会成为过去式,而CMAF将无处不在。

运用MPEG-CMAF,DRM处理计划在互操作性方面也会得到改善[经过运用MPEG-CENC(通用加密,Common Encryption)]。理论上,它能够对内容进行一次加密,然后仍然可用于其他一切先进的DRM体系。不过,遗憾的是,目前还没有规范化的加密计划,并且还存在竞争对手,比方Widevine和PlayReady。这些DRM互相并不兼容,可是整个DRM行业正在慢慢趋向于运用一种格局——通用加密格局(Common Encryption format)。

Chunked CMAF

MPEG-CMAF的一个风趣特点是:它能够将视频切片编码为CMAF chunk。将内容如此编码后,再运用HTTP中的分块传输编码(HTTP chunked transfer encoding)传输媒体文件,这样就能够下降实时流媒体场景中的推迟。

2022容器格式全面指南

在传统的fMP4中,整个视频切片有必要彻底下载之后才能播映。运用分块编码,任何完整下载的视频切片的分块(chunk)都能够解码和播映,即便切片的其他部分还在下载。因而,能够完成的直播低推迟不受切片时长约束,由于不完整切片的分块也能够被客户端加载和播映。

07

MPEG-TS容器格局

MPEG-TS(MPEG Transport Stream)在MPEG-2 Part 1中被规范化,并专门用于DVB(数字视频播送,Digital Video Broadcasting)运用场景。与其对应的MPEG Program Stream(意图在于存储媒体以及在DVD等运用中的运用)相比,MPEG-TS更倾向于是一种面向传输的格局。

MPEG-TS由小的数据包构成,这应该是一种下降视频损坏和丢失影响的办法。除此之外,该格局运用了FEC(前向纠错,Forward Error Correction)技能,答应在接收端更正传输过错。很明显,MPEG-TS是为在有损传输通道运用而规划的。

封装:ES → PES → TS

来自编码器的ES流先被打包成PES,增加的PES头包括数据流标识符、PES包长度、媒体时刻戳等信息。接下来,PES被分成184字节的chunk,然后经过为每个chunk增加一个4字节的标头,将其转换为TS。生成的TS由固定长度为188字节的数据包组成。(同一条流的)每个TS数据包标头都带有相同的PID(数据包标识符,Packet Identifier),这样就将数据包与其ES流相关联。

2022容器格式全面指南

封装多个ES流

一条ES流既能够表明音频内容,也能够表明视频内容。拿视频ES流来说,咱们一般还会有至少一路音频ES流。这些相关的ES会被封装进同一个TS流,其间不同的ES及其数据包有独自的PID。

2022容器格式全面指南

封装多个节目

MPEG-TS具有节目(Program)的概念。节目是集合在一起的一组相关ES流,如视频和相对应的音频。单一TS流能够传输多个节目,且每个节目都是一个不同的电视频道。

2022容器格式全面指南

节目关联

从底层的视点来看,TS流仅仅一个188字节长的TS数据包序列。正如前文所说到的,能够有许多节目,每个节目都有多个ES流,但客户端每次只能观看一个节目。由于客户端有必要知道在接收到传输流时,哪些数据包被运用,哪些被舍弃。为此,有两种特别数据包:

  • 节目关联表(PAT,Program Association Table)

PAT数据包拥有特别PID 0,包内含有TS流中一切节意图节目映射表(PMT)的PID信息。

  • 节目映射表(PMT,Program Map Table)

PMT代表单一节目,并包括节目一切ES流的PID。

2022容器格式全面指南

  1. 检查PID为0的TS数据包,内部包括PAT信息。

  2. 在PAT中找到播映器应播映节意图PMT-PID(此处为200)。

  3. 运用相关PMT-PID(其间包括PMT,此处为PID 200)获取TS数据包。

  4. PMT包括一切媒体轨道的PID,它们是播映节意图一部分。

接收TS流的客户端首先会读取接收到的第一个PAT数据包,然后依据用户挑选确认出现的节目。

客户端会从PAT中取得所选节目PMT(其供给了节目ES流和它们的PID)。现在客户端只需过滤这些PID(每个PID代表所选节意图一个独自ES)并运用它们——即解复用、解码然后出现给用户。

OTT详细方面和总结

上文的介绍首要面向广电范畴。但是,OTT范畴需求另做考虑。OTT客户端的网络连接不稳定,网络带宽只够按需加载用户要观看的内容(而不能加载悉数节目)。

鉴于客户端只能一次出现一个节目,而同一TS流中有多个节目,将它们悉数加载将会浪费带宽,而这些带宽能够取得更好地运用,比方质量自适应。

所以关于OTT,咱们不会在一个TS流中包括多个节目。出于相似的考虑,关于多路音频内容的封装,各路音频应封装到各自的TS流中(而不是多路音频ES流封装到一路TS流)。

MPEG-TS 仍然广泛用于OTT,尤其是面向Apple生态体系时。

MPEG-TS的一个缺陷是:与fMP4相比,它的封装冗余度更高(由于数据包较小和一切的数据包标头)。www.slideshare.net/bitmovin/bi…

MPEG-TS是面向传输的格局,它考虑了对有损传输场景的处理,不适合与依据HTTP的媒体分发方法相结合,由于HTTP现已在网络栈上保证了传输可靠性。

调试和检查MPEG-TS

www.digitalekabeltelevisie.nl/dvb\_inspec…

thumb.co.il/(GUI/Web, 开源)

dvbsnoop.sourceforge.net/(CLI, 开源)

github.com/tsduck/tsdu…, 开源)

08

Matroska(Webm)容器格局

Matroska是一种自由和敞开规范的容器格局,依据EBML(可扩展二进制元言语,Extensible Binary Meta Language,根本上是XML的二进制形式)。得益于此,规范很简单进行扩展。它简直能够支撑任何编解格局。

WebM

WebM是依据Matroska的容器格局。谷歌主导了其间的开发作业,使它成为代替MP4和MPEG2-TS的开源计划。一起,WebM也支撑谷歌的开源编解码器:如视频编解码器VP8和VP9,以及音频编解码器Opus和Vorbis。WebM也能够与DASH一起运用——在Web上传输VP9和Opus。

调试Matroska/Webm

mkvinfo是调试和检查Matroska或许WebM文件内容的最佳东西:

mkvtoolnix.download/

十分感谢我们阅览本篇文章,想要了解有关容器格局和处理的更多信息,请加入咱们的每月Demo和技能问答:

go.bitmovin.com/bitmovin-te…

09

容器格局资源

  • Video Player Datasheet:bitmovin.com/video-playe…

  • Video Encoding Datasheet:bitmovin.com/video-encod…

  • Video Analytics Datasheet:bitmovin.com/bitmovin-an…

  • AV1 Datasheet:bitmovin.com/av1-datashe…

称谢:

本文已取得作者Armin Trattnig授权翻译和发布,特此感谢。

原文链接:

bitmovin.com/container-f…


2022容器格式全面指南