1 - 計算電影長度
方法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
2 - 計算電影影象寬度和高度
從tkhd – track header atom中找到寬度和高度即是
3 - 計算電影聲音取樣頻率
從tkhd – track header atom中找出audio track的time scale即是聲音的取樣頻率。
首先計算出整部電影的duration,和幀的數目然後
幀率 = 整部電影的duration / 幀的數目
5 - 計算電影的位元率
整部電影的尺寸除以長度,即是位元率,此電影的位元率為846623/70 = 12094 bps
6 - 查詢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的大小。
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的大小,然後加上偏移量即可得到實際位置。
7 - 查詢關鍵幀
查詢過程與查詢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的大小
8 - random access
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在檔案中的位置。
獲取mp4檔案資訊
計算電影長度 方法1從mvhd movie header atom中找到time scale和duration,duration除以time scale即是整部電影的長度。time scale相當於定義了標準的1秒在這部電影裡面的刻度是多少。例如audio track的time scale 8000...
MP4檔案格式的解析,以及MP4檔案的分割演算法
應用中,更是費盡了心思,主要問題是處理mp4檔案龐大的 頭 當然,畢竟mp4才是h.264最佳的儲存格式嘛。這篇文章先簡單介紹一下mp4檔案的大體結構,以及它的分割演算法,之後再寫文章介紹如何把mp4完美應用在點播專案中。一 mp4格式分析 mp4或mpeg 4 part 2 編碼的音訊。mp4格式...
MP4檔案格式的解析,以及MP4檔案的分割演算法
這幾天整理並重構了一下mp4檔案的解析程式,融合了分解與合併的程式,以前是c語言寫的,應用在linux上執行的伺服器程式上,現在改成c 方便我在其他專案中使用它,至於用不用移植乙份c 的,暫時用不到,等有必要了再說吧。這篇文章先簡單介紹一下mp4檔案的大體結構,以及它的分割演算法,之後再寫文章介紹如...