ios音視頻--H264結構與碼流

H264結構

我們通過H264壓縮技術得到了一幀幀的H264視頻幀, 每一個視頻幀實際上是一個結構化的東西, 我們看下面這個圖:

H264結構圖

這張圖的最上面是一串壓縮后的視頻幀序列, 我們?nèi)∑渲械囊粠? 我們可以看到, 每一幀(或者說圖像)都是由多個片組成, 每一個片都是由一個個宏塊組成, 每一個宏塊又可以分成多個子塊, 這就是一個H264幀的結構.

H264編碼分層

H264在編碼的時候分成了兩層: NAL層和VCL層

NAL層

NAL層(Network Abstraction Layer, 視頻數(shù)據(jù)網(wǎng)絡抽象層). 它的作用是拆包和組包, 我們編碼的H264最終要在網(wǎng)絡上進行傳輸, 以太網(wǎng)的傳輸單元是每個包不能超過1500個字節(jié), 而H264的幀往往大于1500字節(jié), 所以我們需要對它進行拆包, 講一個幀拆成多個包進行傳輸. 所有的拆包和組包都是通過NAL層去處理的.

VCL層

VCL層 (Video Coding Layer, 視頻數(shù)據(jù)編碼層). 它的作用就是對視頻原始數(shù)據(jù)進行壓縮.

碼流的基本概念

SODB (String of Data Bits, 原始數(shù)據(jù)比特流), 因為它是流, 所以它的長度不一定是8的整數(shù)倍. 它是由VCL層產(chǎn)生的, 因為它不是8的整數(shù)倍所以處理起來比較麻煩

RBSP (Raw Byte Sequence Payload, SODB + trailing bits) 算法是在SODB最后一位補1, 不按字節(jié)對齊補0, 如果補齊0, 不知道在哪里結束, 所以補1, 如果不夠8位則按位補0.

EBSP (Encapsulate Byte Sequence Payload) 就是生成壓縮流之后, 我們還要在每個幀之前加一個起始位, 起始位一般是十六進制的0001. 但是在整個編碼后的數(shù)據(jù)里, 可能會出來連續(xù)的2個0x00. 那這樣就與起始位產(chǎn)生了沖突, 這應該怎么處理呢? H264規(guī)范里說明了處理2個連續(xù)的0x00, 就額外增加一個0x03, 這樣就能預防壓縮后的數(shù)據(jù)與起始位產(chǎn)生沖突.

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 散列表,它是基于快速存取的角度設計的,也是一種典型的“空間換時間”的做法。顧名思義,該數(shù)據(jù)結構可以理解為一個線性表...
    yeying12321閱讀 3,706評論 0 6
  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當在唯一索引所對應的列上鍵入重復值時,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 5,407評論 0 9
  • 作者:July、wuliming、pkuoliver 說明:本文分為三部分內(nèi)容,第一部分為一道百度面試題Top K...
    cyj_ya閱讀 829評論 0 0
  • HASH 現(xiàn)在在處理App的用戶敏感信息方面,大部分都是采用HASH加密的方式來進行處理。 關于哈希算法 詳細看這...
    Phant閱讀 11,405評論 0 0
  • 邁騰今天晚上著車了,在打車時,油管和氣管搞混了,遲疑了半天,還是那么裝上了,打不著,發(fā)現(xiàn)不對,倒過來,著車了,但是...
    京心達查曉旭閱讀 164評論 0 0