視頻壓縮(編碼)技術簡介
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編碼文件來具體分析就比較好理解了。如下圖所示:
圖中紅色條表示 I 幀,藍色條表示 P 幀,綠色條表示 B 幀。可以明顯看到三者的數據量差別(縱軸)。先來看 I 幀:
I幀就是一幅完整的圖像,圖像中的網格就是編碼的基本單元(宏塊/子塊),顏色變化較小的地方使用大一些網格,顏色複雜的地方網格更密集。I幀包含完整的圖像信息,解碼時使用I幀數據就可以解出完整圖像。
再看 P 幀:
P幀中除了網格之外,還有一些紅色的線,這些紅線被稱爲運動矢量,P幀存儲的是這一幀跟之前的一個I幀或P幀的差別,依靠的就是這些運動矢量,在解碼時,參考前一幀以及存儲的差別,來還原一幀畫面。
再看 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 上傳視頻的要求:
第一行指的就是平均碼率,第二行指的則是可變碼率下的最高碼率。
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,無廣告,不流氓,功能強大。
我們經常使用播放器,播放器播放的是封裝格式,一般的原理如下:
其實這張圖中的術語我們都講過了,結合之前的文章,應該不難理解。