MP4格式分析二

4.2.2.3.1 Media Information Header Boxvmhdsmhdhmhdnmhd

Video Media Header Boxvmhd 

字段

字節數

意義

box size

4

box大小

box type

4

box類型

version

1

box版本,0或1,一般爲0。(以下字節數均按version=0)

flags

3

 

graphics mode

4

視頻合成模式,爲0時拷貝原始圖像,否則與opcolor進行合成

opcolor

2×3

{red,green,blue}

 

 

Sound Media Header Boxsmhd 

字段

字節數

意義

box size

4

box大小

box type

4

box類型

version

1

box版本,0或1,一般爲0。(以下字節數均按version=0)

flags

3

 

balance

2

立體聲平衡,[8.8] 格式值,一般爲0,-1.0表示全部左聲道,1.0表示全部右聲道

reserved

2

 

 

Hint Media Header Box(hmhd)

    略

Null Media Header Box(nmhd)

    非視音頻媒體使用該box,略。

4.2.2.3.2 Data Information Boxdinf

    “dinf”解釋如何定位媒體信息,是一個container box。“dinf”一般包含一個“dref”,即data reference box;“dref”下會包含若干個“url”或“urn”,這些box組成一個表,用來定位track數據。簡單的說,track可以被分成若干段,每一段都可以根據“url”或“urn”指向的地址來獲取數據,sample描述中會用這些片段的序號將這些片段組成一個完整的track。一般情況下,當數據被完全包含在文件中時,“url”或“urn”中的定位字符串是空的。

    “dref”的字節結構如下表。 

字段

字節數

意義

box size

4

box大小

box type

4

box類型

version

1

box版本,0或1,一般爲0。(以下字節數均按version=0)

flags

3

 

entry count

4

“url”或“urn”表的元素個數

“url”或“urn”列表

不定

 

 

    “url”或“urn”都是box,“url”的內容爲字符串(location string),“urn”的內容爲一對字符串(name string and location string)。當“url”或“urn”的box flag1時,字符串均爲空。

    下面是一個“dinf”的字節實例圖。其中黃色爲“dinf”的box header,由紅色部分我們知道包含的“url”或“urn”個數爲1,紅色後面爲“urlbox的內容。紫色爲“url”的box header(根據box type我們知道是個“url”),綠色爲box flag,值爲1,說明“url”中的字符串爲空,表示track數據已包含在文件中。

mp4文件格式解析(三)

4.2.2.3.3 Sample Table Boxstbl

    “stbl”幾乎是普通的MP4文件中最複雜的一個box了,首先需要回憶一下sample的概念。sample是媒體數據存儲的單位,存儲在mediachunk中,chunksample的長度均可互不相同,如下圖所示。

mp4文件格式解析(三)

    “stbl”包含了關於track中sample所有時間和位置的信息,以及sample的編解碼等信息。利用這個表,可以解釋sample的時序、類型、大小以及在各自存儲容器中的位置。“stbl”是一個container box,其子box包括:sample description box(stsd)、time to sample box(stts)、sample size box(stsz或stz2)、sample to chunk box(stsc)、chunk offset box(stco或co64)、composition time to sample box(ctts)、sync sample box(stss)等。

    “stsd”必不可少,且至少包含一個條目,該box包含了data reference box進行sample數據檢索的信息。沒有“stsd”就無法計算media sample的存儲位置。“stsd”包含了編碼的信息,其存儲的信息隨媒體類型不同而不同。

Sample Description Box(stsd)

    box header和version字段後會有一個entry count字段,根據entry的個數,每個entry會有type信息,如“vide”、“sund”等,根據type不同sample description會提供不同的信息,例如對於video track,會有“VisualSampleEntry”類型信息,對於audio track會有“AudioSampleEntry”類型信息。

    視頻的編碼類型、寬高、長度,音頻的聲道、採樣等信息都會出現在這個box中。

Time To Sample Box(stts)

    “stts”存儲了sample的duration,描述了sample時序的映射方法,我們通過它可以找到任何時間的sample。“stts”可以包含一個壓縮的表來映射時間和sample序號,用其他的表來提供每個sample的長度和指針。表中每個條目提供了在同一個時間偏移量裏面連續的sample序號,以及samples的偏移量。遞增這些偏移量,就可以建立一個完整的time to sample表。

Sample Size Box(stsz)

    “stsz” 定義了每個sample的大小,包含了媒體中全部sample的數目和一張給出每個sample大小的表。這個box相對來說體積是比較大的。

Sample To Chunk Box(stsc)

    用chunk組織sample可以方便優化數據獲取,一個thunk包含一個或多個sample。“stsc”中用一個表描述了sample與chunk的映射關係,查看這張表就可以找到包含指定sample的thunk,從而找到這個sample。

Sync Sample Box(stss)

    “stss”確定media中的關鍵幀。對於壓縮媒體數據,關鍵幀是一系列壓縮序列的開始幀,其解壓縮時不依賴以前的幀,而後續幀的解壓縮將依賴於這個關鍵幀。“stss”可以非常緊湊的標記媒體內的隨機存取點,它包含一個sample序號表,表內的每一項嚴格按照sample的序號排列,說明了媒體中的哪一個sample是關鍵幀。如果此表不存在,說明每一個sample都是一個關鍵幀,是一個隨機存取點。

Chunk Offset Box(stco)

    “stco”定義了每個thunk在媒體流中的位置。位置有兩種可能,32位的和64位的,後者對非常大的電影很有用。在一個表中只會有一種可能,這個位置是在整個文件中的,而不是在任何box中的,這樣做就可以直接在文件中找到媒體數據,而不用解釋box。需要注意的是一旦前面的box有了任何改變,這張表都要重新建立,因爲位置信息已經改變了。

5Free Space Boxfreeskip

    “free”中的內容是無關緊要的,可以被忽略。該box被刪除後,不會對播放產生任何影響。

6Meida Data Boxmdat

    該box包含於文件層,可以有多個,也可以沒有(當媒體數據全部爲外部文件引用時),用來存儲媒體數據。數據直接跟在box type字段後面,具體數據結構的意義需要參考metadata(主要在sample table中描述)。

 

    普通MP4文件的結構就講完了,可能會比較亂,下面這張圖是常見的box的樹結構圖,可以用來大致瞭解MP4文件的構造。

mp4文件格式解析(四)

   

 

    這篇文章主要面向一些對MP4文件結構沒有太多瞭解的初學者,算是篇比較初級的文章,本人也是參考了一些資料寫出來的,對於MP4文件中涉及的一些概念沒有太深入的瞭解,因此其中應該是有一些錯誤理解,希望大家抱着批判的眼光讀這篇文章。如果有錯誤的地方,還請大家不吝賜教。該文主要參考了標準和網友wqyuwssblog系列文章:mp4文件格

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