mp4 檔案格式系列

2021-06-29 13:44:45 字數 4968 閱讀 2889

不同。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中找到寬度和高度即是。 

首先計算出整部電影的duration,和幀的數目然後  幀率 = 整部電影的duration / 幀的數目 

[mp4檔案格式]獲取mp4檔案資訊5 - 計算電影的位元率wqyuwss

整部電影的尺寸除以長度,即是位元率,此電影的位元率為846623/70 = 12094 bps 

[mp4檔案格式]獲取mp4檔案資訊6 - 查詢samplewqyuwss 

2.檢查time-to-sample atom來確定給定時間的sample序號。 3.檢查sample-to-chunk atom來發現對應該sample的chunk。 4.從chunk offset atom中提取該trunk的偏移量。

4.  檢查chunk offset atom找到第5個trunk的偏移量是20472

[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在檔案中的位置。 

MP4檔案格式詳解

一 基本概念 1 檔案,由許多box和fullbox組成。2 box,每個box由header和data組成。3 fullbox,是box的擴充套件,box結構的基礎上在header中增加8bits version和24bits flags。4 header,包含了整個box的長度size和型別ty...

mp4檔案格式解析

想真正了解mp4檔案格式的話,有乙個開源工具專案可以學習 mp4 explorer。一方面,這個工具可以按mpeg 4標準去解析mp4檔案,直觀上幫助大家去看mp4檔案的格式。另一方面,認真學習其 就可以了解mp4檔案是如何被訪問和訪問的,對致力於底層研究的同學是個福音。其官網 本文介紹的一種mp4...

mp4檔案格式解析(四)

5 free space box free 或skip free 中的內容是無關緊要的,可以被忽略。該 box6 meida data box mdat 該box包含於檔案層,可以有多個,也可以沒有 當 資料全部為外部檔案引用時 用來儲存 資料。資料直接跟在box type欄位後面,具體資料結構的意...