免费高清特黄a大片,九一h片在线免费看,a免费国产一级特黄aa大,国产精品国产主播在线观看,成人精品一区久久久久,一级特黄aa大片,俄罗斯无遮挡一级毛片

分享

MP4文件格式的解析,以及MP4文件的分割算法

 guitarhua 2013-11-20
127人閱讀 評論(0) 收藏 舉報(bào)
mp4應(yīng)該算是一種比較復(fù)雜的媒體格式了,起源于QuickTime。以前研究的時(shí)候就花了一番的功夫,尤其是如何把它完美的融入到視頻點(diǎn)播應(yīng)用中,更是費(fèi)盡了心思,主要問題是處理mp4文件龐大的“媒體頭”。當(dāng)然,流媒體點(diǎn)播也可以采用flv格式來做,flv也可以封裝H.264視頻數(shù)據(jù)的,不過Adobe卻不推薦這么做,人家說畢竟mp4才是H.264最佳的存儲格式嘛。

   這幾天整理并重構(gòu)了一下mp4文件的解析程序,融合了分解與合并的程序,以前是c語言寫的,應(yīng)用在linux上運(yùn)行的服務(wù)器程序上,現(xiàn)在改成c++,方 便我在其他項(xiàng)目中使用它,至于用不用移植一份c#的,暫時(shí)用不到,等有必要了再說吧。這篇文章先簡單介紹一下mp4文件的大體結(jié)構(gòu),以及它的分割算法,之 后再寫文章介紹如何把mp4完美應(yīng)用在點(diǎn)播項(xiàng)目中。

 

一、MP4格式分析                  

  MP4(MPEG-4 Part 14)是一種常見的多媒體容器格式,它是在“ISO/IEC 14496-14”標(biāo)準(zhǔn)文件中定義的,屬于MPEG-4的一部分,是“ISO/IEC 14496-12(MPEG-4 Part 12 ISO base media file format)”標(biāo)準(zhǔn)中所定義的媒體格式的一種實(shí)現(xiàn),后者定義了一種通用的媒體文件結(jié)構(gòu)標(biāo)準(zhǔn)。MP4是一種描述較為全面的容器格式,被認(rèn)為可以在其中嵌入 任何形式的數(shù)據(jù),各種編碼的視頻、音頻等都不在話下,不過我們常見的大部分的MP4文件存放的AVC(H.264)MPEG-4(Part 2)編碼的視頻和AAC編碼的音頻。MP4格式的官方文件后綴名是“.mp4”,還有其他的以mp4為基礎(chǔ)進(jìn)行的擴(kuò)展或者是縮水版本的格式,包括:M4V,  3GP, F4V等。

  mp4是由一個(gè)個(gè)“box”組成的,大box中存放小box,一級嵌套一級來存放媒體信息。box的基本結(jié)構(gòu)是:

  

  其中,size指明了整個(gè)box所占用的大小,包括header部分。如果box很大(例如存放具體視頻數(shù)據(jù)的mdat box),超過了uint32的最大數(shù)值,size就被設(shè)置為1,并用接下來的8位uint64來存放大小。

  一個(gè)mp4文件有可能包含非常多的box,在很大程度上增加了解析的復(fù)雜性,這個(gè)網(wǎng)頁上http:///atoms.html記錄了一些當(dāng)前注冊過的box類型。看到這么多box,如果要全部支持,一個(gè)個(gè)解析,怕是頭都要爆了。還好,大部分mp4文件沒有那么多的box類型,下圖就是一個(gè)簡化了的,常見的mp4文件結(jié)構(gòu):

  

  一般來說,解析媒體文件,最關(guān)心的部分是視頻文件的寬高、時(shí)長、碼率、編碼格式、幀列表、關(guān)鍵幀列表,以及所對應(yīng)的時(shí)戳和在文件中的位置,這些 信息,在mp4中,是以特定的算法分開存放在stbl box下屬的幾個(gè)box中的,需要解析stbl下面所有的box,來還原媒體信息。下表是對于以上幾個(gè)重要的box存放信息的說明:

  看吧,要獲取到mp4文件的幀列表,還挺不容易的,需要一層層解析,然后綜合stts stsc stsz stss stco等這幾個(gè)box的信息,才能還原出幀列表,每一幀的時(shí)戳和偏移量。而且,你要照顧可能出現(xiàn)或者可能不出現(xiàn)的那些box。。??梢钥吹某鰜恚琺p4 把幀sample進(jìn)行了分組,也就是chunk,需要間接的通過chunk來描述幀,這樣做的理由是可以壓縮存儲空間,縮小媒體信息所占用的文件大小。這 里面,stsc box的解析相對來說比較復(fù)雜,它用了一種巧妙的方式來說明sample和chunk的映射關(guān)系,特別介紹一下。

  這是stsc box的結(jié)構(gòu),前幾項(xiàng)的意義就不解釋了,可以看到stsc box里每個(gè)entry結(jié)構(gòu)體都存有三項(xiàng)數(shù)據(jù),它們的意思是:“從first_chunk這個(gè)chunk序號開始,每個(gè)chunk都有samples_per_chunk個(gè)數(shù)的sample,而且每個(gè)sample都可以通過sample_description_index這個(gè)索引,在stsd box中找到描述信息”。也就是說,每個(gè)entry結(jié)構(gòu)體描述的是一組chunk,它們有相同的特點(diǎn),那就是每個(gè)chunk包含samples_per_chunk個(gè)sample,好,那你要問,這組相同特點(diǎn)的chunk有多少個(gè)?請通過下一個(gè)entry結(jié)構(gòu)體來推算,用下一個(gè)entry的first_chunk減去本次的first_chunk,就得到了這組chunk的個(gè)數(shù)。最后一個(gè)entry結(jié)構(gòu)體則表明從該first_chunk到最后一個(gè)chunk,每個(gè)chunk都有sampls_per_chunk個(gè)sample。很拗口吧,不過,就是這個(gè)意思:)。由于這種算法無法得知文件所有chunk的個(gè)數(shù),所以你必須借助于stco或co64。直接上代碼可能會清楚些:

  1. 首先直接分析entry

  2. 然后,通過stco或co64獲知chunk總個(gè)數(shù)之后,開始還原映射表

  讀出stsc之后,就可以綜合stbl下的所有box,推算出視頻和音頻幀列表,時(shí)戳和偏移量等數(shù)據(jù)。下面截圖展示獲取到的關(guān)鍵幀列表:

     

  有了關(guān)鍵幀列表之后,就可以繼續(xù)我們一下個(gè)題目,就是mp4文件的分割。實(shí)現(xiàn)mp4的分割,是把mp4應(yīng)用到點(diǎn)播系統(tǒng)中最關(guān)鍵的技術(shù)環(huán)節(jié),做不到這個(gè),就無法實(shí)現(xiàn)點(diǎn)播播放mp4影片的“拖動”。

  

