音視頻基礎_7_視頻壓縮技術簡介

視頻壓縮(編碼)技術簡介

YUV 數據相比RGB數據,體積會小很多,但是依然太大,進行網絡傳輸之前,必須進行壓縮,或者說編碼。

視頻的壓縮技術要比音頻和圖像更復雜。從數據損失方面來分類,視頻壓縮和音頻,圖片一樣,也分爲無損和有損壓縮。此外,根據對圖像幀的不同處理方式進行分類,視頻壓縮分爲幀內壓縮和幀間壓縮。

幀內壓縮顧名思義,就是對於每一幀圖像本身進行壓縮,這點和圖片壓縮原理是一樣的,通過幀內壓縮,視頻的體積就已經可以大大縮小了。而我們要說的重點是幀間壓縮。視頻中的圖像幀之間是有很多冗餘信息的,比如兩個人在對話時,畫面背景一般是不動的,那麼每一幀畫面中的背景信息都是冗餘信息。幀間壓縮就是利用了這個原理,只記錄關鍵的圖像幀(關鍵幀),以及圖像之間的變化信息,將冗餘信息進行壓縮,在解壓縮時,再通過關鍵幀和變化信息,結合預測技術,將所有圖像幀進行還原。

可以說,幀內壓縮解決的是圖像中的空間冗餘,而幀間壓縮解決的是視頻中的空間冗餘。很多壓縮技術都會同時使用幀內壓縮和幀間壓縮。常見的視頻壓縮技術有如下幾種:

  • MPEG-2:是 MPEG (又遇到它了)組織制定的視頻和音頻有損壓縮標準之一,多用於 DVD 和數字電視中。
  • H.264:也叫 AVC(Advanced Video Coding),現在最流行的視頻壓縮技術,是 MPEG-4 標準中視頻壓縮技術的具體實現,同時使用幀內壓縮和幀間壓縮,壓縮率和效率都很好,是在線視頻,直播,視頻通話領域使用的最多的視頻壓縮技術。
  • H.265:H.264 的升級版本,全稱爲高效視頻編碼(High Efficiency Video Coding,即HEVC)。原理和 H.264 相似,但是相較於之前的H.264標準有了相當大的改善,僅需原來的一半帶寬就可以播放相同質量的視頻。H.265 也在慢慢普及開來,但是由於很多場景下 H.264 就夠用,所以暫時還未取代 H.264。
  • Prores:蘋果推出的編解碼技術,視頻質量較高,常用於影視剪輯。
  • GoPro CineForm:是專爲編輯高分辨率素材而設計的跨平臺中間編解碼器,編碼效率高,編碼後的視頻質量高,常用於影視剪輯。
  • VP8/VP9:Google 開發的開放格式、無使用授權費的視頻壓縮標準,VP9 是 VP8 的升級版,也是谷歌瀏覽器內嵌支持的壓縮技術。Youtube 視頻就採用 VP9 編碼。VP9 和 H.265 或許是將來最流行的兩種壓縮技術。

H.264 編碼原理介紹

H.264 是現在最流行的編解碼技術,下面簡單介紹下其原理,以及一些基本概念。

H.264 的幀內壓縮和圖片壓縮類似,但是多了一些用於視頻方面的技術,例如宏塊和子塊劃分,預測機制,熵編碼,環路濾波等等,最終的壓縮率也比圖片壓縮率高得多(能壓縮到原始數據的百分之一)。具體原理非常複雜,這裏就不多介紹了。

H.264 會將圖像壓縮爲不同類型的幀:I幀,P幀,B幀,具體解釋如下:

  • I幀:關鍵幀,採用幀內壓縮技術。可以理解爲這一幀畫面的完整保留,解碼時只需要本幀數據就可以完成。
  • P幀:向前參考幀,在壓縮時,只參考前面已經處理的幀。P幀採用幀間壓縮技術,沒有完整畫面數據,只有與前一幀的畫面差別的數據。P幀存儲的是這一幀跟之前的一個關鍵幀或P幀的差別,解碼時需要用之前緩存的畫面疊加上本幀定義的差別,生成最終畫面。
  • B幀:雙向參考幀,在壓縮時,它即參考前而的幀,又參考它後面的幀。B幀同樣採用幀間壓縮技術,記錄本幀與前後幀的差別(具體比較複雜,有多種情況),換言之,要解碼B幀,不僅要取得之前的緩存畫面,還要解碼之後的畫面,通過前後畫面的與本幀數據的疊加取得最終的畫面。B幀壓縮率高,但是解碼時需要較高的性能。

