H.264码流结构解析
大概前五六年之前寫過的一個大體分析H.264格式,不是很詳細,可以大致看看有哪些格式。?
H.264碼流結構解析
那個時候上傳的百度文庫,以前記得有多積分,現在都不能下載了,還要充錢才可以。真是~~~
1. H.264簡介
MPEG(Moving Picture Experts Group)和VCEG(Video Coding Experts Group)已經聯合開發了一個比早期研發的MPEG 和H.263性能更好的視頻壓縮編碼標準,這就是被命名為AVC(Advanced Video Coding),也被稱為ITU-T H.264建議和MPEG-4的第10 部分的標準,簡稱為H.264/AVC或H.264。這個國際標準已經與2003年3月正式被ITU-T所通過并在國際上正式頒布。為適應高清視頻壓縮的需求,2004年又增加了FRExt部分;為適應不同碼率及質量的需求,2006年又增加了可伸縮編碼 SVC。
2. H.264編碼格式
H.263定義的碼流結構是分級結構,共四層。自上而下分別為:圖像層(picturelayer)、塊組層(GOB layer)、宏塊層(macroblock layer)和塊層(block layer)。而與H.263相比,H.264的碼流結構和H.263的有很大的區別,它采用的不再是嚴格的分級結構。
H.264支持4:2:0的連續或隔行視頻的編碼和解碼。H.264壓縮與H.263、MPEG-4相比,視頻壓縮比提高了一倍。
H.264的功能分為兩層:視頻編碼層(VCL, Video Coding Layer)和網絡提取層(NAL, Network Abstraction Layer)。VCL數據即編碼處理的輸出,它表示被壓縮編碼后的視頻數據序列。在VCL數據傳輸或存儲之前,這些編碼的VCL數據,先被映射或封裝進NAL單元中。每個NAL單元包括一個原始字節序列負荷(RBSP, Raw Byte Sequence Payload)、一組對應于視頻編碼的NAL頭信息。RBSP的基本結構是:在原始編碼數據的后面填加了結尾比特。一個bit“1”若干比特“0”,以便字節對齊。
?
圖1 NAL單元序列
3. H.264傳輸
H.264的編碼視頻序列包括一系列的NAL單元,每個NAL單元包含一個RBSP,見表1。編碼片(包括數據分割片IDR片)和序列RBSP結束符被定義為VCL NAL單元,其余為NAL單元。典型的RBSP單元序列如圖2所示。每個單元都按獨立的NAL單元傳送。單元的信息頭(一個字節)定義了RBSP單元的類型,NAL單元的其余部分為RBSP數據。
?
圖2 RBSP序列舉例
表1 RBSP描述
4. H.264碼流結構圖
?
圖3 H.264碼流分層結構
起始碼:如果NALU對應的Slice為一幀的開始,則用4字節表示,即0x00000001;否則用3字節表示,0x000001。?
NAL Header:forbidden_bit,nal_reference_bit(優先級),nal_unit_type(類型)。?
脫殼操作:為了使NALU主體不包括起始碼,在編碼時每遇到兩個字節(連續)的0,就插入一字節0x03,以和起始碼相區別。解碼時,則將相應的0x03刪除掉。?
NALU類型:
表2 nal_unit_type語義
5. H.264解碼
NAL頭信息的nal_referrence_idc(NRI)用于在重建過程中標記一個NAL單元的重要性,值為0表示這個NAL單元沒有用預測,因此可以被解碼器拋棄而不會有錯誤擴散;值高于0表示NAL單元要用于無漂移重構,且值越高,對此NAL單元丟失的影響越大。?
NAL頭信息的隱藏比特位,在H.264編碼器中默認為0,當網絡識別到單元中存在比特錯誤時,可將其置為1。隱藏比特位主要用于適應不同種類的網絡環境(比如有線無線相結合的環境)。
?
圖4 NAL單元解碼
NAL單元解碼的流程為:首先從NAL單元中提取出RBSP語法結構,然后按照如圖4所示的流程處理RBSP語法結構。輸入的是NAL單元,輸出結果是經過解碼的當前圖像的樣值點。?
NAL單元中分別包含了序列參數集和圖像參數集。圖像參數集和序列參數集在其他NAL單元傳輸過程中作為參考使用,在這些數據NAL單元的片頭中,通過語法元素pic_parameter_set_id設置它們所使用的圖像參數集編號;而相應的每個圖像參數集中,通過語法元素seq_paramter_set_id設置他們使用的序列參數集編號。
6. 各分層結構的語法元素參考G50標準。
總結
以上是生活随笔為你收集整理的H.264码流结构解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ffmpeg推送摄像头rtmp流
- 下一篇: CAsyncSocket及CSocket