音視頻封裝:MP4結構概述和分析工具推薦

問題背景:

前面已經講了好幾種封裝格式包括了TSFLVRTP等。現在用幾篇文章講解下MP4,這種封裝格式設計思路和前面都不太一樣,其應用範圍最廣、靈活性最高、跨平臺最好,兼容性最強。帶來的負面影響就是格式本身比較複雜,特別是在封裝和轉封裝方面代碼實現起來比較長。

這個系列會和前面講解思路一樣,本篇會講解下MP4的整體框架和結構,下篇會講解下MP4的詳細標準,同時用一個實例分析下對應字段含義以及H264打包方法,最後一篇文章講下MP4的應用,內容大致包含:

1. 計算電影圖像寬度和高度

2. 計算電影聲音採樣頻率

3. 計算視頻幀率

4. 計算電影的比特率

5. 查找sample方法

6. 查找關鍵幀和實現隨機拖動播放

7.如何完成MP4首屏秒開即前置moov box

你可以選擇你感興趣的篇章進行閱讀,歡迎後臺分享MP4在實際應用的案例分享,特別是關於H265方面的實踐。我後面還會分享下基於HLS協議的FFmpeg對H265的FMP4切片在平安校園方面的實踐。

 


 

MP4概念&術語:

概念:

MP4起源於QuickTime,全名是MPEG-4 Part 14,屬於MPEG-4的一部分。這部分內容主要規定了多媒體容器的格式。後來成爲”ISO/IEC 14996-14”國際標準, 其中MP4就是對這種標準的一種具體實現,基於這個標準進行擴展或者裁剪還產生了像M4V、F4V等封裝格式。

同時MP4目前在移動端的Androids和IOS可以播放,也可以在FlashPlayer播放,跨平臺和兼容性最好,MP4 還可以實現快進快放,邊下載邊播放的效果。


術語:

爲了後面能比較規範的瞭解這種文件格式,這裏需要了解下面幾個概念和術語,這些概念和術語是理解好MP4媒體封裝格式和其操作算法的關鍵。

Box:這個概念起源於QuickTime中的atom,也就是說MP4文件就是由一個個Box組成的,可以將其理解爲一個數據塊,它由Header+Data組成,Data 可以存儲媒體元數據和實際的音視頻碼流數據。Box裏面可以直接存儲數據塊但是也可以包含其它類型的Box,我們把這種Box又稱爲container box。

Sample:簡單理解爲採樣,對於視頻可以理解爲一幀數據,音頻一幀數據就是一段固定時間的音頻數據,可以由多個Sample數據組成,簡而言之:存儲媒體數據的單位是sample。

Track:表示一些sample的集合,對於媒體數據而言就是一個視頻序列或者音頻序列,我們常說的音頻軌和視頻軌可以對照到這個概念上。當然除了Video Track和Audio Track還可以有非媒體數據,比如Hint Track,這種類型的Track就不包含媒體數據,可以包含一些將其他數據打包成媒體數據的指示信息或者字幕信息。簡單來說:Track 就是電影中可以獨立操作的媒體單位。

Chunk:一個track的連續幾個sample組成的單元被稱爲chunk,每個chunk在文件中有一個偏移量,整個偏移量從文件頭算起,在這個chunk內,sample是連續存儲的。

這樣就可以理解爲MP4文件裏面有多個Track,一個Track又是由多個Chunk組成,每個Chunk裏面包含着一組連續的Sample.正是因爲定義了上述幾個概念,MP4這種封裝格式才容易實現靈活、高效、開放的特性,所以要仔細理解。 


 

MP4整體結構:

雖然Box的類型非常多,大概有70多種,但是並不是都是必須的,一般的MP4文件都是含有必須的Box和個別非必須Box,我用MP4info這種工具分析了一首MP4的文件,具體的Box顯示如下:

 

通過上述工具分析出來的結果,我們大概可以總結出MP4以下幾個特點:

1. MP4文件就是由一個個Box組成,其中Box還可以相互嵌套,排列緊湊沒有多的冗餘數據;

2. Box類型並沒有很多,主要是由必須的ftyb、mdat、moovz組成,還有free,udta非必須box組成即去掉這兩種box對於播放音視頻也沒有啥影響。

