音視訊--視訊入門

kirito_song發表於2018-12-25

H264

單純傳輸視訊畫面,視訊量非常大,對現有的網路和儲存來說是不可接受的。

為了能夠使視訊便於傳輸和儲存,人們發現視訊有大量重複的資訊,如果將重複資訊在傳送端去掉,在接收端恢復出來,這樣就大大減少了視訊資料的檔案,因此有了H.264視訊壓縮標準。

I幀

又稱為關鍵幀或者幀內編碼幀,採用幀內壓縮技術。

是一種自帶全部資訊的獨立幀,無需參考其他影象便可獨立進行解碼,可以簡單理解為一張靜態畫面。視訊序列中的第一個幀始終都是I幀,因為它是關鍵幀。

P幀

又稱為向前參考幀幀間預測編碼幀,採用幀間壓縮技術。

除了I幀之外的所有幀,全部向前依賴。

所有幀都只儲存與前一幀的差異,以達到高壓縮率的效果。

解碼時需要用之前快取的畫面疊加上本幀定義的差別,生成最終畫面。

B幀

又稱為刷雙向參考幀,屬於幀間壓縮技術。

即參考前一幀,也參考後一幀。以達到比P幀更高的壓縮效果。

也就是說要解碼B幀,不僅要取得之前的快取畫面,還要解碼之後的畫面,通過前後畫面的與本幀資料的疊加取得最終的畫面。對於直播業務,B幀比P幀永遠要慢一點。

B幀壓縮率高,但是對解碼效能要求較高。

比較

  • I幀只需考慮本幀

  • P幀記錄的是與前一幀的差別

  • B幀記錄的是前一幀及後一幀的差別

      能節約更多的空間,視訊檔案小了,但相對來說解碼的時候就比較麻煩。
      因為在解碼時,不僅要用之前快取的畫面,而且要知道下一個I或者P的畫面,對於不支援B幀解碼的播放器容易卡頓。
    複製程式碼

視訊監控系統中預覽的視訊畫面是實時的,對畫面的流暢性要求較高。採用I幀、P幀進行視訊傳輸可以提高網路的適應能力,且能降低解碼成本所以現階段的視訊解碼都只採用I幀和P幀進行傳輸。


GOP

Group of Pictures 一組幀

相似畫面的一組幀

如下圖所示,兩個I幀之間的所有幀,叫做一組幀。

音視訊--視訊入門

具體的劃分細節,在下面《幀分組》的部分會提到

SPS

序列引數集 Sequence Parameter Set

包含一組幀中:存放幀數、參考幀數目、解碼影象尺寸、幀場編碼模式選擇標識等

PPS

影象引數集 Picture Parameter Set

包含一組幀中:存放熵編碼選擇模式標識、片組數目、初始量化引數和去方塊過濾波係數調整標識等

在一組幀中,SPS與PPS也屬於I幀。


視訊出現花屏、卡頓的原因

  • 丟幀造成花屏

    當一組幀中丟失了某一幀,就會造成某個部分沒有完成更新。造成花屏。

  • 丟GOP造成卡頓

    為了避免花屏的問題,當發現I幀或P幀丟失,則不現實本GOP中所有的內容。知道下一個I幀到達後重新重新整理影象。


視訊編解碼器

  • x264/x265

x264是目前使用最廣泛的H264編解碼器(主要用來編碼,解碼用ffmpeg)。 x265的壓縮率比x264更高,效能的消耗也更大。

  • openH264

相對x264效能較低,但支援SVC技術。

SVC可以將視訊分層傳輸:

可以對使用者頻寬進行不同策略的定製方案:將一幀資料分為小、中、大三個部分,根據對方網路情況分別追加傳送。

接收到的部分越多,最後組合起來的視訊就越清晰。

但由於很多手機不支援SVC編碼,所以需要使用軟編處理,會對CPU產生損耗。

  • vp8/vp9

Google出品,分別對應x264/x265


H264壓縮技術

這部分最後發現李超老師自己已經寫過部落格了,建議去看原文

幀內預測壓縮

