Android視頻開發進階(part1-關於視頻的那些術語)

說到安卓的視頻開發,大多數朋友們都是用着開源的播放器,或者安卓自帶的native mediaplayer,拿來主義居多,我曾經也是。。。 最近這半年由於開始着手重構公司的播放器,也開始學習了不少視頻音頻開發的相關知識,抱着獨樂樂不如衆樂樂的想法,開始寫一些值得分享的東西。此次的連載和以前的RxJava分享同樣,會分開不容的章節。html

第一次我打算分享一下視頻開發中常見的一些知識點,概念和術語,給不熟悉的朋友們先"掃掃盲"。在以後的章節我會慢慢的介紹除了基本的在線視頻播放技術以外,一些更加「高級」的技術 :smirk:,包括安卓平臺在4.4以後發佈的全新的Codec API, 還有怎麼處理自適應視頻播放(Adaptive Streaming),版權管理內容(DRM Content),最後幾章會使用谷歌開源的ExoPlayer做爲例子,從源碼的角度分析一個完整的播放器須要哪些構件。前端

每個術語我都會盡可能用中文寫一遍,再寫一遍英文,由於說實話。。。不用英文查資料,不少東西都搜不出來。android

  1. 什麼是Codec
  2. 什麼是Container format file
  3. 視頻處理的流程-從後臺到前端

(華麗麗的分割線)git


1.什麼是Codec

一說到視頻,音頻,你們確定都據說,至少有所耳聞這兩個詞 - 編碼(encode) 和 解碼(decode)。 我這裏提到的Codec就是一種程序,這種程序能夠對視頻文件進行編碼和解碼。在維基百科上對Codec是這樣定義的:github

A video codec is an electronic circuit or software that compresses or decompresses digital video. It converts raw (uncompressed) digital video to a compressed format or vice versa. In the context of video compression, "codec" is a concatenation of "encoder" and "decoder"—a device that only compresses is typically called an encoder, and one that only decompresses is a decoder.web

那麼問題來了,視頻不就是視頻嗎,MP4,avi,rmvb,咱們看的不少小電影不就是視頻嘛。。。下載下來就能夠看了啊。。。。爲什麼須要編碼解碼。。。都是什麼鬼。算法

...chrome

Drawing

首先,咱們常說編碼 就是壓縮,解碼 就是解壓縮。視頻文件的本質其實就是圖片的集合而已,當一段連續的圖片不斷的出如今人眼前(通常一個連貫的電影或者動畫至少要求一秒24幀,也就是一秒內連續出現24張圖片),肉眼就會「欺騙性」的告訴大腦咱們在看一個視頻,而不是幻燈片。服務器

那咱們能夠開始作點算術題了,假設一張像素爲1280X720(清晰度,寬1280個像素點,高720個像素點)的圖片,大小爲約爲1280X720X3 bytes,就是2.7MB。你們能夠猜測一下爲什麼我這裏還須要乘以一個數字3.那麼一段60秒鐘的小電影,就須要60X24(24張圖片)X2.7MB ,約爲3.9GB了!electron

之因此圖片大小是像素寬高相乘還要乘3 是由於一個像素點須要至少三原色(RGB)來顯示像素點自己的顏色,作過安卓開發的同窗都知道在xml裏面定義顏色的格式吧?#ffffff - 表明白色 f是十六進制數,也就是4位二進制數,三原色須要3X4X2位二進制數,也就是3個八位,一個八位是一個字節,因此咱們須要3個字節來顯示一個像素點

Drawing

這tm必然是不能接受的啊!這樣我用我3TB的移動硬盤,也不能把蒼老師的所有小電影保存起來,寶寶內心苦啊!

因此Codec這種程序就出現了,它會把這些連續的圖片們經過必定的算法壓縮成體積更小的文件格式,這就是咱們所謂的編碼,壓縮。可是在播放器的客戶端,不論是PC,手機也好,他們要顯示在屏幕上的,必須是實實在在的圖片啊,因此這些被壓縮過的文件最終又必須被還原成圖片格式,這就是解碼,解壓縮。

視頻編碼,壓縮是一個很是複雜的過程,萬幸的是,如今市面上已經有不少工具,還有現有規範來指導開發者進行編碼解碼了。其中最經常使用的一些規範是:

Drawing

可能你們對壓縮解壓縮仍是不太理解。。。到底有哪些地方能夠壓縮呢? 那咱們舉個栗子!

