天天看點

嵌入式 H264—MP4格式及在MP4檔案中提取H264的SPS、PPS及碼流

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—MP4格式及在MP4檔案中提取H264的SPS、PPS及碼流
嵌入式 H264—MP4格式及在MP4檔案中提取H264的SPS、PPS及碼流
嵌入式 H264—MP4格式及在MP4檔案中提取H264的SPS、PPS及碼流
嵌入式 H264—MP4格式及在MP4檔案中提取H264的SPS、PPS及碼流

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

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

嵌入式 H264—MP4格式及在MP4檔案中提取H264的SPS、PPS及碼流

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

嵌入式 H264—MP4格式及在MP4檔案中提取H264的SPS、PPS及碼流

如下圖所示,紅色為BOX TYPE

嵌入式 H264—MP4格式及在MP4檔案中提取H264的SPS、PPS及碼流

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結構定義為  

嵌入式 H264—MP4格式及在MP4檔案中提取H264的SPS、PPS及碼流

4  【執行個體分析】 資料如上avcC圖所示,現在對資料進行詳細分析

嵌入式 H264—MP4格式及在MP4檔案中提取H264的SPS、PPS及碼流

是以,提取的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 |

嵌入式 H264—MP4格式及在MP4檔案中提取H264的SPS、PPS及碼流

特别的,當值為7和8分别為SPS和PPS。

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

嵌入式 H264—MP4格式及在MP4檔案中提取H264的SPS、PPS及碼流

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寫死時會比較麻煩一點。