本文簡單介紹一下H264協定内容,都是項目中具體使用的,太詳細的不必介紹了,需要詳讀協定。
首先需要明确H264可以分為兩層:
1.VCL video codinglayer 視訊編碼層
2.NAL network abstraction layer 網絡提取層
對于VCL具體的編解碼算法這裡就不介紹了,隻介紹常用的NAL層,即網絡提取層,在demux的時候常用。這裡面包含了該視訊的一些metadata詳細資訊,是解碼的基礎。
首先每一幀的NAL單元的區分有兩種方式:
1.通過位元組區分,前四個位元組為size,後面緊跟資料,以此類推,過完size數後的四個位元組是下一個NAL單元的size,後面緊跟資料。
2.通過特殊字元确認,00 00 01(一般情況)或者00 00 00 01(NAL單元是一幀的開始)來區分NAL單元。
官方文檔解析NAL單元的表格如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZD9CX5RXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwVP0cVWxgmMZFDbHJWMxIjW1x2VlZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TN1AzNzUDN2EjNwITM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
比如一幀的開始是00 00 00 01 67,那麼00 00 00 01作為區分NAL單元的一個區分位,可以去掉。正式的NAL type是後面的67(16進制),二進制為:0110 0111
其中第一位是:Forbidden_zero_bit=0;
之後兩位是:Nal_ref_idc:表示NAL的優先級。0~3,取值越大,表示目前NAL越重要,需要優先受到保護。如果目前NAL是屬于參考幀的片,或是序列參數集,或是圖像參數集這些重要的機關時,本句法元素必需大于0。
後五位是:Nal_unit_type:目前NAL 單元的類型,參照上面表格中來确認類型。其中6和7比較重要,也就是所謂的PPS,SPS,包含了詳細的metadata資訊,是解碼的基礎。