視訊檔案頭解析--MP4-綜述
MP4 檔案格式
綜述
關鍵概念
MP4 檔案格式中,所有的內容存在一個稱為movie 的容器中。一個movie 可以由多個tracks 組成。每個track 就是一個隨時間變化的媒體序列,例如,視訊幀序列。track 裡的每個時間單位是一個sample,它可以是一幀視訊,或者音訊。sample 按照時間順序排列。注意,一幀音訊可以分解成多個音訊sample,所以音訊一般用sample 作為單位,而不用幀。MP4 檔案格式的定義裡面,用sample 這個單詞表示一個時間幀或者資料單元。每個track 會有一個或者多個sample descriptions。track 裡面的每個sample
這個檔案的物理格式沒有限定媒體本身的格式。例如,許多檔案格式將媒體資料分成幀,頭部或者其他資料緊緊跟隨每一幀視訊,!!!TODO(例如MPEG2)。而MP4 檔案格式不是如此。檔案的物理格式和媒體資料的排列都不受媒體的時間順序的限制。視訊幀不需要在檔案按時間順序排列。這就意味著如果檔案中真的存在這樣的一些幀,那麼就有一些檔案結構來描述媒體的排列和對應的時間資訊。
MP4 檔案中所有的資料都封裝在一些box 中(以前叫atom)。所有的metadata(媒體描述元資料),包括定義媒體的排列和時間資訊的資料都包含在這樣的一些結構box 中。MP4 檔案格式定義了這些這些box 的格式。Metadata 對媒體資料(例如,視訊幀)引用說明。媒體資料可以包含在同一個的一個或多個box 裡,也可以在其他檔案中,metadata 允許使用URLs 來引用其他的檔案,而媒體資料在這些引用檔案中的排列關係全部在第一個主檔案中的metadata 描述。其他的檔案不一定是MP4 檔案格式,例如,可能就沒有一個box。
有很多種類的track,其中有三個最重要,video track
媒體檔案的物理結構
Box 定義瞭如何在sample table 中找到媒體資料的排列。這包括data reference(資料引用), the sample size table, the sample to chunk table, and the chunkoffset 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。合理的選擇這個數目,就可以實現準確的計時。一般來說,對於audiotrack,就是audio 的sampling rate。對於video track,情況稍微複雜,需要合理選擇。例如,如果一個media TimeScale是30000,media sample durations 是1001,就準確的定義了NTSC video 的時間格式(雖然不準確,但一般就是29.97),and provide 19.9 hours of time in 32bits.
Track 的時間結構受一個edit list 影響,有兩個用途:全部電影中的一個track 的一部分時間片斷變化(有可能是重用);空白時間的插入,也就是空的edits。特別注意的是如果一個track不是從節目開頭部分開始,edit list 的第一個edit 就一定是空的edit。每個track的全部duration 定義在檔案頭部,這就是對track 的總結,每個sample 有一個規定的duration。一個sample 的準確描述時間,也就是他的時間戳(time-stamp)就是以前的sample 的duration 之和。
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)。