2022容器格式全面指南

語言: CN / TW / HK

圖片

▲掃描圖中二維碼瞭解音視訊技術大會更多資訊▲

作者: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:

http://bitmovin.com/container-formats-fun-1/


本文是一篇介紹2022年容器格式的全面指南,由Bitmovin公司中一些世界級的視訊工程師和專家創作。

我們創作這篇指南的目的是希望你能全面瞭解關於容器格式的所有知識:從最基本的技術術語到深入探究不同的容器格式。

你可以從頭開始閱讀本篇文章,也可以跳到自己感興趣的章節閱讀。

讓我們開始吧!

在正式開始之前,讓我們先來了解一些技術術語。

編解碼器(Codec)用於儲存二進位制格式的媒體訊號,大部分編解碼器都會以一種有損的方式壓縮原始媒體訊號。

最常見的媒體訊號有視訊、音訊和字幕。電影包括不同的媒體訊號,大部分電影除了視訊外,還有音訊和字幕。

常見的視訊編解碼器有:H.264、HEVC、VP9和AV1。音訊編解碼器有:AAC、MP3和Opus。

每種媒體訊號都可以使用多種不同的編解碼器。

圖片

編解碼器型別

單一媒體訊號通常被稱為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檔案)。

容器格式的另一個實際應用場景是網路流媒體傳輸領域。端到端處理媒體資料的實體就是容器。

在內容生產端,打包器會將多路編碼的媒體資料打包到容器中,然後在客戶端裝置的請求下通過網路進行傳輸。

然後容器被解複用,其中的內容被解碼並最終呈現給終端使用者。

圖片

線上媒體分發工作流程

04

播放器對容器格式的處理

提取元資料

在客戶端,播放器需要從容器中提取基礎的媒體資訊。比如,切片播放時間、時長資訊和編碼格式等。

除此之外,大部分瀏覽器通常不會直接提取和處理容器中的元資料。

這就要求播放器實現能夠妥善處理元資料。

比如CEA-608/708字幕、帶內事件(fMP4的emsg box)等,播放器需要分析媒體容器格式中的相關資料,跟蹤時間線並在正確的時間點進一步處理資料(比如在正確時間顯示正確字幕)。

圖片

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的繼任者。

圖片

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對二進位制編碼資料做引用/索引。

圖片

Fragmented MP4 (fMP4)

圖片

使用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 (http://mediaarea.net/en/MediaInfo/Download)

ffprobe(ffmpeg工具集的一部分)(http://ffbinaries.com/downloads)

這些工具並不會向你展示(f)MP4檔案的box結構[2]。你可以使用下面這些工具進行展示:

[2]審校者注:此處為原文技術疏漏,mediainfo可以展示box結構,例如,命令列執行mediainfo可通過新增--Details=1引數來實現。

Boxdumper (http://github.com/l-smash/l-smash)

IsoViewer (http://github.com/sannies/isoviewer)

MP4Box.js (http://download.tsi.telecom-paristech.fr/gpac/mp4box.js/filereader.html)

Mp4dump (http://www.bento4.com/)

圖片

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)傳輸媒體檔案,這樣就可以降低實時流媒體場景中的延遲。

圖片

在傳統的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流相關聯。

圖片

封裝多個ES流

一條ES流既可以表示音訊內容,也可以表示視訊內容。拿視訊ES流來說,我們通常還會有至少一路音訊ES流。這些相關的ES會被封裝進同一個TS流,其中不同的ES及其資料包有單獨的PID。

圖片

封裝多個節目

MPEG-TS具有節目(Program)的概念。節目是集合在一起的一組相關ES流,如視訊和相對應的音訊。單一TS流可以傳輸多個節目,且每個節目都是一個不同的電視訊道。

圖片

節目關聯

從底層的角度來看,TS流只是一個188位元組長的TS資料包序列。正如前文所提到的,可以有許多節目,每個節目都有多個ES流,但客戶端每次只能觀看一個節目。因為客戶端必須知道在接收到傳輸流時,哪些資料包被使用,哪些被捨棄。為此,有兩種特殊資料包:

  • 節目關聯表(PAT,Program Association Table)

PAT資料包擁有特殊PID 0,包內含有TS流中所有節目的節目對映表(PMT)的PID資訊。

  • 節目對映表(PMT,Program Map Table)

PMT代表單一節目,幷包含節目所有ES流的PID。

圖片

  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相比,它的封裝冗餘度更高(由於資料包較小和所有的資料包標頭)。http://www.slideshare.net/bitmovin/bitmovin-segmentlength-50056628/11

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://github.com/tsduck/tsduck(CLI, 開源)

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檔案內容的最佳工具:

http://mkvtoolnix.download/

非常感謝大家閱讀本篇文章,想要了解有關容器格式和處理的更多資訊,請加入我們的每月Demo和技術問答:

http://go.bitmovin.com/bitmovin-techtalk

09

容器格式資源

  • Video Player Datasheet:http://bitmovin.com/video-player-datasheet/

  • Video Encoding Datasheet:http://bitmovin.com/video-encoding-data-sheet/

  • Video Analytics Datasheet:http://bitmovin.com/bitmovin-analytics-datasheet/

  • AV1 Datasheet: http://bitmovin.com/av1-datasheet/

致謝:

本文已獲得作者Armin Trattnig授權翻譯和釋出,特此感謝。

原文連結:

http://bitmovin.com/container-formats-fun-1/


圖片