H264基本知识
H264的壓縮比為1%
在格式為YUV420的情況下,分辨率為640x480,幀率為15,每秒傳輸640x480x15x1.5x8 = 55296000 bit = 55.296 Mbps,因此至少需要55Mb/s。但是H264的建議碼流為500kpbs,因此可見H264的壓縮率為1%
GOP(Group Of Pictures)
將視頻幀的相關性進行分組,比如一個GOP里面將一些變化不是很大的幀放在一塊,GOP內幀與幀差別很小,這樣就能利用一些算法,進行編碼,把這些幀壓縮的很小,把變化的部分作為保留,在GOP中,未變化的部分,進行一次存儲,這樣就能極大的減少存儲空間。在GOP中,存在3種幀,下面介紹這3種幀。
I幀(intraframe frame)
關鍵幀,采用幀內壓縮技術。IDR幀屬于I幀。視頻中最關鍵的一些幀,這些幀缺失了,視頻將無法播放。GOP中的第一幀一般是IDR幀。但是I幀并不一定是IDR幀。
P幀(forward Predicted frame)
向前參考幀。壓縮時,只參考前面已經處理的幀,采用幀間壓縮技術。它占I幀的一半大小
B幀(Bidirectionally predicted frame)
雙向參考幀。壓縮時,既參考前面已經處理的幀,也參考后面的幀,幀間壓縮技術。它
占I幀1/4 大小
IDR幀和I幀的區別和聯系
- IDR(Instantaneous Decoder Refresh) 解碼器立即刷新。這個幀來了以后,緩沖區的數據清空,因為該幀為關鍵幀,不需要依賴其他的幀。
- 每當遇到IDR幀時,解碼器就會清空解碼器參考buffer中的內容
- 每個GOP中的第一-幀就是IDR幀
- IDR幀是一種特殊的I幀
幀與分組的關系
I幀被B幀和P幀參考,B幀之間不能互相參考,B幀可以參考I幀和P幀,P幀參考I幀,后面的P幀參考前面的P幀。先解碼I幀,然后解碼P幀,最后解碼B幀。播放時,按順序播放即可。
SPS (Sequence Parameter Set)
序列參數集,作用于一-串連續的視頻圖像。 如
seq_ parameter_ set_ id、幀數及POC(picture order count)的約束、參考幀數目、解碼圖像尺寸和幀場編碼模式選擇標識等。
PPS (Picture Parameter Set)
圖像參數集,作用于視頻序列中的圖像。如pic_ parameter_ set_ id、 熵編碼模式選擇標識、片組數目、初始量化參數和去方塊濾波系數調整標識等。SPS和PPS是在IDR幀之前成對出現的。
H264壓縮技術(算法)
- 幀內壓縮:解決的是空域數據冗余問題,有損壓縮。
- 幀間壓縮:解決的是時域數據冗余問題,有損壓縮。
- 整數離散余弦變換( DCT) , 將空間上的相關性變為頻域上無關的數據然后進行量化,無損壓縮。
- CABAC壓縮,無損壓縮。
宏塊
宏塊是視頻壓縮操作的基本單元,無論是幀內壓縮還是幀間壓縮,它們都以宏塊為單位。
上面的是原始的一幀。
H264宏塊劃分
宏塊具體的表現,壓縮算法將對該宏塊進行壓縮。
宏塊劃分完成以后的樣子。
H.264子塊劃分
他可以將一幅圖片劃分為好多個宏塊,劃分的宏塊越小,對圖片的控制越好,但是如果圖片中,類似于純色背景這樣的圖片,宏塊劃分越大,處理速度越快。
MPEG 2 和 H.264
在這幅圖片中體現出了,H.264的壓縮比大于MPEG 2.
宏塊的尺寸
通常情況下,宏塊為16x16,但是同時16x16又可以進一步進行劃分。
楨內預測
H.264在幀內預測是使用的是宏塊間的預測,即判斷兩個宏塊之間的像素差別在哪。圖片中相臨像素差別不大,所以可以進行宏塊預測,同時人對亮度的敏感度超過色度。由于H.264是對YUV數據進行壓縮,YUV420大部分數據集中在亮度上,所有可以通過亮度或者灰度進行對圖像的預測。
H.264的幀內預測模式
H.264有9種幀內預測模式,判斷預測區域屬于那種預測模式,因此只需要寫入預測模式的需要即可。
下圖展示了九種預測模式。
預測模式的row和column代表已經預測出來的像素。根據這9種模式進行預測其他地方的像素。
不同模式預測的結果
縱向模式,可以看出ABCD下面的像素都遵從它的列頭。
同理,橫向模式也是一樣。
這一種模式是求平均值的方式。
以上所說的這9種例子,都是對灰度圖像進行處理的,色彩(UV分量)不參與。
對圖像的某些區域可以使用這9種模式,效果很理想,這樣可以大大降低圖像的存儲空間。
幀內預測圖像比較
可以看出預測的圖片和原始圖片的效果,很多地方很模糊。
這時就需要幀內預測殘差值登場了。
這個殘差值就相當于一個偏置項一樣,對圖像的預測結果進一步糾正,這個殘差是通過原始圖像和預測圖像對比計算出來的。因此在存儲時,要存儲預測模式+殘差,保證了圖像不失真,降低了圖像粗處空間。
幀間壓縮
幀間壓縮是在GOP內,根據參考幀,使用宏塊匹配的基礎找出幀與幀之間的運動矢量,即就是在參考幀當中某個宏塊,對比其他幀之間這個幀的宏塊位置,找到它的運動大小和運動方向,這就是運動估計(宏塊匹配+運動矢量),還有運動補償技術,在解碼時,將運動補償加上。
關鍵技術為:
- GOP
- 參考鎮
- 運動估計
- 運動補償
上面圖片是宏塊查找的例子,查找出運動矢量。
常見的宏塊查找算法
- 三步搜索法
- 二維對數搜索
- 四部搜索
- 鉆石搜索
視頻產生花屏的原因
如果GOP分組中有幀丟失,會造成解碼端的圖像發生錯誤,這會出現馬賽克(花屏)
視頻卡頓的原因
為了避免花屏問題的發生,當發現有幀丟失時,就丟棄GOP內的所有幀,直到下一個IDR幀重新刷新圖像。
I幀是按照幀周期來的,需要一個比較長的時間周期 ,如果在下一個I幀來之前不顯示后來的圖像,那么視頻就靜止不動了,這就是出現了所謂的卡頓現象。
無損壓縮技術
視頻經過了有損壓縮,H.264認為壓縮還是不夠小,任何需要進一步的壓縮。
DCT(離散余弦變換)變換
離散傅里葉變換需要進行復數運算,盡管有FFT可以提高運算速度,但在圖像編碼、特別是在實時處理中非常不便。離散傅里葉變換在實際的圖像通信系統中很少使用,但它具有理論的指導意義。根據離散傅里葉變換的性質,實偶函數的傅里葉變換只含實的余弦項,因此構造了一種實數域的變換——離散余弦變換(DCT)。通過研究發現,DCT除了具有一般的正交變換性質外,其變換陣的基向量很近似于Toeplitz矩陣的特征向量,后者體現了人類的語言、圖像信號的相關特性。因此,在對語音、圖像信號變換的確定的變換矩陣正交變換中,DCT變換被認為是一種準最佳變換。在近年頒布的一系列視頻壓縮編碼的國際標準建議中,都把 DCT 作為其中的一個基本處理模塊。
參考博客:https://blog.csdn.net/allen_sdz/article/details/83279210
有損壓縮后數據:
經過DCT變換后的數據,數據被移動到了左上角。
VLC壓縮技術(可變長的編碼)
類似于哈夫曼編碼
CABAC壓縮
VLC是MPEG2的壓縮技術
CABAC是H.264的壓縮技術,CABAC有著比VLC更好的壓縮率。
H.264編碼流程
Fn是幀內預測,Fn-1‘是幀間預測(需要經過運動評估和運動補償),兩個步驟都要經過DCT轉化,量化編碼以及熵編碼,到達NAL層。解碼時進行反向操作。
H.264碼流分層
NAL層(Network Abstraction Layer)視頻數據網絡抽象層
為什么需要增加NAL層?在二進制傳輸過程中,為了防止二進制傳輸數據亂序、丟包和重傳。
VCL層(Video Coding Layer)視頻數據編碼層
在視頻幀有好多個圖像,一個圖像內又有多個slice,在一個slice里面,包含多個宏塊。一般情況下,一個圖像僅僅包含一個slice
碼流的基本概念
SODB(String of Data Bits)
原始數據比特流,長度不一定是8的倍數,故需要補齊。它是由VCL層產生的。
RBSP(Raw Byte Sequence Payload)
SODB + trailing bits
算法: 如果SODB的最后一個字節不對齊,則補1和多個0。
NALU
H264切片
NAL Header(1B)+ RBSP
Slice和MacroBlock
碼流分層
Annexb格式比RTP格式出一個StartCode頭,Annexb格式時文件開頭的,RTP格式是在網絡上傳輸時使用的。
總結
- 上一篇: 我的OpenBSD配置文件
- 下一篇: 2022城市辅助驾驶赛道陷入“三国争霸”