解決空域資料的冗餘問題

空域資料,類似音訊中的超聲波段,不容易甚至不會被人類注意識別。

幀間預測壓縮(運動估計與補償)

解決時域資料的冗餘問題

時域資料,對於監控之類靜止不動的畫面,對幀與幀之間重複的資料進行計算壓縮。

整數離散餘弦變換(DCT)

將空間上的相關性變為頻域上無關的資料然後進行量化

CABAC壓縮(無失真壓縮)

類似哈夫曼無損編碼

巨集塊劃分

對於一段視訊,首先會被送到 H264 編碼器的緩衝區中,併為每一幀圖片進行巨集塊的劃分

  • 劃分巨集塊

    H264預設是使用 16X16 大小的區域作為一個巨集塊,也可以劃分成 8X8 大小。

    音視訊--視訊入門

  • 計算巨集塊的象素值

    對巨集塊中的每一個畫素點進行計算

    音視訊--視訊入門
    最終一幅圖會變成這個樣子
    音視訊--視訊入門

  • 劃分子塊

    對於複雜的圖片或區域性,H264可以對巨集塊進行更細緻的劃分以達到更高的壓縮率,比如8X16、 16X8、 8X8、 4X8、 8X4、 4X4

    音視訊--視訊入門
    這樣對於小區域性畫素顏色相同的子塊,就可以用很少的資訊進行表示
    音視訊--視訊入門

幀分組

巨集塊劃分好後,還需要對編碼器快取中所有的圖片進行分組(GOP)

幀間預測壓縮主要在這裡解決時域資料的冗餘問題:

對於某些關聯特別密切的幀,其實我們只需要儲存一幀的資料,其它幀都可以通過這一幀再按某種規則預測出來,所以說視訊資料在時間上的冗餘是最多的。

如何判定兩幀處在一個GOP中?以一個的檯球桌的視訊為例:

音視訊--視訊入門

H264編碼器會按順序,每次取出兩幅相鄰的幀進行巨集塊比較,計算兩幀的相似度。如下圖:

音視訊--視訊入門
通過巨集塊掃描與巨集塊搜尋可以發現這兩個幀的關聯度是非常高的。進而發現這一組幀的關聯度都是非常高的。因此,上面這幾幀就可以劃分為一組。

其演算法是:在相鄰幾幅影象畫面中,一般有差別的畫素只有10%以內的點,亮度差值變化不超過2%,而色度差值的變化只有1%以內,我們認為這樣的圖可以分到一組。

幀間壓縮技術(運動估計與補償)

也叫運動估計與補償,用於壓縮時間層面的冗餘,清除相同資料。

對於一組幀,需要計算運動物體的運動向量:

H264編碼器首先按順序從緩衝區頭部取出兩幀視訊資料,然後進行巨集塊掃描。當發現其中一幅圖片中有物體時,就在另一幅圖的鄰近位置(搜尋視窗中)進行搜尋。如果此時在另一幅圖中找到該物體,那麼就可以計算出物體的運動向量了。

下面這幅圖就是搜尋後的檯球移動的位置

音視訊--視訊入門

H264依次把每一幀中球移動的距離和方向都記錄下來就成了下面的樣子

音視訊--視訊入門

運動向量計算出來後,將相同部分(也就是綠色部分)減去,就得到了補償資料。我們最終只需要將補償資料進行壓縮儲存,以後在解碼時就可以恢復原圖了。壓縮補償後的資料只需要記錄很少的一點資料。如下所示

音視訊--視訊入門

幀內壓縮技術

人眼對圖象都有一個識別度,對低頻的亮度很敏感,對高頻的亮度不太敏感。所以基於一些研究,可以將一幅影象中人眼不敏感的資料去除掉。這樣就提出了幀內預測技術。

H264的幀內壓縮與JPEG很相似。一幅影象被劃分好巨集塊後,對每個巨集塊可以進行 9 種預測模式。找出與原圖最接近的一種預測模式。幀內預測後的影象與原始影象的對比如下:

音視訊--視訊入門

