1. 程式人生 > >解析MP4檔案中的sps和pps

解析MP4檔案中的sps和pps

一、MP4格式基本概念

MP4格式對應標準MPEG-4標準(ISO/IEC14496)

二、MP4封裝格式核心概念

1  MP4封裝格式對應標準為 ISO/IEC 14496-12(資訊科技 視聽物件編碼的第12部分: ISO 基本媒體檔案格式/Information technology Coding of audio-visual objects Part 12: ISO base media file format)

2  MP4封裝格式是基於QuickTime容器格式定義,媒體描述與媒體資料分開,目前被廣泛應用於封裝h.264視訊和ACC音訊,是高清視訊/HDV的代表。

 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。

5 幾個名詞 

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 例項樣本

來源於Android MediaRecoder視訊錄製,平臺為華為T8300和TCL968,

EsEYE檢視如下

2 box結構圖

接下來對h264編碼中有用的幾個進行闡述,其它不再描述。

3 ftypfile type box

如下圖所示,開始的四位元組00 00 00 00 18表示該boxsize24位元組(含頭),然後66 74 79 70ftypBOX TYPE,其它是一些格式相容等相關資訊。

4  mdat

如下圖所示,BOX YPE為6D 64 61 74 ,緊接著的00 00 09 39表示sliece長度

5 avcC

如下圖所示,紅色為BOX TYPE

四、MP4檔案中h264 SPSPPS獲取

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圖所示,現在對資料進行詳細分析

所以,提取的SPSPPS分別為67 42 00 1E A6 81 41 F968 CE 38 80

五、MP4檔案中的H264 data /NALU slice

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

1位元組

如下3

通過mdat定位

③  H264基本碼流結構分兩層:視訊編碼層VCL和網路適配層NAL,這樣使訊號處理和網路傳輸分離

VCL

負責高效視訊內容表示

NAL

以網路所要求的恰當方式對資料進行打包和傳送

3  【定義】 NALU header

+---------------+

|0|1|2|3|4|5|6|7|

+-+-+-+-+-+-+-+-+

|F|NRI| Type |

+---------------+

特別的,當值為78分別為SPSPPS

畢書(下載)(P191)上的定義為:

4  【例項分析】資料分析,資料如上圖mdat所示

6D 64 61 74

mdat   BOX TYPE

00 00   09 39

silce長度,2361

接下來的65就是NALU header,可以由65&0x1F來求的後五個bit,從而得知此sliceI frame

注意mdatsilce之間有可能存在若干佔位符,我在TCL手機測試時就出現了連續的00的佔位符,這樣後面用H264硬編碼時會比較麻煩一點。

Ref/Related

1 相關資料和工具在文中連結下載