MP4格式對應标準MPEG-4标準(ISO/IEC14496)
1 MP4封裝格式對應标準為 ISO/IEC 14496-12(資訊技術 視聽對象編碼的第12部分: ISO 基本媒體檔案格式/Information technology Coding of audio-visual objects Part 12: ISO base media file format)
附-- 标準免費下載下傳: Freely Available Standards http://standards.iso.org/ittf/PubliclyAvailableStandards/index.html
2 MP4封裝格式是基于QuickTime容器格式定義,媒體描述與媒體資料分開,目前被廣泛應用于封裝h.264視訊和ACC音頻,是高清視訊/HDV的代表。
3 MP4檔案中所有資料都封裝在box中(對應QuickTime中的atom),即MP4檔案是由若幹個box組成,每個box有長度和類型,每個box中還可以包含另外的子box(稱container box)。
一個MP4檔案首先會有且隻有一個“ftyp”類型的box,作為MP4格式的标志并包含關于檔案的一些資訊;之後會有且隻有一個“moov”類型的box(Movie Box),它是一種container box,子box包含了媒體的metadata資訊;MP4檔案的媒體資料包含在“mdat”類型的box(Midia Data Box)中,該類型的box也是container box,可以有多個,也可以沒有(當媒體資料全部引用其他檔案時),媒體資料的結構由metadata進行描述。
4 MP4中box存儲方式為大端模式。一般,标準的box開頭會有四個位元組的box size。
track
表示一些sample的集合,對于媒體資料來說,track表示一個視訊或音頻序列。
hint track
特殊的track,并不包含媒體資料,包含的是一些将其他資料track打包成流媒體的訓示資訊。
sample
對于非hint track來說,video sample即為一幀視訊,或一組連續視訊幀,audio sample即為一段連續的壓縮音頻,它們統稱sample。
對于hint track,sample定義一個或多個流媒體包的格式。
sample table
指明sampe時序和實體布局的表。
chunk
一個track的幾個sample組成的單元。
來源于Android MediaRecoder視訊錄制,平台為華為T8300和TCL968,用mp4info檢視如下:

接下來對h264編碼中有用的幾個進行闡述,其它不再描述。
如下圖所示,開始的四位元組00 00 00 00 18表示該box的size為24位元組(含頭),然後66 74 79 70是ftyp的BOX TYPE,其它是一些格式相容等相關資訊。
如下圖所示,BOX YPE為6D 64 61 74 ,緊接着的00 00 09 39表示sliece長度
如下圖所示,紅色為BOX TYPE
1 【參考依據】ISO/IEC 14496-15 (下載下傳)
2 【綜述】在H264中,SPS和PPS存在于NALU header中,而在MP4檔案中,SPS和PPS存在于AVCDecoderConfigurationRecord, 首先要定位avcC.
3 【定義】
①參數集:一組很少改變的,為大量VCL NALU 提供解碼資訊的資料。
序列參數集SPS作用于一系列連續的編碼圖像,而圖像參數集PPS作用于編碼視訊序列中一個或多個獨立的圖像。
如果解碼器沒能正确接收到這兩個參數集,那麼其他NALU 也是無法解碼的。是以它們一般在發送其它 NALU 之前發送,并且使用不同的信道或者更加可靠的傳輸協定(如TCP)進行傳輸,也可以重複傳輸。
②關于AVCDecoderConfigurationRecord結構定義為
4 【執行個體分析】 資料如上avcC圖所示,現在對資料進行詳細分析
是以,提取的SPS和PPS分别為67 42 00 1E A6 81 41 F9和68 CE 38 80
1 【參考】H264官方文檔(下載下傳) + 畢書—新一代視訊壓縮編碼标準(下載下傳)
2 【綜述】
① 在MP4格式檔案中,H264 slice并不是以00 00 00 01來作分割,而是存儲在mdat box中。
② H264基本碼流由一些列的NALU組成。原始的NALU單元組成:[start code] + [NALU header] + [NALU payload]
start code
1位元組
00 00 01 或 00 00 00 01
需要添加的
NALU header
如下3
通過mdat定位
③ H264基本碼流結構分兩層:視訊編碼層VCL和網絡适配層NAL,這樣使信号處理和網路傳輸分離
VCL
負責高效視訊内容表示
NAL
以網絡所要求的恰當方式對資料進行打包和發送
3 【定義】 NALU header
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
特别的,當值為7和8分别為SPS和PPS。
畢書(下載下傳)(P191)上的定義為:
4 【執行個體分析】資料分析,資料如上圖mdat所示
6D 64 61 74
mdat BOX TYPE
00 00 09 39
silce長度,2361
接下來的65就是NALU header,可以由65&0x1F來求的後五個bit,進而得知此slice為I frame
注意,mdat與silce之間有可能存在若幹占位符,我在TCL手機測試時就出現了連續的00的占位符,這樣後面用H264寫死時會比較麻煩一點。