在線直播可以說從去年開始變成了一個火爆的創業領域,一下子出來了很多做視頻直播的公司。但說實話這方面的技術書籍實在是非常的少,網上的資料也很零散,所以我決定寫一些列介紹視頻技術的文章。今天這篇文章先對視頻技術中的基礎概念做一些簡單的總結。
你所能看到的視頻
現在可能大部分人都直接用瀏覽器在視頻網站上看視頻了,已經不太能看到視頻的后綴名之類的東西了。但是如果是把視頻下載到本地觀看的話,是可以看到視頻文件的后綴的。這也就是我們平時所說的視頻格式。目前比較主流的視頻格式有下面這幾種:avi,rmvb,mp4,flv,mkv等等。這里面作為的視頻格式實際上是指視頻的封裝格式指的是以什么方式把視頻和音頻數據打包成一個文件,所一個這個封裝格式其實與視頻和音頻采用什么方式編碼沒有什么關系。總的來說,不同的封裝格式之間差距不大,各有優劣。
注:有些封裝格式支持的視音頻編碼標准十分廣泛,應該算比較優秀的封裝格式,比如MKV;而有些封裝格式支持的視音頻編碼標准很少,應該屬於落后的封裝格式,比如RMVB。
封裝格式
封裝格式的主要作用是把視頻碼流和音頻碼流按照一定的格式存儲在一個文件中。現如今流行的封裝格式如下表所示:
| 格式 | 推出機構 | 流媒體 |支持的視頻編碼|支持音頻編碼格式|應用領域|
|:----|:----|:----|:----|:----|
|AVI|Mirosoft Inc.|不支持|幾乎所有|幾乎所有|下載的視頻文件(現在可能很少見到)|
|MP4|MPEG|支持|MPEG-2、MPEG-4、H.264|AAC,MPEG-1 Layers I, II, III、AC-3等|互聯網視頻|
|TS|MPEG|支持|MPEG-2、MPEG-4、H.264|AAC,MPEG-1 Layers I, II, III|互聯網視頻、IPTV、數字電視|
|FLV|Adobe Inc.|支持|Sorenson、VP6、H264|MP3,ADPCM,Linear PCM、AAC等|互聯網視頻
|MKV|CoreCodec Inc.|支持|幾乎所有|幾乎所有|互聯網視頻|
|RMVB|Real Networks Inc.|支持|RealVideo 8,9,10|AAC、Cook Codec、RealAudio Lossless|下載的視頻文件|
除了AVI之外,幾乎所有的封裝格式都支持流媒體播放,也就是“邊下邊播放”。什么叫封裝可能現在理解起來比較抽象,下面我會詳細講解什么是封裝以及什么是編碼,以及他們之間的關系。
視頻編碼格式
了解了視頻的封裝格式后,如果剝離視頻的封裝格式后,就可以看到真正的視頻數據,這些視頻數據會有不同的編碼格式。什么是編碼格式呢?
我們平時所看到的視頻,理論上就是一幀幀的圖片連續的播放,形成動畫效果。那么完整的保存所有圖片,一部電影可能就要上百G的空間。視頻編碼就是為了壓縮這些圖片,以節省空間。我先講一下簡單的理論,比如一秒鍾的視頻通常有24幀,這24張圖畫大部分區域可能都比較相近,那么我們是不是可以找到一種方法,只保存一張完整圖片(我們稱為關鍵幀),不保存其他圖片,只保存和這個完整圖片的不同(通過某種數學建模表達),這樣就會節省很多空間,在播放的時候,通過和關鍵幀與每一幀的不同逆向恢復成一張完整的圖片,這樣就得到了24張完整的圖片。(這里只是舉例,實際應用中並不一定是每24幀圖像被設定一個關鍵幀)。OK,那么所謂編碼格式就指的一種壓縮視頻圖像的算法。主流的視頻編碼格式一覽表如下:
其實這里H264已經成為事實的視頻領域的行業編碼標准。目前主流的視頻都采用H264格式進行視頻編碼,H265可能對目前的計算機硬件資源來說計算量還是過大,還沒有普及(只是猜測)。MPEG4、MPEG2和H264都師出同門,只不過H264在圖像質量和壓縮率上更勝一籌,其他幾種編碼格式基本跟H264差不多,只是出自不同公司或者組織,並且沒有H264普及。
音頻編碼
這里在稍微講一下音頻編碼吧。同樣音頻編碼和視頻編碼一樣,指的是通過一定的手段將音頻數據進行壓縮。音頻數據在視頻文件中占用空間跟視頻數據比非常的小,我們這里就不重討論,目前主要的音頻編碼格式有AAC、AC-3、MP3、WMA。其中AAC應該是視頻文件中最主流的編碼格式。
視頻播放原理
比如我們在網站上看一個視頻的時候,需要經過這幾個步驟:解協議,解封裝,解碼視音頻,視音頻同步。如果播放本地文件則不需要解協議,為以下幾個步驟:解封裝,解碼視音頻,視音頻同步。他們的過程如圖所示。

這張圖表示的是從網絡流媒體下載到播放的整個過程,流媒體的協議有很多種,比如HTTP,RTMP或者MMS等,這里我們先不展開討論(以后抽時間專門寫一篇流媒體協議的文章介紹)。我們從解協議的結果封裝格式數據開始討論。
解封裝的作用,就是將輸入的封裝格式的數據,分離成為音頻流壓縮編碼數據和視頻流壓縮編碼數據。封裝格式種類很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是將已經壓縮編碼的視頻數據和音頻數據按照一定的格式放到一起。例如,FLV格式的數據,經過解封裝操作后,輸出H.264編碼的視頻碼流和AAC編碼的音頻碼流。
解碼的作用,就是將視頻/音頻壓縮編碼數據,解碼成為非壓縮的視頻/音頻原始數據。音頻的壓縮編碼標准包含AAC,MP3,AC-3等等,視頻的壓縮編碼標准則包含H.264,MPEG2,VC-1等等。解碼是整個系統中最重要也是最復雜的一個環節。通過解碼,壓縮編碼的視頻數據輸出成為非壓縮的顏色數據,例如YUV420P,RGB等等;壓縮編碼的音頻數據輸出成為非壓縮的音頻抽樣數據,例如PCM數據。
視音頻同步的作用,就是根據解封裝模塊處理過程中獲取到的參數信息,同步解碼出來的視頻和音頻數據,並將視頻音頻數據送至系統的顯卡和聲卡播放出來。
為什么要分封裝格式和視頻編碼格式呢? 這個其實跟網絡分七層模型一個原理。解耦和,降低依賴,底層給上層提供基礎功能,底層和上層都都可以單獨擴展,可以以多種方案組合編碼與封裝,比如MP4與H264、MP4與MPEG、TS與H264等等。比如這里面的這邊文章的編碼就只負責將最原始的音頻和視頻數據就行壓縮,而壓縮完的數據要怎么組織就拜托給上層的封裝,封裝接到視頻音頻數據負責給數據編號,指定同步協議,加入字幕等操作。經過封裝后,得到的就是可以播放的上面提到的視頻文件MP4或者MKV等等。把這個過程反過來就是上圖描述的視頻播放的過程。
本文大部分內容抄自[總結]視音頻編解碼技術零基礎學習方法,一部分來源於自己的總結《[總結]視音頻編解碼技術零基礎學習方法》應該是國內視頻領域最系統的學習資料了。有興趣的朋友可以去仔細閱讀一下。
---------------------------------------------
作者:我在睡覺
鏈接:https://www.jianshu.com/p/c905f3ec59c9
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。