將預測影象與原影象對比得到殘差值,解碼時根據記錄下來的預測模式殘差值,即可還原出原本的影象。

DCT壓縮

可以將殘差值整數離散餘弦變換,去掉資料的相關性,進一步壓縮資料。

比如:

音視訊--視訊入門

壓縮後變成

音視訊--視訊入門

VLC與CABAC(無失真壓縮)

根據資訊出現的頻率,對整體進行壓縮

參考哈夫曼編碼:對高頻資訊使用短碼,而低頻資訊使用長碼進行壓縮。

MPEG-2中使用的VLC就是這種演算法

音視訊--視訊入門

而在H264中,使用CABAC進行壓縮,不只對頻率進行壓縮,還根據上下文進行進一步壓縮

音視訊--視訊入門

對於視訊幀,在有了上下文之後,剩下的幀會進一步壓縮

音視訊--視訊入門


H264結構與碼流

H264結構

音視訊--視訊入門

從大到小,H264的視訊結構如下所示 視訊流 => N個視訊幀 => N個切片 => 切片頭+N個巨集塊 => N個子塊

H264編碼分層

  • NAL層

網路抽象層 乙太網單個資料包限制為1500位元組,NAL可以將單幀資料進行拆包與組包處理,以進行傳輸。

  • VCL層

視訊編碼層 對視訊的原始資料進行壓縮

H264碼流

  • SODB(String Of Data Bits)

原始資料位元流由NAL層產生。長度不一定是8位元組的倍數

  • RBSP(Raw Byte Sequence Packet)

SODB末尾補1,然後補零成8位。

  • EBSP(Encapsulate byte sequence payload)

起始標記的格式化

  • NALU(NAL Unit)

EBSP前加一個1B的網路頭

音視訊--視訊入門


NALU

NALU HEADER

NALU 頭部資訊,由三部分構成

音視訊--視訊入門

對於Type(nal_unit_type):

1, 2, 3, 4, 5及12的NAL單元稱為VCL的NAL單元,其他型別的NAL單元為非VCL的NAL單元。

0:未規定
1:非IDR影象中不採用資料劃分的片段
2:非IDR影象中A類資料劃分片段
3:非IDR影象中B類資料劃分片段
4:非IDR影象中C類資料劃分片段
5:IDR影象的片段
    IDR幀屬於I幀,此位置代表關鍵幀的一部分
6:補充增強資訊 (SEI)
7:序列引數集/SPS
8:集影象引數/PPS
    SPS和PPS都是特殊的NALU。一個MP4檔案只有一個SPS,但是有很多PPS,SPS必須在所有NALU的最開頭。
9:分割符
10:序列結束符
11:流結束符
12:填充資料
13 – 23:保留
24 – 31:未規定 (27、28表示為分片NALU)
複製程式碼

NAL

單一型別

一個RTP資料包中只包含一個NALU(切片)

很多P幀、B幀都是單一型別

組合型別

一個RTP資料包中包含多個NALU

比如SPS、PPS通常就會放在同一個RTP資料包內進行傳送

分片型別

一個NALU被分片成多個RTP資料包傳送


影象的儲存格式

RGB

紅、綠、藍。每個元素1位元組,共24位

YUV

從電視系統中衍生出來的一套顏色編碼方式

  • Y

明亮度(灰階值)。基礎訊號,非黑即白

  • U&&V

色彩和飽和度。用於指定畫素顏色

  • YUV的格式

YUV常見格式可以參閱:YUV格式介紹

其中最常見的是YUV 4:2:0,相對RGB 8:8:8的格式,節省了很多空間。

YUV 4:2:0並不意味著沒有V分量,而是隻在相鄰的分行掃描中一行採用YUV 4:2:0,下一行採用YUV 4:0:2這種抽樣儲存。

  • YUV的儲存格式

可以參閱視訊儲存格式YUV420 NV12 NV21 i420 YV12


參考資料

視訊編碼之I幀 、P幀、B幀

H264基本原理

一些關於H.264的術語

H264中的NALU概念解析

TCP、UDP、RTP(RTCP)異同與區別

相關文章