Android視頻開發(fā)中如何進(jìn)行MP4文件的解析

本篇文章為大家展示了Android視頻開發(fā)中如何進(jìn)行MP4文件的解析,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

公司主營(yíng)業(yè)務(wù):網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出秀洲免費(fèi)做網(wǎng)站回饋大家。

我會(huì)主要介紹容器 (container format file) 格式文件的細(xì)節(jié),以最常見的 MP4 文件入手。然后會(huì)簡(jiǎn)短的介紹一個(gè)標(biāo)準(zhǔn)的播放器的啟動(dòng),解析,播放流程。本篇還是以基礎(chǔ)知識(shí)為主,雖然很枯燥,但是對(duì)視頻開發(fā)的學(xué)習(xí)有非常大的好處,我自己個(gè)人的感受就是,如果在很多專有名字,概念都不熟悉的情況下,想要去閱讀播放器源碼會(huì)是相當(dāng)困難的事情。比如 Exoplayer,谷歌的分包策略就是根據(jù)播放器的組件來分包。如果不熟悉播放器的基礎(chǔ)構(gòu)建的話,連哪個(gè)部分的代碼在哪個(gè)包都不知道。希望大家如果真的想進(jìn)階的話還是耐心的理解好每個(gè)基礎(chǔ)概念。

1. Mp4 格式文件的構(gòu)成

在上期我們大概介紹了 Mp4 文件的結(jié)構(gòu)

Android視頻開發(fā)中如何進(jìn)行MP4文件的解析  

但是這樣抽象的介紹可能還是比較難理解,我們深入一些。

 
1.1 MP4 到底是個(gè)啥?

通俗的說,MP4 其實(shí)是一種格式的規(guī)范,這個(gè)規(guī)范是被 ISO 機(jī)構(gòu)認(rèn)證的,也就是說,只要你通過 Codec 生成了一個(gè) mp4 文件,那么這個(gè)文件的格式必須是按照 ISO 機(jī)構(gòu)的規(guī)矩來。。。。既然是規(guī)范,那么我們看看到底 ISO 對(duì) mp4 做了什么規(guī)范:

請(qǐng)大家打開鏈接->ISO 的 mp4 文件規(guī)范 [1]

大家可能會(huì)有點(diǎn)懵逼,看不懂。其實(shí)這個(gè)規(guī)范很好理解,它定義了一個(gè) MP4 文件里面,哪些數(shù)據(jù)應(yīng)該放在什么位置 (以字節(jié)為單位),哪些數(shù)據(jù)的長(zhǎng)度是多少。我截取了一段:

Android視頻開發(fā)中如何進(jìn)行MP4文件的解析  

大家看,上面這一段規(guī)范定義了 ftyp這個(gè)頭文件 header 所在的位置和長(zhǎng)度 (以字節(jié)為單位)。至于這些頭文件是有什么用,我在上一篇文章大概提到過,他們屬于 meta data 的一部分。在本章我會(huì)更詳細(xì)的介紹。

所以說,任何容器,包括 mp4 都是類似的結(jié)構(gòu)化文件,只不過不同的格式文件 ISO 對(duì)其有嚴(yán)格的要求,數(shù)據(jù)的擺放順序,排列等等不同而已。有興趣的同學(xué)可以對(duì)比一下 rmvb,mp4,mkv 這些格式的要求有什么不同,優(yōu)劣勢(shì)各是什么。

 

2. Mp4 頭文件的構(gòu)成

關(guān)于 mp4 文件的頭文件格式(meta data),蘋果官網(wǎng)對(duì)其進(jìn)行了詳細(xì)的描述(這個(gè)介紹是基于 QuickTime 播放器支持的 mp4 文件來介紹的,quciktime 播放器對(duì) mp4 的要求有些許不同,但是差別不大,我們可以忽略):

Movie Atom[2]

我們不追究太多細(xì)節(jié),有興趣的同學(xué)可以自己查看,我們專注于一些基礎(chǔ)的信息。

首先,在 Meta Data 里面,每一個(gè) Header,頭文件,我們都叫他們 Atom Header(不知道咋翻譯)。Atom Header 分為 Leaf Atom 和 Container Atom。前者代表一個(gè)連接著字符串信息的頭文件,后者是一個(gè)包含了若干個(gè)子 Atom 的頭文件,他們互相之間是有層級(jí)關(guān)系的 (參考上圖)。每次播放器獲取了 movie atom 之后 (moov),會(huì)根據(jù)層級(jí)關(guān)系,向下,或者向下讀取相關(guān)的其他信息。每一個(gè)頭文件都會(huì)對(duì)它的子頭文件保存位置的引用,所以只要根據(jù) mp4 文件的規(guī)范獲取了最頂級(jí)的頭文件 moov,就可以順勢(shì)往下讀取其他頭文件了。

我們來看看 mp4 的頭文件結(jié)構(gòu)

Android視頻開發(fā)中如何進(jìn)行MP4文件的解析  

看起來很復(fù)雜,但是對(duì)于一個(gè)播放器來說,很多信息都不是必須。我們需要知道的最重要的信息是采樣索引表(Sample Table Atoms).對(duì)應(yīng)圖中“**stbl **”這個(gè) atom header。這個(gè)索引表保存了 mp4 文件所有的采樣 (sample) 與視頻時(shí)間的對(duì)應(yīng)關(guān)系 (一般以微秒為單位),還有包括每個(gè)采樣的大小,在 mp4 文件中的起始位置 (以自己為單位)。

 

3. 標(biāo)準(zhǔn)播放器的啟動(dòng)流程