二、MP4文件的分割算法

  所謂“分割”,就是把大文件切成小文件,要實(shí)現(xiàn)mp4的分割,

  •   首先,需要獲取到關(guān)鍵幀列表
  •   然后,選擇要分割的時(shí)間段(比如從關(guān)鍵幀開始)
  •   接著,重新生成moov box(注意所有相關(guān)的box 以及 box size都需要改變)
  •   最后,拷貝對應(yīng)的數(shù)據(jù),生成新文件

  第一點(diǎn),上面已經(jīng)介紹了,第二點(diǎn),只需要遍歷關(guān)鍵幀列表,就能找到離你想要分割的時(shí)間段最接近的關(guān)鍵幀,第四點(diǎn)就是“copy-paste”的 工作,關(guān)鍵在于第三點(diǎn)。因?yàn)檫@一步涉及到stbl下的所有box,必須重新生成entrys,同樣的,其他的box都還好,只需要保留關(guān)鍵幀所對應(yīng)的 sample和chunk,其余的刪掉即可,只是stsc box的比較麻煩,說起來比較啰嗦,還是直接看代碼吧:

  修改完box之后,需要重新生成moov box,由于moov box的大小以及時(shí)長等信息都發(fā)生了改變,所以需要box的大小做相應(yīng)的修改,這點(diǎn)千萬不能忘記,否則播放器會解析錯(cuò)誤。重新生成box之后,還要計(jì)算一 下分割后的數(shù)據(jù)的長度,由于數(shù)據(jù)長度也發(fā)生了改變,所以修改mdat box的大小的同時(shí),要同時(shí)修改stbl下所有box的chunk offset,切記!

  以下是整個(gè)的邏輯過程:

  好了,所有這些都實(shí)現(xiàn)之后,就具備了做mp4點(diǎn)播系統(tǒng)的條件了。不過,要做mp4點(diǎn)播,還有一些其他的問題需要解決,我將在下一篇文章中介紹。

更多 0

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多