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