1. 程式人生 > >視音訊編解碼技術零基礎學習方法(向雷神致敬)

視音訊編解碼技術零基礎學習方法(向雷神致敬)

一直想把視音訊編解碼技術做一個簡單的總結,可是苦於時間不充裕,一直沒能完成。今天有著很大的空閒,終於可以總結一個有關視音訊技術的入門教程,可以方便更多的人學習從零開始學習視音訊技術。需要注意的是,本文所說的視音訊技術,指的是理論層面的視音訊技術,並不涉及到程式設計相關的東西。

0.     生活中的視音訊技術

平時我們開啟電腦中自己存電影的目錄的話,一般都會如下圖所示,一大堆五花八門的電影。(其實專業的影視愛好者一概會把影視檔案分門別類的,但我比較懶,一股腦把電影放在了一起)


因為下載的來源不同,這些電影檔案有不同的格式,用不同的字尾表示:avi,rmvb,mp4,flv,mkv等等(當然也使用不同的圖示)。在這裡需要注意的是,這些格式代表的是封裝格式

。何為封裝格式?就是把視訊資料和音訊資料打包成一個檔案的規範。僅僅靠看檔案的字尾,很難能看出具體使用了什麼視音訊編碼標準。總的來說,不同的封裝格式之間差距不大,各有優劣。

注:有些封裝格式支援的視音訊編碼標準十分廣泛,應該算比較優秀的封裝格式,比如MKV;而有些封裝格式支援的視音訊編碼標準很少,應該屬於落後的封裝格式,比如RMVB。

下面演示一下如何使用視訊播放器檢視一個視訊檔案採用的視音訊技術:

注:在這裡使用Media Player Classic作為演示,實際上暴風影音,KMplayer這些操作都差不太多。

1.開啟一個視訊檔案

2.在視訊畫面上右鍵單擊,選擇屬性。


3.在彈出的“屬性”對話方塊的“MediaInfo”選項卡中,就可以檢視該視訊檔案採用的視音訊技術了。如下圖所示,“變形金剛預告片_h1080p.mov”採用MPEG4的QuickTime封裝格式(MOV),採用了H.264(AVC)的壓縮編碼標準。


在這裡用到了一個檢視媒體資訊的工具:MediaInfo。MediaInfo是一個專門檢視視音訊格式的工具,軟體的詳細使用可參考:

原始碼分析可參考:

生活中的視音訊技術到此為止,下面介紹一下具體的視音訊技術。

1.     視訊播放器原理

視音訊技術主要包含以下幾點:封裝技術,視訊壓縮編碼技術以及音訊壓縮編碼技術。如果考慮到網路傳輸的話,還包括流媒體協議技術。

視訊播放器的原始碼詳細解析(Media Player Classic - HC,Mplayer,FFplay,XBMC)可以參考系列文章:

在這裡不細說了,僅簡要說明一下視訊播放器的原理。

視訊播放器播放一個網際網路上的視訊檔案,需要經過以下幾個步驟:解協議,解封裝,解碼視音訊,視音訊同步。如果播放本地檔案則不需要解協議,為以下幾個步驟:解封裝,解碼視音訊,視音訊同步。他們的過程如圖所示。

 

解協議的作用,就是將流媒體協議的資料,解析為標準的相應的封裝格式資料。視音訊在網路上傳播的時候,常常採用各種流媒體協議,例如HTTP,RTMP,或是MMS等等。這些協議在傳輸視音訊資料的同時,也會傳輸一些信令資料。這些信令資料包括對播放的控制(播放,暫停,停止),或者對網路狀態的描述等。解協議的過程中會去除掉信令資料而只保留視音訊資料。例如,採用RTMP協議傳輸的資料,經過解協議操作後,輸出FLV格式的資料。

解封裝的作用,就是將輸入的封裝格式的資料,分離成為音訊流壓縮編碼資料和視訊流壓縮編碼資料。封裝格式種類很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是將已經壓縮編碼的視訊資料和音訊資料按照一定的格式放到一起。例如,FLV格式的資料,經過解封裝操作後,輸出H.264編碼的視訊碼流和AAC編碼的音訊碼流。

