mp4文件格式系列

 

Overview and Introduction

Core Concepts

MP4文件格式中,所有的內容存在一個稱爲movie的容器中。一個movie可以由多個tracks組成。每個track就是一個隨時間變化的媒體序列,例如,視頻幀序列。track裏的每個時間單位是一個sample,它可以是一幀視頻,或者音頻。sample按照時間順序排列。注意,一幀音頻可以分解成多個音頻sample,所以音頻一般用sample作爲單位,而不用幀。MP4文件格式的定義裏面,用sample這個單詞表示一個時間幀或者數據單元。每個track會有一個或者多個sample descriptionstrack裏面的每個sample通過引用關聯到一個sample description。這個sample descriptions定義了怎樣解碼這個sample,例如使用的壓縮算法。

與其他的多媒體文件格式不同的是,MP4文件格式經常使用幾個不同的概念,理解其不同是理解這個文件格式的關鍵。

這個文件的物理格式沒有限定媒體本身的格式。例如,許多文件格式將媒體數據分成幀,頭部或者其他數據緊緊跟隨每一幀視頻,!!!TODO(例如MPEG2)。而MP4文件格式不是如此。

文件的物理格式和媒體數據的排列都不受媒體的時間順序的限制。視頻幀不需要在文件按時間順序排列。這就意味着如果文件中真的存在這樣的一些幀,那麼就有一些文件結構來描述媒體的排列和對應的時間信息。

MP4文件中所有的數據都封裝在一些box(以前叫atom)。所有的metadata(媒體描述元數據),包括定義媒體的排列和時間信息的數據都包含在這樣的一些結構box中。MP4文件格式定義了這些這些box的格式。Metadata對媒體數據(例如,視頻幀)引用說明。媒體數據可以包含在同一個的一個或多個box裏,也可以在其他文件中,metadata允許使用URLs來引用其他的文件,而媒體數據在這些引用文件中的排列關係全部在第一個主文件中的metadata描述。其他的文件不一定是MP4文件格式,例如,可能就沒有一個box

有很多種類的track,其中有三個最重要,video track包含了視頻sampleaudio track包含了audio samplehint track稍有不同,它描述了一個流媒體服務器如何把文件中的媒體數據組成符合流媒體協議的數據包。 如果文件只是本地播放,可以忽略hint track,他們只與流媒體有關係。

Physical structure of the media

Box定義瞭如何在sample table中找到媒體數據的排列。這包括data reference(數據引用), the sample size table, the sample to chunk table, and the chunk offset table. 這些表就可以找到track中每個sample在文件中的位置和大小。

data reference允許在第二個媒體文件中找到媒體的位置。這樣,一部電影就可以由一個媒體數據庫中的多個不同文件組成,而且不用把它們全部拷貝到另一個新文件中。例如,對視頻編輯就很有幫助。

爲了節約空間,這些表都很緊湊。另外,interleave不是sample by sample,而是把單個track的幾個samples組合到一起,然後另外幾個sample又進行新的組合,等等。一個track的連續幾個sample組成的單元就被稱爲chunk。每個chunk在文件中有一個偏移量,這個偏移量是從文件開頭算起的,在這個chunk內,sample是連續存儲的。

這樣,如果一個chunk包含兩個sample,第二個sample的位置就是chunk的偏移量加上第一個sample的大小。chunk offset table說明了每個chunk的偏移量,sample to chunk table說明了sample序號和chunk序號的映射關係。

注意chunk之間可能會有死區,沒有任何媒體數據引用到這部分區域,但是chunk內部不會有這樣的死區。這樣,如果在節目編輯的時候,不需要一些媒體數據,就可以簡單的留在那裏,而不用引用,這樣就不用刪除它們了。類似的,如果媒體存放在第二個文件中,但是格式不同於MP4文件格式,這個陌生文件的頭部或者其他文件格式都可以簡單忽略掉。

Temporal structure of the media

文件中的時間可以理解爲一些結構。電影以及每個track都有一個timescale。它定義了一個時間軸來說明每秒鐘有多少個ticks。合理的選擇這個數目,就可以實現準確的計時。一般來說,對於audio track,就是audiosampling rate。對於video track,情況稍微複雜,需要合理選擇。例如,如果一個media TimeScale30000media sample durations1001,就準確的定義了NTSC video的時間格式(雖然不準確,但一般就是29.97),and provide 19.9 hours of time in 32 bits.

Track的時間結構受一個edit list影響,有兩個用途:全部電影中的一個track的一部分時間片斷變化(有可能是重用);空白時間的插入,也就是空的edits。特別注意的是如果一個track不是從節目開頭部分開始,edit list的第一個edit就一定是空的edit

每個track的全部duration定義在文件頭部,這就是對track的總結,每個sample有一個規定的duration。一個sample的準確描述時間,也就是他的時間戳(time-stamp)就是以前的sampleduration之和。

Interleave

文件的時間和物理結構可以是對齊的,這表明媒體數據在容器中的物理順序就是時間順序。另外,如果多個track的媒體數據包含在同一個文件中,這個媒體數據可以是interleaved。一般來說,爲了方便讀取一個track的媒體數據,同時保證每個表緊湊,以一個合適的時間間隔(例如1秒)做一次interleave,而不是sample by sample。這樣就可以減少chunk的數據,減小chunk offset table的大小。

Composition

如果多個audio track包含在同一個文件中,他們有可能被混合在一起進行播放,並且由一個總track volume和左/balance控制。

類似的,video track也可以根據各自的層次序列號(從後向前)和合成模式進行混合。另外,每個track可以用一個matrix進行變換,也可以全部電影用一個matrix進行變換。這樣既可以進行簡單操作(例如放大圖像,校正90º 旋轉),也可以做更復雜的操作(例如shearing, arbitrary rotation)。

這個混合方法只是非常簡單,是一個缺省的方法,MPEG4的另一份文檔會定義更強有力的方法(例如MPEG-4 BIFS)。

 

Darwin Streaming Server裏面有一些很好的工具,可以幫助分析mp4文件格式。

但是如果可以自己逐字節的parse文件,可以更好的瞭解mp4文件格式。這裏我就逐字節的分析文件結構。文件例子是DSS裏面包含的sample_100kbit.mp4

 

 

 

 

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