我們想象一下一個場景,好比說在某些電影中,主人公在安靜的公園中由於失戀悲傷不已,全世界都彷彿靜止通常。。。。就這麼呆坐了整整30s。那麼對於這種「靜態的場景」,視頻壓縮算法會只取這三十秒的前幾幀做爲基準幀圖片,對其他的29s的幀,採起只保存「不一樣的部分」的策略,這樣就不用保存這些差很少相同的圖片,這種作法叫「去冗餘」。大大減小了視頻的體積。

固然,這只是視頻壓縮算法的冰山一角,咱們很少研究。

另外須要注意的是,Codec的編碼與解碼包含對視頻數據的編碼解碼和音頻數據的編碼解碼,由於音頻的本質是聲波信息,視頻是圖片處理,他們本質上是不一樣的,我這裏主要是介紹視頻數據的處理。

回到咱們說的Codec,因此說Codec是一套程序,它遵循不一樣的規範,根據規範的不一樣提供不一樣的壓縮解壓縮策略。 既然是一套規範,那麼就確定須要實現啊! 在安卓平臺裏面,谷歌提供了視頻編碼解碼的API,對一些基礎的編碼解碼規範作了API的封裝,在接下里的章節我會慢慢介紹,其餘移動平臺也都差很少,多多少少都會提供API的支持。

2. 什麼是Container format file(視頻容器文件)

以前說到,我們在看小電影的時候都會看到不少文件的後綴名,例如mp4,rmvb,avi,喜歡看高清美劇的同窗應該還會常常看到所謂的藍光mkv格式等等。咱們習慣叫他們視頻文件,可是這樣說顯得不夠專業。。。

嚴格的來說,他們應該被叫作容器文件。。。。由於一個容器裏,不只僅包括了視頻(video)數據,還包括了(audio)音頻數據,有的容器還內嵌字幕,那麼就還有文字(Text)數據。不過容器文件雖然聽起來嚇人,可是它說到底也就是一個結構化的文件而已。之因此說它結構化,就是它包含的視頻,音頻,文字數據都必須按照必定的規範,放在文件指定的位置(方便播放器解析)。

容器文件就是上面說到的Codec程序對圖片集進行編碼以後的產物,被Codec編碼以後,除了必要的視頻音頻信息以外,它還有一些其餘的信息。

我畫了一個草圖,解釋了一個經典的MP4容器結構是啥樣。。。

裏面提到了Track(軌道),這是一個專業術語,用來區分不一樣的音視頻/文字數據 可是MP4文件裏面最重要的倒是這個MetaData,它包含了不少關於視頻的原始數據,好比視頻的大小,視頻的時長,還有一個索引表,這個索引表包含了不一樣軌道的起始位置(以字節爲單位),又由於每一個軌道會被分紅若干塊sample(採樣,每一塊採樣都是能夠單獨被播放器播放的一段數據,以微妙爲單位),metadata也會維護一個細粒度更小的索引表,記錄了每一塊sample的大小,起始位置,對應視頻的時間是多少(以字節爲單位)等等的信息。

舉個簡單的例子,有些電影包含粵語,國語兩個聲道。咱們想換聲道的時候會告訴播放器,我想聽粵語,那麼播放器會去索引表查找粵語的軌道起始位置,而且源源不斷的讀取粵語音軌的數據並播放出來。這也解釋了爲什麼上圖會有兩個audio track。

在接下來的章節我會詳細介紹播放器是怎麼解析容器文件,這裏你們只須要知道大概就好。

3. 視頻處理的流程-從後臺到前端

從一個實際的流程出發,

導演用膠片拍攝了原片(Raw Data),膠片就表明着原始文件,也就是圖片集(由於膠片就是一幀一幀的連續圖片),使用軟件把源文件編碼(Encode)成容器文件(Container),以後可能爲了避免容分辨率的緣由,還須要將原始的高清容器,轉換成不一樣的分辨率的容器文件,對應圖中的process這一步。最後在放在服務器或者CDN上,又播放器將其下載播放。

補充一張圖。


華麗麗的分割線

ok,此次分享就結束了,我會在下次分享詳細介紹播放器是怎麼解析,讀取容器文件,同時也會深刻的介紹一下MP4容器的一些格式規範,有助於你們去分析開源播放器的源碼。

part 2 MP4文件解析

相關文章
相關標籤/搜索