只看解釋還是比較難理解,我們使用 Elecard Streameye Tools(一個H.264分析工具)來打開一個H.264編碼文件來具體分析就比較好理解了。如下圖所示:
H.264分析
圖中紅色條表示 I 幀,藍色條表示 P 幀,綠色條表示 B 幀。可以明顯看到三者的數據量差別(縱軸)。先來看 I 幀:
I幀
I幀就是一幅完整的圖像,圖像中的網格就是編碼的基本單元(宏塊/子塊),顏色變化較小的地方使用大一些網格,顏色複雜的地方網格更密集。I幀包含完整的圖像信息,解碼時使用I幀數據就可以解出完整圖像。

再看 P 幀:
P幀
P幀中除了網格之外,還有一些紅色的線,這些紅線被稱爲運動矢量,P幀存儲的是這一幀跟之前的一個I幀或P幀的差別,依靠的就是這些運動矢量,在解碼時,參考前一幀以及存儲的差別,來還原一幀畫面。

再看 B 幀:
B幀
其實 B 幀原理和P幀差不多,只是需要雙向預測,所以有兩種運動矢量。

再談比特率(碼率)

在講音頻壓縮時,我們就提到過比特率(bitrate,碼率),視頻中的碼率指的是視頻每秒鐘播放或傳輸的數據量,單位爲 bit/s 或 bps。對於 1080P,YUV 4:2:0,每秒24幀的原始視頻,其碼率爲:1920 * 1080 * (8 + 2 +2)* 24 = ‭579,502,080‬ bps = 565920 Kbps,這種視頻顯然是無法在線播放的,這也就是視頻壓縮技術要解決的問題。

對於音頻來說,MP3,WMA 格式的在線音樂,碼率一般爲 128Kbps,音質就很好了。但是對於視頻來說,卻不能一概而論,因爲視頻分辨率不同,碼率肯定不同,視頻分辨率越大,相對來說對碼率的要求越高。

