[音視頻開發]H264科普

H264屬於一種編碼格式,使用很多非常牛逼的算法。最終實現了視頻數據量的壓縮。

打個比方 1920*1080的nv21數據,一幀就有

差不多3M的數據量,那麼假設視頻傳輸的FPS是30,這已經很低了吧,那也達到了接近100M/S的數量流量。這誰頂的住啊。

以上只是吹個牛逼,介紹一下視頻編碼的重要性。

我們如果做相應的開發,一般來說不需要知道它用了多麼牛逼的算法,只要知道大致的碼流結構,然後呢,取出符合解碼器規範的原始數據,送進去解析。如果成功了,就可以關機下班了。

一 框架

H264碼流分爲兩層

1、VCL(Video Coding Layer 視頻編碼層):我的理解也就是原始數據唄

2、NAL(Network Abstraction Layer 網絡提取層): 在網絡傳輸,或者存儲在本地存儲器上面,還是需要一個結構來打包的,這個就是包裹在VCL外面的NAL層

二 原理

大致就是一些什麼關鍵幀壓縮啊,幀間預測啊,什麼量化、變換、濾波啊這些,反正就是牛逼

三 編碼格式

這個和第一節聯合起來看

VCL數據在傳輸或者存儲之前要被封裝進NAL單元中,每個NAL單元包括了一個原始字節序列負載(RBSP Raw Byte Sequence Payload)和NAL頭,這個RBSP的最後還有一個0x01 還有若干個0x00,用於字節對齊,如下圖

可以看到結構還是比較簡單基本就是一個NAL頭帶着一些RBSP數據

四 NAL Header

這個header還是比較重要的,因爲在報文解析的時候需要對NAL頭進行分析才能正確的取出SPS、PPS還有原始幀數據。

NAL Header只有一個字節

語法: 禁止位(1位)、重要性指示位(2位)、NALU類型(5位)

禁止位(0): 如果這個位爲1,那麼說明這個NAL單元數據錯誤,應該丟棄

重要性指示位(1~2): 表示該NAL單元用於重建的重要性,值越大,越重要,取值0-11

NALU類型(3~7):具體定義如下,參見官方文檔

值得注意的是解碼中我們通常要識別紅框標出來的NAL單元類型,分別是I幀、SPS和PPS。

通過以上的總結我們知道了H.264碼流結構就是 一個字節的NAL頭拼上RBSP組成一個NAL單元,許多個NAL單元就組成了H.264碼流。可以說通往解析H.264文件大門的鑰匙我們還差最後一把,也就是NAL單元直接是如何分割的。很簡單在每個NAL單元之前還有一段Start Code

參考官方文檔

實際使用中也就是發現一組 0x00 0x00 0x00 0x01 或者 0x00 0x00 0x01 那麼說明是StartCode 那麼就進行NAL單元分割

知道這麼多就知道如何分析NAL碼流了,那麼我們實際的來分析一個H.264文件看看

文件可以看到紅框框出來三個NAL單元

NAL頭分別是 0x67、0x68還有0x06 

0x67:根據NAL頭定義分析 0x67 & 0x1F = 7,查表得出其類型是7,也就是SPS

0x68: 同上推導出類型是8 PPS

0x06推導出類型是6 SEI

那麼問題來了SPS PPS SEI究竟是什麼呢

這裏還是比較複雜的總結來說就是一些碼流的信息,比如寬高 FPS等

這裏我貼出幾個寫的不錯的博客可以參考

https://blog.csdn.net/lizhijian21/article/details/80982403

https://blog.csdn.net/y601500359/article/details/80943990

https://blog.csdn.net/nihaoshamozhiying/article/details/79555612

 

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