應用中,更是費盡了心思,主要問題是處理mp4檔案龐大的「**頭」。當然,
畢竟mp4才是h.264最佳的儲存格式嘛。
這篇文章先簡單介紹一下mp4檔案的大體結構,以及它的分割演算法,之後再寫文章介紹如何把mp4完美應用在點播專案中。
一、mp4格式分析
mp4或mpeg-4(part 2)編碼的音訊。mp4格式的官方檔案字尾名是「.mp4」,還有其他的以mp4為基礎進行的擴充套件或者是縮水版本的格式,包括:m4v,
3gp,
f4v等。
mp4是由乙個個「box」組成的,大box中存放小box,一級巢狀一級來存放**資訊。box的基本結構是:
乙個mp4檔案有可能包含非常多的box,在很大程度上增加了解析的複雜性,這個網頁上記錄了一些當前註冊過的box型別。看到這麼多box,如果要全部支援,乙個個解析,怕是頭都要爆了。還好,大部分mp4檔案沒有那麼多的box型別,下圖就是乙個簡化了的,常見的mp4檔案結構:
看吧,要獲取到mp4檔案的幀列表,還挺不容易的,需要一層層解析,然後綜合stts stsc stsz stss stco等這幾個box的資訊,才能還原出幀列表,每一幀的時戳和偏移量。而且,你要照顧可能出現或者可能不出現的那些box。。。可以看的出來,mp4把幀sample進行了分組,也就是chunk,需要間接的通過chunk來描述幀,這樣做的理由是可以壓縮儲存空間,縮小**資訊所占用的檔案大小。這裡面,stsc box的解析相對來說比較複雜,它用了一種巧妙的方式來說明sample和chunk的對映關係,特別介紹一下。
這是stsc box的結構,前幾項的意義就不解釋了,可以看到stsc box裡每個entry結構體都存有三項資料,它們的意思是:「從first_chunk這個chunk序號開始,每個chunk都有samples_per_chunk個數的sample,而且每個sample都可以通過sample_description_index這個索引,在stsd box中找到描述資訊」。也就是說,每個entry結構體描述的是一組chunk,它們有相同的特點,那就是每個chunk包含samples_per_chunk個sample,好,那你要問,這組相同特點的chunk有多少個?請通過下乙個entry結構體來推算,用下乙個entry的first_chunk減去本次的first_chunk,就得到了這組chunk的個數。最後乙個entry結構體則表明從該first_chunk到最後乙個chunk,每個chunk都有sampls_per_chunk個sample。很拗口吧,不過,就是這個意思:)。由於這種演算法無法得知檔案所有chunk的個數,所以你必須借助於stco或co64。直接上**可能會清楚些:
1. 首先直接分析entry
2. 然後,通過stco或co64獲知chunk總個數之後,開始還原對映表
二、mp4檔案的分割演算法
所謂「分割」,就是把大檔案切成小檔案,要實現mp4的分割,
第一點,上面已經介紹了,第二點,只需要遍歷關鍵幀列表,就能找到離你想要分割的時間段最接近的關鍵幀,第四點就是「copy-paste」的工作,關鍵在於第三點。因為這一步涉及到stbl下的所有box,必須重新生成entrys,同樣的,其他的box都還好,只需要保留關鍵幀所對應的sample和chunk,其餘的刪掉即可,只是stsc box的比較麻煩,說起來比較囉嗦,還是直接看**吧:
以下是整個的邏輯過程:
好了,所有這些都實現之後,就具備了做mp4點播系統的條件了。不過,要做mp4點播,還有一些其他的問題需要解決。
MP4檔案格式的解析,以及MP4檔案的分割演算法
這幾天整理並重構了一下mp4檔案的解析程式,融合了分解與合併的程式,以前是c語言寫的,應用在linux上執行的伺服器程式上,現在改成c 方便我在其他專案中使用它,至於用不用移植乙份c 的,暫時用不到,等有必要了再說吧。這篇文章先簡單介紹一下mp4檔案的大體結構,以及它的分割演算法,之後再寫文章介紹如...
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欄位後面,具體資料結構的意...