解碼的作用,就是將視訊/音訊壓縮編碼資料,解碼成為非壓縮的視訊/音訊原始資料。音訊的壓縮編碼標準包含AAC,MP3,AC-3等等,視訊的壓縮編碼標準則包含H.264,MPEG2,VC-1等等。解碼是整個系統中最重要也是最複雜的一個環節。通過解碼,壓縮編碼的視訊資料輸出成為非壓縮的顏色資料,例如YUV420P,RGB等等;壓縮編碼的音訊資料輸出成為非壓縮的音訊抽樣資料,例如PCM資料。

視音訊同步的作用,就是根據解封裝模組處理過程中獲取到的引數資訊,同步解碼出來的視訊和音訊資料,並將視訊音訊資料送至系統的顯示卡和音效卡播放出來。

接下來的幾節我們將會列出主要的流媒體協議,封裝格式,以及視音訊編碼標準。更詳細的比較可以參考:

有關本文中涉及到的協議資料、封裝格式資料、視訊編碼資料、音訊編碼資料、視訊畫素資料、音訊取樣資料的分析可以參考下面系列文章:


2.     流媒體協議

流媒體協議是伺服器與客戶端之間通訊遵循的規定。當前網路上主要的流媒體協議如表所示。

主要流媒體協議一覽

名稱

推出機構

傳輸層協議

客戶端

目前使用領域

RTSP+RTP

IETF

TCP+UDP

VLC, WMP

IPTV

RTMP

Adobe Inc.

TCP

Flash

網際網路直播

RTMFP

Adobe Inc.

UDP

Flash

網際網路直播

MMS

Microsoft Inc.

TCP/UDP

WMP

網際網路直播+點播

HTTP

WWW+IETF

TCP

Flash

網際網路點播

RTSP+RTP經常用於IPTV領域。因為其採用UDP傳輸視音訊,支援組播,效率較高。但其缺點是網路不好的情況下可能會丟包,影響視訊觀看質量。因而圍繞IPTV的視訊質量的研究還是挺多的。

上海IPTV碼流分析結果可參考:IPTV視訊碼流分析

因為網際網路網路環境的不穩定性,RTSP+RTP較少用於網際網路視音訊傳輸。網際網路視訊服務通常採用TCP作為其流媒體的傳輸層協議,因而像RTMP,MMS,HTTP這類的協議廣泛用於網際網路視音訊服務之中。這類協議不會發生丟包,因而保證了視訊的質量,但是傳輸的效率會相對低一些。

此外RTMFP是一種比較新的流媒體協議,特點是支援P2P。

3.     封裝格式

封裝格式的主要作用是把視訊碼流和音訊碼流按照一定的格式儲存在一個檔案中。現如今流行的封裝格式如下表所示:

主要封裝格式一覽

名稱

推出機構

流媒體

支援的視訊編碼

支援的音訊編碼

目前使用領域

AVI

Microsoft Inc.

不支援

幾乎所有格式

幾乎所有格式

BT下載影視

MP4

MPEG

支援

MPEG-2, MPEG-4, H.264, H.263等

AAC, MPEG-1 Layers I, II, III, AC-3等

網際網路視訊網站

TS

MPEG

支援

MPEG-1, MPEG-2, MPEG-4, H.264

MPEG-1 Layers I, II, III, AAC,

IPTV,數字電視

FLV

Adobe Inc.

支援

Sorenson, VP6, H.264

MP3, ADPCM, Linear PCM, AAC等

網際網路視訊網站

MKV

CoreCodec Inc.

支援

幾乎所有格式

幾乎所有格式

網際網路視訊網站

RMVB

Real Networks Inc.

支援

RealVideo 8, 9, 10

AAC, Cook Codec, RealAudio Lossless

BT下載影視

由表可見,除了AVI之外,其他封裝格式都支援流媒體,即可以“邊下邊播”。有些格式更“萬能”一些,支援的視音訊編碼標準多一些,比如MKV。而有些格式則支援的相對比較少,比如說RMVB。

這些封裝格式都有相關的文件,在這裡就不一一例舉了。

我自己也做過輔助學習的小專案:

4.     視訊編碼

