一 、MP4 https://blog.csdn.net/sdsszk/article/details/90719075
MP4 由很多個ATOM 嵌套構成,主要的ATOM包括 【ftyp】 【moov】【mdat】
ftyp在第一個, moov 和mdat順序不固定,moov保存着視頻播放的索引,
在線播放,moov必須在前面
部分攝像設備 moov-free-mdat
Atom結構:
1. ftype moov 和 mdat
ftype:
作用:確定文件的類型
MOOV
moov中主要保存了媒體的時間信息、trak信息和媒體索引等。
MDAT
所有媒體數據統一存放在mdat中
3. moov 結構
3.1 mvhd 時間長度
(1/1000)*70080 秒
3.2 track 視頻索引
3.2.1 track->tkhd
3.2.2 moov-trak-mdia-hdlr track 類型 包括’vide’, ‘soun’和’hint’三種。
3.2.3 track 時間
moov-track-media-mdhd :
moov-trak-mdia-minf-stbl-stts中有媒體幀之間的時間間隔,單位是moov-trak-tkhd中的時間粒度。
3.2.4
moov-trak-mdia-minf-stbl比較重要,其中保存了解碼器需要的信息和索引信息,以下Atom都是stbl Atom的孩子。
stsd中保存了解碼器需要的媒體描述信息。
stss 標識媒體流中的關鍵幀
stts 數據幀之間的間隔
stco 每個數據Chunk在文件中的偏移
stsc給出各個數據Chunk中包含的數據幀。一個chunk可能會包含一個或者幾個幀。每個chunk會有不同的size,每個chunk中的幀也會有不同的size。
stsz 樣本大小
4 實際應用場景
1、把文件尾部的moov移到文件頭
對於流媒體播放,如果mdat的位置在moov之前,通過流的方式播放文件會出現問題,因為沒有辦法在一開始就獲得文件的媒體信息和索引。
這種情況需要對視頻做預處理,把moov移動到文件頭。通過遍歷Atom可以很容易找到moov Atom。
需要注意的是,移動moov到文件頭,同時需要修改moov中的stco/co64。因為這里保存了chunk數據的偏移量,移動moov后,需要根據moov的新位置更新stco/co64 。
2、分割MP4文件
在視頻點播服務中,需要將MP4文件分割為多個分片,此時需要獲取關鍵幀、切割時間軸、更新moov和生成各個分片文件。
可參考 http://www.cnblogs.com/haibindev/archive/2011/10/17/2214518.html