3. Moov一般存儲媒體元數據,比較複雜嵌套層次比較深,後面會詳細解釋各個box的字段含義和組成。

其中每個Box的結構如下:

其中在Box的Header頭部,size指定了這個Box所佔用的大小,包括了Header部分,一般的頭部大小就是8字節,但是如果Box很大,超過了uint32的最大數值,則size被置爲1,並用接下來的8字節uint64來表示該Box的大小,這樣頭部大小就變成16字節了。

正常情況Box不會太大,但是當box裏面承載的音視頻數據特別是I幀時,有可能Box會很大,除了mdat box,其它的Box都很小。

把上面分析的結果進行簡化,可以得到一個基本的MP4完整結構:

 

 

這裏各個Box承載的數據內容是什麼,下面表格先做個大致解釋,Box字段以及分析下篇文章做出說明:

下面再給出一張表格,顯示下標準中所有Box類型:

 

說明

我們只講帶星號的 box。其他的因爲不是必須 box,我們就選擇性的忽略了。不過,裏面帶星號的 Box 還是挺多的。因爲,我們的主要目的是爲了生成一個 MP4 文件。一個正常的 MP4 文件的結構並不是所有帶星號的 Box 都必須有。


 

MP4分析工具推薦:

1. mp4info

這個工具好處是帶界面的可視化工具,可以清晰看到各個box的組成和層次,同時可以分離裏面的音視頻文件,當然這個分離出的原始碼流不能直接播放。其次可以看到音視頻的時間戳等信息,這對於解決一些花屏和播放跳秒等問題排查有幫助。

2. Mp4Explorer

這個工具的官網是:http://mp4explorer.codeplex.com/比較前面Mp4info的好處是,這個工具可以對各個Box進行格式化,可以直接提取裏面的各個主要字段含義。其次源代碼也是開發的,可以研究和實現Mp4的解封裝。其次還支持對FMp4文件的分析,這點也是比較好的。

上面直接就看到了tkhd這種Box的各個字段含義,其中這個Box就表明了視頻Track的分辨率,時長等信息。

3. Ffmpeg和Mp4Box

這兩個工具是處理MP4文件的利器,包括合併,分割,解封裝,轉封裝封操作。凡是你能想到的對Mp4文件操作都可以用該工具處理,下載地址:https://gpac.wp.imt.fr/downloads/

 

4. Elcard StreamEye

這個工具比較強大,主要是爲了檢測MP4封裝的實際編碼內容,包括幀類型信息、流的信息等,還可以逐幀播放等,如果覺得封裝沒問題直接想查看裏面編碼層內容那就是分析利器,前面其它封裝格式也推薦過該工具。

 

5. Video Eye

這個工具也不錯,是雷神基於開源開發的,用起來比較好。我用這個工具可以播放一些在線視頻,對於開發一些基於HTTP的Mp4業務有一定的調試作用,當然功能比這個要強大的多。

 

其中我還進行了抓包,分析了下HTTP-MP4的交互過程,做過類似業務的同學可以交流下:

 

以上工具我都放在Git地址下面了:https://github.com/ty6815/AvStackDocs 大家可以隨意下載和使用。


總結:

這篇文章主要普及了MP4涉及的幾個關鍵概念,其次講解了主要結構和基本組成,最後給大家推薦了幾款分析MP4文件的工具,下篇主要講解下核心Box的字段含義。

 


今天就說這麼多,祝您工作順利!

如果有疑問,你可以在公衆號後臺發消息諮詢我。

 

 

 

 

 


往期文章回顧:

近期答讀者問

從人類的第一次直播聊聊視頻監控行業

音視頻壓縮:H264碼流層次結構和NALU詳解

音視頻傳輸:RTP協議詳解和H.264打包方案

音視頻封裝:FLV格式詳解和打包H264、AAC方案(下)

音視頻封裝:FLV格式詳解和打包H264、AAC方案(上)

音視頻常見問題分析和解決:延時和抖動

 


 

個人轉載內容至朋友圈和羣聊天,無需特別申請版權許可。

引用轉載該訂閱號文章,註明文章來源即可。

記得右下角點“在看”,還可以關注該訂閱號,防止遺漏推送哦


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章