那么既然我們已經(jīng)知道一個(gè)容器文件的格式規(guī)范了,播放器就可以通過解析容器的頭文件來控制播放 (playback) 了。

 
3.1 播放器

通常播放器由三個(gè)部分構(gòu)成

  1. 讀取器 (Extractor)
  2. 渲染器 (TrackRenderer)
  3. 加載控制器 (Load Controller)
  4. 數(shù)據(jù)源 (Source)

讀取器負(fù)責(zé)從 source 文件讀取數(shù)據(jù),加載控制器負(fù)責(zé)控制讀取數(shù)據(jù)的策略 (比如說在線視頻播放的時(shí)候緩沖策略),渲染器負(fù)責(zé)接收讀取器讀取的數(shù)據(jù),并渲染到屏幕上。

Android視頻開發(fā)中如何進(jìn)行MP4文件的解析  
 
3.2 播放器的播放過程

在播放器可以把數(shù)據(jù)提交給渲染器之前,播放器需要把必需的頭文件全部解析并存入內(nèi)存,比如之前說的采樣索引表。一般播放器在解析完畢后,會(huì)構(gòu)建三個(gè)個(gè)表,一個(gè)存放時(shí)間對(duì)應(yīng)采樣索引,一個(gè)存放采樣索引對(duì)應(yīng)在 mp4 文件中的起始位置 (以字節(jié)為單位),一個(gè)存放采樣索引對(duì)應(yīng)大小 (以字節(jié)為單位)。以下圖為例

假設(shè)播放器需要從第 1 微秒開始播放,那么需要把第 1 微秒的數(shù)據(jù)放入渲染器。所以會(huì)查找下面這三個(gè)表。

Android視頻開發(fā)中如何進(jìn)行MP4文件的解析  

通過表 1,我們知道該微秒對(duì)應(yīng)第 1 個(gè)采樣(sample),從第一個(gè)和第二個(gè)表我們知道,第 1 個(gè)采樣的數(shù)據(jù)范圍 (在 mp4 文件內(nèi)) 是從第 0 字節(jié)到 300(0+300)字節(jié),那么播放器就會(huì)去讀取這個(gè)范圍的數(shù)據(jù)并且放入渲染器中進(jìn)行渲染。

同時(shí),加載器會(huì)基于當(dāng)前已經(jīng)緩存的數(shù)據(jù),決定是否還需要不停的讀取數(shù)據(jù)進(jìn)入內(nèi)存。一般來說每個(gè)播放器都有默認(rèn)的緩存值,也會(huì)有一個(gè)基準(zhǔn)線,只有當(dāng)緩存足夠數(shù)據(jù)才能放進(jìn)渲染器進(jìn)行渲染。

最后同理,當(dāng)我們拖動(dòng)滑動(dòng)控制器 (SeekBar) 想快進(jìn)的時(shí)候,我們和第一步一樣,通過我們想滑動(dòng)的時(shí)間獲取采樣的索引,再重新開始讀取數(shù)據(jù)。

綜上所述,播放器在正式播放視頻文件之前,必須要把頭文件全部讀取并解析 (這會(huì)是一段非常耗時(shí)的程序),這也是在線視頻播放的等待時(shí)間的瓶頸。在接下來的章節(jié)我會(huì)介紹自適應(yīng)視頻播放 (Adaptive Streaming),這個(gè)技術(shù)的發(fā)明使得了分段式 mp4 文件 (Fragmented Mp4) 技術(shù)得以誕生,大大的減少了在線視頻播放的等待時(shí)間。

 

4.在線視頻播放的技術(shù)基礎(chǔ) (online video streaming)

在線視頻的播放其實(shí)和播放本地視頻的局別就是 Extractor 讀取的 Source,數(shù)據(jù)源不一樣,在線播放需要下載數(shù)據(jù)到內(nèi)存,再交由 Extractor 讀取分析。但是既然是在線視頻播放,我們肯定不能把整個(gè)容器文件下載到內(nèi)存或者硬盤再開始解析播放。我們希望能控制下載的進(jìn)度,比如我當(dāng)前在看第 10s 的視頻內(nèi)容,所以我只想緩存/下載視頻內(nèi)容到第 20s 的位置。

我們俗稱的漸進(jìn)式下載 (Progressive Downloading) 就解決了這一難題。

說的好像是很嚇人的黑科技?。。。?!

Android視頻開發(fā)中如何進(jìn)行MP4文件的解析  

其實(shí)就是 HTTP1.1 協(xié)議支持的分段式下載而已。。。。。

Android視頻開發(fā)中如何進(jìn)行MP4文件的解析  

在 HTTP 請(qǐng)求里面假如一個(gè)叫 RANGE的 header,放入起始字節(jié)和結(jié)束字節(jié),就可以只下載對(duì)應(yīng)部分的數(shù)據(jù),這一 header 的支持也是各種下載軟件實(shí)現(xiàn)斷點(diǎn)下載的基礎(chǔ)。每次斷網(wǎng)的時(shí)候記錄下來已經(jīng)下載的數(shù)據(jù)的字節(jié)數(shù),下次再下載的時(shí)候從字節(jié)數(shù)+1 處重新下載并且寫入原有文件就可以了。

上述內(nèi)容就是Android視頻開發(fā)中如何進(jìn)行MP4文件的解析,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

名稱欄目:Android視頻開發(fā)中如何進(jìn)行MP4文件的解析
文章出自:http://www.muchs.cn/article46/johhhg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名微信小程序、品牌網(wǎng)站建設(shè)、電子商務(wù)網(wǎng)站設(shè)計(jì)、標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站