視訊編碼的主要作用是將視訊畫素資料(RGB,YUV等)壓縮成為視訊碼流,從而降低視訊的資料量。如果視訊不經過壓縮編碼的話,體積通常是非常大的,一部電影可能就要上百G的空間。視訊編碼是視音訊技術中最重要的技術之一。視訊碼流的資料量佔了視音訊總資料量的絕大部分。高效率的視訊編碼在同等的位元速率下,可以獲得更高的視訊質量。

注:視訊編碼技術在整個視音訊技術中應該是最複雜的技術。如果沒有基礎的話,可以先買一些書看一下原理,比如說《現代電視原理》《數字電視廣播原理與應用》(本科的課本)中的部分章節。

主要視訊編碼一覽

名稱

推出機構

推出時間

目前使用領域

HEVC(H.265)

MPEG/ITU-T

2013

研發中

H.264

MPEG/ITU-T

2003

各個領域

MPEG4

MPEG

2001

不溫不火

MPEG2

MPEG

1994

數字電視

VP9

Google

2013

研發中

VP8

Google

2008

不普及

VC-1

Microsoft Inc.

2006

微軟平臺

由表可見,有兩種視訊編碼方案是最新推出的:VP9和HEVC。目前這兩種方案都處於研發階段,還沒有到達實用的程度。當前使用最多的視訊編碼方案就是H.264。

4.1 主流編碼標準

H.264僅僅是一個編碼標準,而不是一個具體的編碼器,H.264只是給編碼器的實現提供參照用的。

在學習視訊編碼的時候,可能會用到各種編碼器(實際上就是一個exe檔案),他們常用的編碼命令可以參考:各種視訊編碼器的命令列格式

學習H.264最標準的原始碼,就是其官方標準JM了。但是要注意,JM速度非常的慢,是無法用於實際的:H.264參考軟體JM12.2RC程式碼詳細流程

