本文作者 本文由qing的世界授權(quán)發(fā)布。 qing的世界的博客地址: http://www.jianshu.com/u/a32db45d4859 說到安卓的視頻開發(fā),大多數(shù)朋友們都是用著開源的播放器,或者安卓自帶的native mediaplayer,拿來主義居多,我曾經(jīng)也是。。。
第一次我打算分享一下視頻開發(fā)中常見的一些知識點,概念和術(shù)語,給不熟悉的朋友們先'掃掃盲'。 在之后的章節(jié)我會慢慢的介紹除了基本的在線視頻播放技術(shù)之外,一些更加“高級”的技術(shù) :smirk:,包括安卓平臺在4.4之后發(fā)布的全新的 Codec API , 還有怎么處理自適應(yīng)視頻播放(Adaptive Streaming ),版權(quán)管理內(nèi)容(DRM Content),最后幾章會使用谷歌開源的ExoPlayer作為例子,從源碼的角度分析一個完整的播放器需要哪些構(gòu)件。 每一個術(shù)語我都會盡量用中文寫一遍,再寫一遍英文,因為說實話。。。不用英文查資料,很多東西都搜不出來。
什么是Codec一說到視頻,音頻,大家肯定都聽說,至少有所耳聞這兩個詞 - 編碼(encode) 和 解碼(decode)。我這里提到的Codec就是一種程序,這種程序可以對視頻文件進行編碼和解碼。在維基百科上對Codec是這樣定義的:
那么問題來了,視頻不就是視頻嗎,MP4,avi,rmvb,我們看的很多小電影不就是視頻嘛。。。下載下來就可以看了啊。。。。為何需要編碼解碼。。。都是什么鬼。 ... 首先,我們常說編碼 就是壓縮,解碼 就是解壓縮。視頻文件的本質(zhì)其實就是圖片的集合而已,當(dāng)一段連續(xù)的圖片不斷的出現(xiàn)在人眼前(一般一個連貫的電影或者動畫至少要求一秒24幀,也就是一秒內(nèi)連續(xù)出現(xiàn)24張圖片),肉眼就會“欺騙性”的告訴大腦我們在看一個視頻,而不是幻燈片。 那我們可以開始做點算術(shù)題了,假設(shè)一張像素為1280X720(清晰度,寬1280個像素點,高720個像素點)的圖片,大小為約為1280X720X3 bytes,就是2.7MB。 大家可以猜想一下為何我這里還需要乘以一個數(shù)字3.那么一段60秒鐘的小電影,就需要60X24(24張圖片)X2.7MB ,約為3.9GB了!
這tm必然是不能接受的??!這樣我用我3TB的移動硬盤,也不能把蒼老師的全部小電影保存起來,寶寶心里苦啊! 所以Codec這種程序就出現(xiàn)了,它會把這些連續(xù)的圖片們通過一定的算法壓縮成體積更小的文件格式,這就是我們所謂的編碼,壓縮。但是在播放器的客戶端,不管是PC,手機也好,他們要顯示在屏幕上的,必須是實實在在的圖片啊,所以這些被壓縮過的文件最終又必須被還原成圖片格式,這就是解碼,解壓縮。 視頻編碼,壓縮是一個非常復(fù)雜的過程,萬幸的是,現(xiàn)在市面上已經(jīng)有很多工具,還有現(xiàn)有規(guī)范來指導(dǎo)開發(fā)者進行編碼解碼了。其中最常用的一些規(guī)范是: 可能大家對壓縮解壓縮還是不太理解。。。到底有哪些地方可以壓縮呢? 那我們舉個栗子! 咱們想象一下一個場景,比如說在某些電影中,主人公在安靜的公園中因為失戀悲傷不已,全世界都仿佛靜止一般。。。。 就這么呆坐了整整30s。那么對于這種“靜態(tài)的場景”,視頻壓縮算法會只取這三十秒的前幾幀作為基準(zhǔn)幀圖片,對其余的29s的幀,采取只保存“不同的部分”的策略,這樣就不用保存這些差不多相同的圖片,這種做法叫“去冗余”。大大減少了視頻的體積。 當(dāng)然,這只是視頻壓縮算法的冰山一角,我們不多研究。 另外需要注意的是,Codec的編碼與解碼包含對視頻數(shù)據(jù)的編碼解碼和音頻數(shù)據(jù)的編碼解碼,因為音頻的本質(zhì)是聲波信息,視頻是圖片處理,他們本質(zhì)上是不同的,我這里主要是介紹視頻數(shù)據(jù)的處理。 回到我們說的Codec,所以說Codec是一套程序,它遵循不同的規(guī)范,根據(jù)規(guī)范的不同提供不同的壓縮解壓縮策略。
什么是Container format file
之前說到,咱們在看小電影的時候都會看到很多文件的后綴名,例如mp4,rmvb,avi,喜歡看高清美劇的同學(xué)應(yīng)該還會經(jīng)??吹剿^的藍光mkv格式等等。我們習(xí)慣叫他們視頻文件,但是這樣說顯得不夠?qū)I(yè)。。。 嚴(yán)格的來講,他們應(yīng)該被叫做容器文件。。。。因為一個容器里,不僅僅包括了視頻(video)數(shù)據(jù),還包括了(audio)音頻數(shù)據(jù),有的容器還內(nèi)嵌字幕,那么就還有文字(Text)數(shù)據(jù)。 不過容器文件雖然聽起來嚇人,但是它說到底也就是一個結(jié)構(gòu)化的文件而已。之所以說它結(jié)構(gòu)化,就是它包含的視頻,音頻,文字?jǐn)?shù)據(jù)都必須按照一定的規(guī)范,放在文件指定的位置(方便播放器解析)。 容器文件就是上面說到的Codec程序?qū)D片集進行編碼之后的產(chǎn)物,被Codec編碼之后,除了必要的視頻音頻信息之外,它還有一些其他的信息。 我畫了一個草圖,解釋了一個經(jīng)典的MP4容器結(jié)構(gòu)是啥樣。。。 里面提到了Track(軌道),這是一個專業(yè)術(shù)語,用來區(qū)分不同的音視頻/文字?jǐn)?shù)據(jù) 它包含了很多關(guān)于視頻的原始數(shù)據(jù),比如視頻的大小,視頻的時長,還有一個索引表,這個索引表包含了不同軌道的起始位置(以字節(jié)為單位),又因為每個軌道會被分成若干塊sample(采樣,每一塊采樣都是可以單獨被播放器播放的一段數(shù)據(jù),以微妙為單位),metadata也會維護一個細(xì)粒度更小的索引表,記錄了每一塊sample的大小,起始位置,對應(yīng)視頻的時間是多少(以字節(jié)為單位)等等的信息。 舉個簡單的例子,有些電影包含粵語,國語兩個聲道。我們想換聲道的時候會告訴播放器,我想聽粵語,那么播放器會去索引表查找粵語的軌道起始位置,并且源源不斷的讀取粵語音軌的數(shù)據(jù)并播放出來。這也解釋了為何上圖會有兩個audio track。 在接下來的章節(jié)我會詳細(xì)介紹播放器是怎么解析容器文件,這里大家只需要知道大概就好。 視頻處理的流程-從后臺到前端從一個實際的流程出發(fā), 導(dǎo)演用膠片拍攝了原片(Raw Data),膠片就代表著原始文件,也就是圖片集(因為膠片就是一幀一幀的連續(xù)圖片),使用軟件把源文件編碼(Encode)成容器文件(Container),之后可能為了不容分辨率的原因,還需要將原始的高清容器,轉(zhuǎn)換成不同的分辨率的容器文件,對應(yīng)圖中的process這一步。最后在放在服務(wù)器或者CDN上,又播放器將其下載播放。 補充一張圖。 ok,這次分享就結(jié)束了,我會在下次分享詳細(xì)介紹播放器是怎么解析,讀取容器文件,同時也會深入的介紹一下MP4容器的一些格式規(guī)范,有助于大家去分析開源播放器的源碼。 文章中涉及到的一些鏈接:
在微信后臺,很多朋友留言說想要深入學(xué)習(xí)視頻相關(guān)的技術(shù),于是我就有意針對這一塊做了一些收集,也有幸看到了本文作者的該系列,讀完第一篇的時候,我覺得對于一個剛開始想要接觸視頻開發(fā)的來說,非常的易懂~ 于是,立即聯(lián)系了作者,要到了授權(quán)~ |
|