mp4 文件格式系列





























































































































































不同。sample-to-chunk atom存儲sample與chunk的映射關係。
Sample-to-chunk atoms的類型是'stsc'。它也有一個表來映射sample和trunk之間的關係,查看這張表,就可以找到包含指定sample的trunk,從而找到這個sample。
 
字段      長度(字節)  描述
尺寸         4         這個atom的字節數 類型         4         stsc
版本         1         這個atom的版本 標誌         3         這裏爲0
條目數目     4         sample-to-chunk的數目 sample-to-chunk          sample-to-chunk表的結構
First chunk    4         這個table使用的第一個chunk序號 Samples per chunk   4    當前trunk內的sample數目
Sample description ID  4   與這些sample關聯的sample description的序號  
mp4文件格式系列25(續) - Sample-to-Chunk Atoms - STSC
First chunk    Samples per chunk   Sample description ID 1            4                 1 4            3                 1 5            4                 1 8            3                 1 9            4                 1 …           …                …  
這個表類似於行程編碼,第一個first chunk減去第二個first chunk就是一共有多少個trunk包含相同的sample數目,這樣通過不斷的疊加,就可以得到一共有280個trunk,每個trunk包含多少個sample,以及每個trunk對應的description。 
mp4文件格式系列26 - Sample Size Atoms - STSZ
sample size atoms定義了每個sample的大小,它的類型是'stsz',包含了媒體中全部sample









的數目和一張給出每個sample大小的表。這樣,媒體數據自身就可以沒有邊框的限制。
 
字段    長度(字節) 描述
尺寸        4     這個atom的字節數 類型        4     stsz
版本        1     這個atom的版本 標誌        3     這裏爲0
Sample size  4     全部sample的數目。如果所有的sample有相同的長度,這個字段就是
這個值。否則,這個字段的值就是0。那些長度存在sample size表中
條目數目    4     sample size的數目
sample size         sample size表的結構。這個表根據sample number索引,第一項就是第
一個sample,第二項就是第二個sample
大小        4     每個sample的大小  
mp4文件格式系列27 - Chunk Offset Atoms - STCO
Chunk offset atoms 定義了每個trunk在媒體流中的位置,它的類型是'stco'。位置有兩種可能,32位的和64位的,後者對非常大的電影很有用。在一個表中只會有一種可能,這個位置是在整個文件中的,而不是在任何atom中的,這樣做就可以直接在文件中找到媒體數據,而不用解釋atom。需要注意的是一旦前面的atom有了任何改變,這張表都要重新建立,因爲位置信息已經改變了。









 
字段      長度(字節)    描述
尺寸           4       這個atom的字節數 類型           4       stco
版本           1       這個atom的版本 標誌           3       這裏爲0
條目數目       4       chunk offset的數目
chunk offset            字節偏移量從文件開始到當前chunk。這個表根據chunk number
索引,第一項就是第一個trunk,第二項就是第二個trunk
大小          4        每個sample的大小  
[mp4文件格式]獲取mp4文件信息1 - 計算電影長度wqyuwss 
方法1: 從mvhd - movie header atom中找到time scale和duration,duration除以time scale即是整部電影的長度。time scale相當於定義了標準的1秒在這部電影裏面的刻度是多少。 例如audio track的time scale = 8000, duration = 560128,所以總長度是70.016,video track的time scale = 600, duration = 42000,所以總長度是70
方法2 :首先計算出共有多少個幀,也就是sample(從sample size atoms中得到),然後 整部電影的duration = 每個幀的duration之和(從Time-to-sample atoms中得出)
例如audio track共有547個sample,每個sample的長度是1024,則總duration是560128,電影長度是70.016;video track共有1050個sample,每個sample的長度是40,則總duration是42000,電影長度是70 
mp4文件格式]獲取mp4文件信息3 - 計算電影聲音採樣頻率wqyuwss 
從tkhd – track header atom中找出audio track的time scale即是聲音的採樣頻率。 
[mp4文件格式]獲取mp4文件信息2 - 計算電影圖像寬度和