以 H.264 壓縮爲例,推薦的碼率如下(數據來源 http://www.lighterra.com/papers/videoencodingh264/):

Name Resolution Bitrate (Mbps) Video (kbps) Audio (kbps)
360p 640x360 0.96 896 64
480p 848x480 1.28 1216 64
720p 1280x720 2.56 2496 64
720p HQ 1280x720 3.20 3072 128
1080p 1920x1080 5.12 4992 128
1080p HQ 1920x1080 7.68 7552 128

注:視頻文件一般都包含音頻,故列出了音頻比特率。

以 1080p 爲例,我們計算一下,5.12Mbps = 5242Kbps,是YUV原始視頻比特率的百分之一。換算成 Byte,約爲 0.64MByte 每秒,這一秒中的數據量裏包含了I,P,B幀,其中 I幀佔大多數。

H.264 編碼的碼率是可調的,降低碼率,則視頻大小會縮小,視頻質量會下降(每幀圖片被壓縮的更嚴重),反之亦然。

固定碼率和可變碼率

固定碼率(CBR)顧名思義,整個視頻碼率是固定的,即每秒的數據量恆定,很顯然,這種碼率計算方法最簡單。但是,很多視頻中的圖像細節豐富程度是隨時間變化的,兩個人對話時,畫面基本上沒什麼變化,兩個人打鬥時,畫面變化大,單位時間內的數據肯定更加複雜。此時如果使用固定碼率,則有時碼率會浪費,有時碼率不夠用,細節丟失,所以H.264 也支持可變碼率(VBR),即碼率按需分配,簡單的場景碼率低,複雜的場景碼率高。

聽上去 VBR 很美好,但是 VBR 對計算機性能要求更高,找出哪些場景簡單,哪些場景複雜,本身就需要很大的計算量。不同碼率模式有不同的作用,例如直播時一般選擇 CBR,因爲直播是錄製的同時就要編碼,進行網絡傳輸,很難計算出場景的複雜度變化,但是如果是已有的視頻素材進行壓縮,則使用 VBR就更合適。

除此之外還有固定質量碼率(CRF),可以讓觀感畫質保持在一定的水準,也經常使用。

當然,說一個視頻的碼率,一般指的是平均碼率,例如 bilibili 上傳視頻的要求:
bilibili上傳視頻要求
第一行指的就是平均碼率,第二行指的則是可變碼率下的最高碼率。

GOP

GOP:Group of Picture,每一組 I,P,B 幀被稱爲一組,GOP 的值就表示這一組總共多少幀,也就是說一個 I 幀之後要經過多少幀纔會出現下一幀。

GOP值和視頻質量有一定的關係 ,GOP 值越小,說明 I 幀越多,由於單個 I幀的數據量比較大,碼率一定的情況下,如果 I 幀太多,每個 I 幀分到的數據量就要減少,則畫面質量就會下降。發過來,GOP 值越大,說明 P,B幀越多,每個 I 幀的畫面就能越精細,但是 P,B幀數據要計算才能得出,對計算機性能要求比較高,且 P,B幀的質量會受 I 幀影響,所以GOP值也不宜設置過大。另外在遇到場景切換的情況時,H.264編碼器會自動強制插入一個I幀,此時實際的GOP值被縮短了。

視頻封裝格式

視頻拍攝的同時也會錄製音頻,所以數字視頻一般都會包含數字音頻。其實視頻中的畫面數據和音頻數據是互相獨立的,但是最終會被封裝進同一個文件中,要將音頻和視頻封裝在一起,就需要使用封裝技術。使用某種封裝技術的視頻一般稱爲某種格式的視頻,這和音樂格式類似。視頻封裝格式也被稱爲容器。

常用的封裝格式:

  • MP4:有 MPEG (又是他)組織制定的標準,最流行的視頻封裝格式。其實 MP4 標準非常龐大,甚至 H.264 壓縮和 MP4 封裝格式都是其中的一部分,只不過簡稱 MP4。
  • AVI:微軟於1992年11月推出的,作爲其Windows視頻軟件一部分的一種多媒體容器格式,也比較流行。
  • MKV:是一種開放標準的自由的封裝格式,能夠在一個文件中容納無限數量的視頻、音頻、圖片或字幕軌道,幾乎成爲了萬能的媒體容器,現在也越來越流行。
  • FLV:Flash Video 簡稱,由於FLV文件體積小巧,CPU佔有率低、視頻質量良好,這些年在網絡上盛行,大多在線視頻網站均採用FLV格式文件提供視頻。
  • RMVB:曾經最流行的封裝格式,DVD 中用的比較多,前些年網上各種盜版電影用的都是它。

視頻轉碼

其實視頻轉碼本質上是一個先解碼,再編碼的過程。但是我們已經知道了,視頻編碼和視頻封裝是兩回事,不同的封裝格式,其內部可能使用的是同樣的編碼技術。比如將 FLV 視頻轉爲 MP4視頻,如果內部都是 H.264 編碼,根本不需要解碼,直接換一下封裝格式信息就行了。但是如果要把 Youtube 下載的視頻轉爲 MP4,那就得解碼再編碼了,因爲 Youtube 視頻用的是 VP9編碼,MP4不支持。

推薦一個轉碼工具 MediaCoder

視頻播放器原理

首先介紹一個非常好用的播放器:PotPlayer,無廣告,不流氓,功能強大。

我們經常使用播放器,播放器播放的是封裝格式,一般的原理如下:
視頻播放器原理
其實這張圖中的術語我們都講過了,結合之前的文章,應該不難理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章