實際中使用最多的就是x264了,效能強悍(超過了很多商業編碼器),而且開源。其基本教程網上極多,不再贅述。編碼時候可參考:x264編碼指南——位元速率控制。編碼後統計值的含義:X264輸出的統計值的含義(X264 Stats Output

Google推出的VP8屬於和H.264同一時代的標準。總體而言,VP8比H.264要稍微差一點。有一篇寫的很好的VP8的介紹文章:深入瞭解 VP8。除了在技術領域,VP8和H.264在專利等方面也是打的不可開交,可參考文章:WebM(VP8) vs H.264

此外,我國還推出了自己的國產標準AVS,效能也不錯,但目前比H.264還是要稍微遜色一點。不過感覺我國在視訊編解碼領域還算比較先進的,可參考:視訊編碼國家標準AVSH.264的比較(節選)

近期又推出了AVS新一代的版本AVS+,具體的效能測試還沒看過。不過據說AVS+得到了國家政策上非常強力的支援。

4.2 下一代編碼標準

下一代的編解碼標準就要數HEVC和VP9了。VP9是Google繼VP8之後推出的新一代標準。VP9和HEVC相比,要稍微遜色一些。它們的對比可參考:(1)HEVC與VP9編碼效率對比 (2)HEVC,VP9,x264效能對比

學習HEVC最標準的原始碼,就是其官方標準HM了。其速度比H.264的官方標準程式碼又慢了一大截,使用可參考:HEVC學習—— HM的使用

結果大致是這樣的:

HEVC > VP9 > H.264> VP8 > MPEG4 > H.263 > MPEG2。

截了一些圖,可以比較直觀的瞭解各種編碼標準:

5.     音訊編碼

音訊編碼的主要作用是將音訊取樣資料(PCM等)壓縮成為音訊碼流,從而降低音訊的資料量。音訊編碼也是網際網路視音訊技術中一個重要的技術。但是一般情況下音訊的資料量要遠小於視訊的資料量,因而即使使用稍微落後的音訊編碼標準,而導致音訊資料量有所增加,也不會對視音訊的總資料量產生太大的影響。高效率的音訊編碼在同等的位元速率下,可以獲得更高的音質。

主要音訊編碼一覽

名稱

推出機構

推出時間

目前使用領域

AAC

MPEG

1997

各個領域(新)

AC-3

Dolby Inc.

1992

電影

MP3

MPEG

1993

各個領域(舊)

WMA

Microsoft Inc.

1999

微軟平臺

由表可見,近年來並未推出全新的音訊編碼方案,可見音訊編碼技術已經基本可以滿足人們的需要。音訊編碼技術近期絕大部分的改動都是在MP3的繼任者——AAC的基礎上完成的。

結果大致是這樣的:

AAC+ > MP3PRO > AAC> RealAudio > WMA > MP3

AAC專利方面的介紹:AAC專利介紹

此外杜比數字的編碼標準也比較流行,但是貌似比最新的AAC稍為遜色:AC-3技術綜述

6.     現有網路視音訊平臺對比

現有的網路視音訊服務主要包括兩種方式:點播和直播。點播意即根據使用者的需要播放相應的視訊節目,這是網際網路視音訊服務最主要的方式。絕大部分視訊網站都提供了點播服務。直播意即網際網路視音訊平臺直接將視訊內容實時傳送給使用者,目前還處於發展階段。直播在網路電視臺,社交視訊網站較為常見。

6.1 直播平臺引數對比

主流網際網路視音訊平臺直播服務的引數對比如表所示:

現有網路視音訊平臺引數對比

名稱

協議

封裝

視訊編碼

音訊編碼

播放器

CNTV

私有

華數TV

RTMP

FLV

H.264

AAC

Flash

六間房

RTMP

FLV

H.264

AAC

Flash

中國教育電視臺

RTMP

FLV

H.264

AAC

Flash

北廣傳媒移動電視

RTMP

FLV

H.264

AAC

Flash

上海IPTV

RTSP+RTP

TS

H.264

MP2

機頂盒

可以看出,直播服務普遍採用了RTMP作為流媒體協議,FLV作為封裝格式,H.264作為視訊編碼格式,AAC作為音訊編碼格式。採用RTMP作為直播協議的好處在於其被Flash播放器支援。而Flash播放器如今已經安裝在全球99%的電腦上,並且與瀏覽器結合的很好。因此這種流媒體直播平臺可以實現“無外掛直播”,極大的簡化了客戶端的操作。封裝格式,視訊編碼,音訊編碼方面,無一例外的使用了FLV + H.264 + AAC的組合。FLV是RTMP使用的封裝格式,H.264是當今實際應用中編碼效率最高的視訊編碼標準,AAC則是當今實際應用中編碼效率最高的音訊編碼標準。視訊播放器方面,都使用了Flash播放器。

6.2 點播平臺引數對比

主流網路視音訊平臺點播服務的引數對比如表所示:

現有網際網路視音訊平臺引數對比

名稱

協議

封裝

視訊編碼

音訊編碼

播放器

CNTV

HTTP

MP4

H.264

AAC

Flash

CNTV(部分)

RTMP

FLV

H.264

AAC

Flash

華數TV

HTTP

MP4

H.264

AAC

Flash

優酷網

HTTP

FLV

H.264

AAC

Flash

土豆網

HTTP

F4V

H.264

AAC

Flash

56網

HTTP

FLV

H.264

AAC

Flash

音悅臺

HTTP

MP4

H.264

AAC

Flash

樂視網

HTTP

FLV

H.264

AAC

Flash

新浪視訊

HTTP

FLV

H.264

AAC

Flash

可以看出,點播服務普遍採用了HTTP作為流媒體協議,H.264作為視訊編碼格式,AAC作為音訊編碼格式。採用HTTP作為點播協議有以下兩點優勢:一方面,HTTP是基於TCP協議的應用層協議,媒體傳輸過程中不會出現丟包等現象,從而保證了視訊的質量;另一方面,HTTP被絕大部分的Web伺服器支援,因而流媒體服務機構不必投資購買額外的流媒體伺服器,從而節約了開支。點播服務採用的封裝格式有多種:MP4,FLV,F4V等,它們之間的區別不是很大。視訊編碼標準和音訊編碼標準是H.264和AAC。這兩種標準分別是當今實際應用中編碼效率最高的視訊標準和音訊標準。視訊播放器方面,無一例外的都使用了Flash播放器。