高度wqyuwss 
從tkhd – track header atom中找到寬度和高度即是。 
[mp4文件格式]獲取mp4文件信息4 - 計算視頻幀率wqyuwss 
首先計算出整部電影的duration,和幀的數目然後  幀率 = 整部電影的duration / 幀的數目 
[mp4文件格式]獲取mp4文件信息5 - 計算電影的比特率wqyuwss
整部電影的尺寸除以長度,即是比特率,此電影的比特率爲846623/70 = 12094 bps 
[mp4文件格式]獲取mp4文件信息6 - 查找samplewqyuwss 
當播放一部電影或者一個track的時候,對應的media handler必須能夠正確的解析數據流,對一定的時間獲取對應的媒體數據。如果是視頻媒體, media handler可能會解析多個atom,才能找到給定時間的sample的大小和位置。具體步驟如下: 1.確定時間,相對於媒體時間座標系統
2.檢查time-to-sample atom來確定給定時間的sample序號。 3.檢查sample-to-chunk atom來發現對應該sample的chunk。 4.從chunk offset atom中提取該trunk的偏移量。
5.利用sample size atom找到sample在trunk內的偏移量和sample的大小。 例如,如果要找第1秒的視頻數據,過程如下: 1.  第1秒的視頻數據相對於此電影的時間爲600 2.  檢查time-to-sample atom,得出每個sample的duration是40,從而得出需要尋找第600/40 = 15 + 1 = 16個sample 3.  檢查sample-to-chunk atom,得到該sample屬於第5個chunk的第一個sample,該chunk共有4個sample
4.  檢查chunk offset atom找到第5個trunk的偏移量是20472
5.  由於第16個sample是第5個trunk的第一個sample,所以不用檢查sample size atom,trunk的偏移量即是該sample的偏移量20472。如果是這個trunk的第二個sample,則從sample size atom中找到該trunk的前一個sample的大小,然後加上偏移量即可得到實際位置。 6.  得到位置後,即可取出相應數據進行解碼,播放 
[mp4文件格式]獲取mp4文件信息7 - 查找關鍵幀wqyuwss 
查找過程與查找sample的過程非常類似,只是需要利用sync sample atom來確定key frame的sample序號
確定給定時間的sample序號 
檢查sync sample atom來發現這個sample序號之後的key frame 









檢查sample-to-chunk atom來發現對應該sample的chunk  從chunk offset atom中提取該trunk的偏移量 
利用sample size atom找到sample在trunk內的偏移量和sample的大小 
[mp4文件格式]獲取mp4文件信息8 - Random accesswqyuwss 
Seeking主要是利用sample table box裏面包含的子box來實現的,還需要考慮edit list的影響。
可以按照以下步驟seek某一個track到某個時間T,注意這個T是以movie header box裏定義的time scale爲單位的:
如果track有一個edit list,遍歷所有的edit,找到T落在哪個edit裏面。將Edit的開始時間變換爲以movie time scale爲單位,得到EST,T減去EST,得到T',就是在這個edit裏面的duration,注意此時T'是以movie的time scale爲單位的。然後將T'轉化成track媒體的time scale,得到T''。T''與Edit的開始時間相加得到以track媒體的time scale爲單位的時間點T'''。  這個track的time-to-sample表說明了該track中每個sample對應的時間信息,利用這個表就可以得到T'''對應的sample NT。 
sample NT可能不是一個random access point,這樣就需要其他表的幫助來找到最近的random access point。一個表是sync sample表,定義哪些sample是random access point。使用這個表就可以找到指定時間點最近的sync sample。如果沒有這個表,就說明所有的sample都是synchronization points,問題就變得更容易了。另一個shadow sync box可以幫助內容作者定義一些特殊的samples,它們不用在網絡中傳輸,但是可以作爲額外的random access point。這就改進了random access,同時不會影響正常的傳輸比特率。這個表指出了非random access point和random access point之間的關係。如果要尋找指定sample之前最近的shadow sync sample,就需要查詢這個表。總之,利用sync sample和shadow sync表,就可以seek到NT之前的最近的access point sample Nap。 
找到用於access point的sample Nap之後,利用sample-to-chunk表來確定sample位於哪個chunk內。 
找到chunk後,使用chunk offset找到這個chunk的開始位置。 
使用sample-to-chunk表和sample size表中的數據,找到Nap在此chunk內的位置,再加上此chunk的開始位置,就找到了Nap在文件中的位置。 

發佈了7 篇原創文章 · 獲贊 23 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章