MP4格式及在MP4文件中提取H264的SPS、PPS及码流
一、MP4格式基本概念
MP4格式對(duì)應(yīng)標(biāo)準(zhǔn)MPEG-4標(biāo)準(zhǔn)(ISO/IEC14496)
?
二、MP4封裝格式核心概念
1? MP4封裝格式對(duì)應(yīng)標(biāo)準(zhǔn)為 ISO/IEC 14496-12(信息技術(shù) 視聽對(duì)象編碼的第12部分: ISO 基本媒體文件格式/Information technology Coding of audio-visual objects Part 12: ISO base media file format)
附-- 標(biāo)準(zhǔn)免費(fèi)下載: Freely Available Standards??? http://standards.iso.org/ittf/PubliclyAvailableStandards/index.html
?
2? MP4封裝格式是基于QuickTime容器格式定義,媒體描述與媒體數(shù)據(jù)分開,目前被廣泛應(yīng)用于封裝h.264視頻和ACC音頻,是高清視頻/HDV的代表。
?
3? MP4文件中所有數(shù)據(jù)都封裝在box中(對(duì)應(yīng)QuickTime中的atom),即MP4文件是由若干個(gè)box組成,每個(gè)box有長(zhǎng)度和類型,每個(gè)box中還可以包含另外的子box(稱container box)。
一個(gè)MP4文件首先會(huì)有且只有一個(gè)“ftyp”類型的box,作為MP4格式的標(biāo)志并包含關(guān)于文件的一些信息;之后會(huì)有且只有一個(gè)“moov”類型的box(Movie Box),它是一種container box,子box包含了媒體的metadata信息;MP4文件的媒體數(shù)據(jù)包含在“mdat”類型的box(Midia Data Box)中,該類型的box也是container box,可以有多個(gè),也可以沒有(當(dāng)媒體數(shù)據(jù)全部引用其他文件時(shí)),媒體數(shù)據(jù)的結(jié)構(gòu)由metadata進(jìn)行描述。
?
4? MP4中box存儲(chǔ)方式為大端模式。一般,標(biāo)準(zhǔn)的box開頭會(huì)有四個(gè)字節(jié)的box size。
?
5?幾個(gè)名詞?
| track | 表示一些sample的集合,對(duì)于媒體數(shù)據(jù)來(lái)說(shuō),track表示一個(gè)視頻或音頻序列。 |
| hint track | 特殊的track,并不包含媒體數(shù)據(jù),包含的是一些將其他數(shù)據(jù)track打包成流媒體的指示信息。 |
| sample | 對(duì)于非hint ? track來(lái)說(shuō),video sample即為一幀視頻,或一組連續(xù)視頻幀,audio sample即為一段連續(xù)的壓縮音頻,它們統(tǒng)稱sample。 對(duì)于hint ? track,sample定義一個(gè)或多個(gè)流媒體包的格式。 |
| sample table | 指明sampe時(shí)序和物理布局的表。 |
| chunk | 一個(gè)track的幾個(gè)sample組成的單元。 |
?
三、MP4封裝格式結(jié)構(gòu)圖
1 實(shí)例樣本
來(lái)源于Android MediaRecoder視頻錄制,平臺(tái)為華為T8300和TCL968,用mp4info查看如下:
用EsEYE查看如下:
用winhex分析如下:
?
2 box結(jié)構(gòu)圖
接下來(lái)對(duì)h264編碼中有用的幾個(gè)進(jìn)行闡述,其它不再描述。
3 ftyp(file type box)
如下圖所示,開始的四字節(jié)00 00 00 00 18表示該box的size為24字節(jié)(含頭),然后66 74 79 70是ftyp的BOX TYPE,其它是一些格式兼容等相關(guān)信息。
4? mdat
如下圖所示,BOX YPE為6D 64 61 74 ,緊接著的00 00 09 39表示sliece長(zhǎng)度
5 avcC
如下圖所示,紅色為BOX TYPE
?
四、MP4文件中h264的 SPS、PPS獲取
1? 【參考依據(jù)】ISO/IEC 14496-15 (下載)
2? 【綜述】在H264中,SPS和PPS存在于NALU header中,而在MP4文件中,SPS和PPS存在于AVCDecoderConfigurationRecord, 首先要定位avcC.
3? 【定義】
①參數(shù)集:一組很少改變的,為大量VCL NALU 提供解碼信息的數(shù)據(jù)。
?? 序列參數(shù)集SPS作用于一系列連續(xù)的編碼圖像,而圖像參數(shù)集PPS作用于編碼視頻序列中一個(gè)或多個(gè)獨(dú)立的圖像。
?? 如果解碼器沒能正確接收到這兩個(gè)參數(shù)集,那么其他NALU 也是無(wú)法解碼的。因此它們一般在發(fā)送其它 NALU 之前發(fā)送,并且使用不同的信道或者更加可靠的傳輸協(xié)議(如TCP)進(jìn)行傳輸,也可以重復(fù)傳輸。
②關(guān)于AVCDecoderConfigurationRecord結(jié)構(gòu)定義為
4? 【實(shí)例分析】 數(shù)據(jù)如上avcC圖所示,現(xiàn)在對(duì)數(shù)據(jù)進(jìn)行詳細(xì)分析
所以,提取的SPS和PPS分別為67 42 00 1E A6 81 41 F9和68 CE 38 80
?
五、MP4文件中的H264 data /NALU slice
1? 【參考】H264官方文檔(下載) + 畢書—新一代視頻壓縮編碼標(biāo)準(zhǔn)(下載)
2? 【綜述】
① 在MP4格式文件中,H264 slice并不是以00 00 00 01來(lái)作分割,而是存儲(chǔ)在mdat box中。
② ?H264基本碼流由一些列的NALU組成。原始的NALU單元組成:[start code] + [NALU header] + [NALU payload]
?
| start ? code | 1字節(jié) | 00 00 01 或 00 00 00 01 | 需要添加的 |
| NALU header | 1字節(jié) | 如下3 | 通過mdat定位 |
?
③ ?H264基本碼流結(jié)構(gòu)分兩層:視頻編碼層VCL和網(wǎng)絡(luò)適配層NAL,這樣使信號(hào)處理和網(wǎng)路傳輸分離
?
| VCL | 負(fù)責(zé)高效視頻內(nèi)容表示 |
| NAL | 以網(wǎng)絡(luò)所要求的恰當(dāng)方式對(duì)數(shù)據(jù)進(jìn)行打包和發(fā)送 |
?
3? 【定義】 NALU header
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
特別的,當(dāng)值為7和8分別為SPS和PPS。
畢書(下載)(P191)上的定義為:
?
4? 【實(shí)例分析】數(shù)據(jù)分析,數(shù)據(jù)如上圖mdat所示
| 6D 64 61 74 | mdat ? BOX TYPE |
| 00 00 ? 09 39 | silce長(zhǎng)度,2361 |
?
接下來(lái)的65就是NALU header,可以由65&0x1F來(lái)求的后五個(gè)bit,從而得知此slice為I frame
注意,mdat與silce之間有可能存在若干占位符,我在TCL手機(jī)測(cè)試時(shí)就出現(xiàn)了連續(xù)的00的占位符,這樣后面用H264硬編碼時(shí)會(huì)比較麻煩一點(diǎn)。
?
Ref/Related
1 相關(guān)資料和工具在文中鏈接下載
2 http://www.52rd.com/Blog/wqyuwss/559/4/
3 http://blog.csdn.net/szu030606/article/details/5943279
4 http://blog.csdn.net/k1988/article/details/5654631
5 http://www.cppblog.com/czanyou/archive/2008/11/26/67940.html
6 http://krdai.info/blog/sps-pps-in-mp4-format.html
7 http://www.cnitblog.com/zouzheng/archive/2007/04/04/25155.html
8 http://bbs.chinavideo.org/viewthread.php?tid=10273
?
作者:skyseraph
出處:http://www.cnblogs.com/skyseraph/
更多精彩請(qǐng)直接訪問SkySeraph個(gè)人站點(diǎn):http://skyseraph.com//
Email/GTalk: zgzhaobo@gmail.com
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
總結(jié)
以上是生活随笔為你收集整理的MP4格式及在MP4文件中提取H264的SPS、PPS及码流的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab并联lc谐振电路图,串联谐振
- 下一篇: TensorRT8——ONNX转trt