封裝格式:在觀看已經下載好的視頻的時候,經常會看到一些視頻文件後綴,如.mp4,.flv,.avi,.mkv等等,這些擴展名就可以簡單理解爲視頻的封裝格式或者視頻的容器格式。
封裝:所謂視頻的封裝,就是將已經編碼好的音頻,視頻,還可能有字幕,腳本之類的文件按照一定的規範放到一起,形成一個封裝格式的文件(封裝和編碼是兩個不同的概念,封裝是在“視頻流水線”上,編碼以後的一個過程,一個容器可以封裝多種編碼格式的文件,但是隻支持特定的編碼格式)。封裝格式有很多,比如flv,mp4,ts,avi ,mkv等等。
幾種常見的封裝格式:
1.TS封裝格式
TS流最早應用於數字電視領域,視頻格式主要是mpeg2。後來,蘋果公司發明HLS協議也是基於TS文件的。hls流媒體視頻編碼的主要格式爲h264/mpeg4,音頻爲aac/mp3。
TS文件分爲三層:ts層(如下圖)pes(Packet Elemental Stream)層,es層(Elementary Stream)。
es層就是音視頻數據,pes層是在音視頻數據上加了時間戳等對數據幀的說明信息,ts層是在pes層上加入了數據流識別和傳輸的必要信息。
由上圖可以看出,ts流是由一個個固定大小的包組成的,每個packet大小固定188個字節。
在這裏說一下TS流的生產,就不再畫深一層的結構圖了,深一層結構圖自行腦補:
TS流的形成過程:
- 將原始音視頻數據壓縮之後,壓縮結果組成一個基本碼流(ES)。
- 對ES(基本碼流)進行打包形成PES。
- 在PES包中加入時間戳信息(PTS/DTS)。
- 將PES包內容分配到一系列固定長度的傳輸包(TS Packet)中。
- 在傳輸包中加入定時信息(PCR)。
- 在傳輸包中加入節目專用信息(PSI) 。
- 連續輸出傳輸包形成具有恆定比特率的MPEG-TS流。
2.MP4封裝格式
MP4,全稱MPEG-4 Part 14,是一種使用MPEG-4的多媒體電腦檔案格式,其基本存儲結構是box,box可以理解爲數據對象塊,所有數據都必須保存在box中,而且必須包含一個File Type box(ftpy),作爲MP4格式的標誌幷包含關於文件的一些信息。以下是MP4文件的結構樹:
ftpy:通常放在文件的開始,作爲MP4格式的標誌包含關於文件的一些信息
moov:它是一種container box,子box包含了媒體的metadata信息
mdat:包含MP4文件的媒體數據
free:“free”中的內容是無關緊要的,可以被忽略。該box被刪除後,不會對播放產生任何影響,只能是size+type,這樣組成8個字節的頭數據
mvhd:一般作爲“moov”的第一個子box出現,相當於整個moov box的“header”
概念:
track表示一些sample的集合,對於媒體數據來說,track表示一個視頻或音頻序列。
hint track這個特殊的track並不包含媒體數據,而是包含了一些將其他數據track打包成流媒體的指示信息。
sample對於非hint track來說,video sample即爲一幀視頻,或一組連續視頻幀,audio sample即爲一段連續的壓縮音頻,它們統稱sample。對於hint track,sample定義一個或多個流媒體包的格式。
sample table指明sampe時序和物理佈局的表。
chunk一個track的幾個sample組成的單元。
MP4文件結構:
1、 文件,由很多Box和FullBox組成。
2、 Box,每一個Box由Header和Data組成。
3、 FullBox,是Box的擴展,Box結構的基礎上在Header中添加8bits version和24bits flags。
4、 Header,包括了整個Box的長度size和類型type。當size==0時,代表這是文件裏最後一個Box;當size==1時,意味着Box長度須要很多其它bits來描寫敘述,在後面會定義一個64bits的largesize描寫敘述Box的長度;當type是uuid時,代表Box中的數據是用戶自己定義擴展類型。
5、 Data,是Box的實際數據,可以是純數據也可以是很多其它的子Boxes。
6、 當一個Box的Data中是一系列子Box時,這個Box又可成爲Container Box。
鏈接:https://www.jianshu.com/p/bc06344a91ce