您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Android視頻開發中視頻的術語有哪些,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
說到安卓的視頻開發,大多數朋友們都是用著開源的播放器,或者安卓自帶的 native mediaplayer,我打算分享一下視頻開發中常見的一些知識點,概念和術語,給不熟悉的朋友們先"掃掃盲"。
一說到視頻,音頻,大家肯定都聽說,至少有所耳聞這兩個詞 - 編碼(encode) 和 解碼(decode)。我這里提到的 Codec 就是一種程序,這種程序可以對視頻文件進行編碼和解碼。在維基百科上對 Codec 是這樣定義的:
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.
那么問題來了,視頻不就是視頻嗎,MP4,avi,rmvb,我們看的很多小電影不就是視頻嘛。。。下載下來就可以看了啊。。。。為何需要編碼解碼。。。都是什么鬼。
首先,我們常說 編碼 就是壓縮,解碼 就是解壓縮。視頻文件的本質其實就是圖片的集合而已,當一段連續的圖片不斷的出現在人眼前 (一般一個連貫的電影或者動畫至少要求一秒 24 幀,也就是一秒內連續出現 24 張圖片),肉眼就會“欺騙性”的告訴大腦我們在看一個視頻,而不是幻燈片。
那我們可以開始做點算術題了,假設一張像素為 1280X720(清晰度,寬 1280 個像素點,高 720 個像素點) 的圖片,大小為約為 1280X720X3 bytes,就是 2.7MB。大家可以猜想一下為何我這里還需要乘以一個數字 3.那么一段 60 秒鐘的小電影,就需要 60X24(24 張圖片)X2.7MB ,約為 3.9GB 了!
之所以圖片大小是像素寬高相乘還要乘 3 是因為一個像素點需要至少三原色 (RGB) 來顯示像素點本身的顏色,做過安卓開發的同學都知道在 xml 里面定義顏色的格式吧?#ffffff - 代表白色 f 是十六進制數,也就是 4 位二進制數,三原色需要 3X4X2 位二進制數,也就是 3 個八位,一個八位是一個字節,所以我們需要 3 個字節來顯示一個像素點
這 tm 必然是不能接受的啊!這樣我用我 3TB 的移動硬盤,也不能把蒼老師的全部小電影保存起來,寶寶心里苦啊!
所以 Codec 這種程序就出現了,它會把這些連續的圖片們通過一定的算法壓縮成體積更小的文件格式,這就是我們所謂的 編碼,壓縮。但是在播放器的客戶端,不管是 PC,手機也好,他們要顯示在屏幕上的,必須是實實在在的圖片啊,所以這些被壓縮過的文件最終又必須被還原成圖片格式,這就是 解碼,解壓縮。
視頻編碼,壓縮是一個非常復雜的過程,萬幸的是,現在市面上已經有很多工具,還有現有規范來指導開發者進行編碼解碼了。其中最常用的一些規范是:
可能大家對壓縮解壓縮還是不太理解。。。到底有哪些地方可以壓縮呢?那我們舉個栗子!
咱們想象一下一個場景,比如說在某些電影中,主人公在安靜的公園中因為失戀悲傷不已,全世界都仿佛靜止一般。。。。就這么呆坐了整整 30s。那么對于這種“靜態的場景”,視頻壓縮算法會只取這三十秒的前幾幀作為基準幀圖片,對其余的 29s 的幀,采取只保存“不同的部分”的策略,這樣就不用保存這些差不多相同的圖片,這種做法叫“去冗余”。大大減少了視頻的體積。
當然,這只是視頻壓縮算法的冰山一角,我們不多研究。
另外需要注意的是,Codec 的編碼與解碼包含對視頻數據的編碼解碼和音頻數據的編碼解碼,因為音頻的本質是聲波信息,視頻是圖片處理,他們本質上是不同的,我這里主要是介紹視頻數據的處理。
回到我們說的 Codec,所以說 Codec 是一套程序,它遵循不同的規范,根據規范的不同提供不同的壓縮解壓縮策略。既然是一套規范,那么就肯定需要實現啊!在安卓平臺里面,谷歌提供了視頻編碼解碼的 API,對一些基礎的編碼解碼規范做了 API 的封裝,在接下里的章節我會慢慢介紹,其他移動平臺也都差不多,多多少少都會提供 API 的支持。
之前說到,咱們在看小電影的時候都會看到很多文件的后綴名,例如 mp4,rmvb,avi,喜歡看高清美劇的同學應該還會經常看到所謂的藍光 mkv 格式等等。我們習慣叫他們視頻文件,但是這樣說顯得不夠專業。。。
嚴格的來講,他們應該被叫做容器文件。。。。因為一個容器里,不僅僅包括了視頻 (video) 數據,還包括了 (audio) 音頻數據,有的容器還內嵌字幕,那么就還有文字 (Text) 數據。不過容器文件雖然聽起來嚇人,但是它說到底也就是一個結構化的文件而已。之所以說它結構化,就是它包含的視頻,音頻,文字數據都必須按照一定的規范,放在文件指定的位置 (方便播放器解析)。
容器文件就是上面說到的 Codec 程序對圖片集進行編碼之后的產物,被 Codec 編碼之后,除了必要的視頻音頻信息之外,它還有一些其他的信息。
我畫了一個草圖,解釋了一個經典的 MP4 容器結構是啥樣。。。
里面提到了 Track(軌道),這是一個專業術語,用來區分不同的音視頻/文字數據 但是 MP4 文件里面最重要的卻是這個 MetaData,它包含了很多關于視頻的原始數據,比如視頻的大小,視頻的時長,還有一個索引表,這個索引表包含了不同軌道的起始位置 (以字節為單位),又因為每個軌道會被分成若干塊 sample(采樣,每一塊采樣都是可以單獨被播放器播放的一段數據,以微妙為單位),metadata 也會維護一個細粒度更小的索引表,記錄了每一塊 sample 的大小,起始位置,對應視頻的時間是多少 (以字節為單位) 等等的信息。
舉個簡單的例子,有些電影包含粵語,國語兩個聲道。我們想換聲道的時候會告訴播放器,我想聽粵語,那么播放器會去索引表查找粵語的軌道起始位置,并且源源不斷的讀取粵語音軌的數據并播放出來。這也解釋了為何上圖會有兩個 audio track。
在接下來的章節我會詳細介紹播放器是怎么解析容器文件,這里大家只需要知道大概就好。
從一個實際的流程出發
導演用膠片拍攝了原片 (Raw Data),膠片就代表著原始文件,也就是圖片集 (因為膠片就是一幀一幀的連續圖片),使用軟件把源文件編碼 (Encode) 成容器文件 (Container),之后可能為了不容分辨率的原因,還需要將原始的高清容器,轉換成不同的分辨率的容器文件,對應圖中的 process 這一步。最后在放在服務器或者 CDN 上,又播放器將其下載播放。
關于Android視頻開發中視頻的術語有哪些就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。