摘要:H.264是新一代視頻編碼標準,具有廣泛的應用前景。本文主要研究了H.264碼流的問題。首先,介紹了H.264的簡單框架;其次,對碼流結構進行了分析,并概括出了碼流結構圖;最后,結合一個簡單試驗,給出了從H.264碼流中取得圖像寬度和高度的方法。
關鍵詞:H.264;NAL;碼流結構
中圖分類號:TP37文獻標識碼:A 文章編號:1009-3044(2008)36-2751-02
Analysis on the structure of coding streaming in H.264
GAO Qing, WANG Zhi-gang
(School of Computer Science Technology, Soochow University,Suzhou 215006,China)
Abstract: H.264 is the newest video coding standard, and it will be widely used. In this article, the problem of the structure of coding streaming in H.264 is discussed. Firstly, the simple profile of H.264 video is introduced. Secondly, the structure of coding streaming is discussed , and then give the graph on it. Finally, by a simple experiment, give the method of getting picture’s width and height from the coding stream.
Key words: H.264;NAL;structure of coding streaming
1 引言
H.264是新一代視頻編碼標準,具有廣泛的應用前景,是ITU-T的視頻編碼專家組(VCEG)和 ISO/IEC的活動圖像編碼專家組(MPEG)的聯合視頻組開發的一個新的數字視頻編碼標準,它既是ITU -T的H.264,又是ISO/IEC的MPEG-4的第10部分。H.264和以前的標準一樣,也是DPCM加變換編碼的混合編碼模式。它的應用目標廣泛,可滿足各種不同速率、不同場合的視頻應用,具有較好的抗誤碼和抗丟包的處理能力。H.264的基本系統無需使用版權,具有開放的性質,能很好地適應IP和無線網絡的使用,這對目前因特網傳輸多媒體信息、移動網中傳輸寬帶信息等都具有重要意義。
2 H.264框架介紹
H.264中定義了3個框架[2],每個框架都支持一系列的編解碼功能,相應的有一系列的應用。下面作下簡單的介紹:
1) 基線框架(Baseline Profile):它作為H.264的一個簡單版本,應用面很廣。它支持幀間和幀內編碼,支持I幀和P幀,支持CAVLC等,其主要應用是可視電話視頻會議,無線通信等。
2) 主框架(Main Profile):包括支持交錯視頻,支持B幀,主要是在幀間編碼時使用,權重預測,熵編碼使用,支持CABAC等。它的主要應用是視頻存儲和電視廣播。采用了多項提高圖像質量和增加壓縮比的技術措施,可用于SDTV,HDTV,DVD等。
3) 擴展框架(Extended Profile):不支持交錯視頻和CABAC,但增加了一些在進行比特流切換時有效的幀模式,SI Switching I幀和SP Switching P幀,能夠有效的提高從錯誤中恢復的能力。它的主要應用是各種網絡的視頻流傳輸應用。
3 H264碼流結構
3.1 H264分層結構
H.263定義的碼流結構是分級結構,共四層。自上而下分別為:圖像層(picturelayer)、塊組層(GOB layer)、宏塊層(macroblock layer)和塊層(block layer)。而與H.263相比,H.264的碼流結構和H.263的有很大的區別,它采用的不再是嚴格的分級結構。
H.264的功能分為兩層,視頻編碼層(VCL)和網絡提取層(NAL)VCL數據即被壓縮編碼后的視頻數據序列。在VCL數據要封裝到NAL單元中之后,才可以用來傳輸或存儲。
NAL單元格式[2] 如下表所示:

RBSP:封裝于網絡抽象單元的數據稱之為原始字節序列載荷RBSP,它是NAL的基本傳輸單元。其中,RBSP又分為視頻編碼數據和控制數據。其基本結構是:在原始編碼數據的后面填加了結尾比特。一個bit“1”若干比特“0”,以便字節對齊。
3.2 H.264碼流結構圖
通過相關知識的查閱,概括出H.264的碼流結構圖[2]如圖1所示。
4 H.264碼流分析的應用
在有些時候,需要從H.264碼流中直接取得相關信息(如:圖像的寬度和圖像的高度等等信息)。下面介紹下取得相關信息的方法:圖像的相關信息存儲在網絡提取層(NAL)的RBSP結構中,要取得圖像的相關信息,既要獲得圖像的相關位。需依據RBSP結構,獲得pic_width_in_mbs_minus1和pic_height_in_map_units_minus1兩個值,那么寬度為(pic_width_in_mbs_minus1+1)*16,高度為(pic_height_in_map_units_minus1+1)*16,但是有些情況還得考慮nNum_Ref_Frames的值,一般為1。
4.1 獲得試驗數據
設備:SUNNIC (IP Cam)
名字:ST100factory
Firmware版本:p8b8
視頻格式:H.264

圖1 H.264的碼流結構
1) 將設備分辨率設成176*144,使用Ethereal等抓包工具抓得一組數據,并去掉相應的RTP頭后,該數據為0x00,0x00,0x00, 0x01,0x67,0x42,0x00,0x1E,0x99,0xA0,0xB1,0x31。
2) 將設備分辨率設成720*240,使用Ethereal等抓包工具抓得一組數據,并去掉相應的RTP頭后,該數據為0x00,0x00,0x00, 0x01,0x67,0x42,0xE0,0x1E,0xDA,0x82,0xD1,0xF1。
3) 將設備分辨率設成720*480,使用Ethereal等抓包工具抓得一組數據,并去掉相應的RTP頭后,該數據為0x00,0x00,0x00, 0x01,0x67,0x42,0xE0,0x1E,0xDB,0x82,0xD1,0xF1。
4.2 相關程序的書寫
程序的關鍵代碼如下:
void GetH264Resolution(BYTE*pInBuf,intnHeight,intnWidth,intnNum_Ref_Frames)
{
……
UE_V(nIndex,nShiftCount,nShiftBuffer,nNum_Ref_Frames,pFrameHead);
DWORD gaps_in_frame_num_value_allowed_flag=0;MyShift(1,nIndex,nShiftCount,nShiftBuffer,gaps_in_frame_num_value_allowed_flag,pFrameHead);
DWORD pic_width_in_mbs_minus1=0;
UE_V(nIndex,nShiftCount,nShiftBuffer,pic_width_in_mbs_minus1,pFrameHead);
DWORD pic_height_in_map_units_minus1=0;UE_V(nIndex,nShiftCount,nShiftBuffer,pic_height_in_map_units_minus1,pFrameHead);
UE_V(nIndex,nShiftCount,nShiftBuffer,pic_height_in_map_units_minus1,pFrameHead);
nWidth=(pic_width_in_mbs_minus1+1)*16; //圖像的寬度
nHeight=(pic_height_in_map_units_minus1+1)*16;//圖像的高度
}
voidMyShift(intnCount,intnIndex,intnShiftCount,BYTEnShiftBuffer,DWORDnRecv,BYTE*pInBuf)
{//從數據流取得相應位的值。
while (nCount!=0)
{
if(nCount>nShiftCount)
{nRecv=nRecv< nRecv|=nShiftBuffer>>(8-nShiftCount); nShiftBuffer=pInBuf[++nIndex]; nCount-=nShiftCount; nShiftCount=8; }else {nRecv=nRecv< nRecv|=nShiftBuffer>>(8-nCount); nShiftCount-=nCount; nShiftBuffer<<=nCount; nCount=0; }} } 4.3 試驗結果與結論 1)將數據流0x00,0x00,0x00,0x01,0x67,0x42,0x00,0x1E,0x99,0xA0,0xB1,0x31放入GetH264Resolution,取得nWidth為176, nHeight為144,nNum_Ref_Frames為1。跟原數據比對,結果正確。 2)將數據流0x00,0x00,0x00,0x01,0x67,0x42,0xE0,0x1E,0xDA,0x82,0xD1,0xF1放入GetH264Resolution,取得nWidth為720, nHeight為240,nNum_Ref_Frames為1。跟原數據比對,結果正確。 3)將數據流0x00,0x00,0x00,0x01,0x67,0x42,0xE0,0x1E,0xDB,0x82,0xD1,0xF1放入GetH264Resolution,取得nWidth為720, nHeight為240,nNum_Ref_Frames為2。跟原數據比對,240正好是480的一半,而這里的nNum_Ref_Frames正好是2。查閱相關資料發現,這里為了讓數據能夠正常顯示,需要將2幀數據進行Interleave操作后,方能正常顯示。 H.264是新一代視頻編碼標準,具有廣泛的應用前景。應用此種方法,在解碼前,取得圖像的高度和寬度,在某些需要知道圖像的寬度和高度的場合,特別是在一些播放H264視頻的應用程序中,會有很大幫助。 參考文獻: [1] ITU-TRec. H.264/ ISO/IEC 14496-10:2005,H.264 Advanced video coding for generic audiovisual services[S]. [2] 嚴曉飛. H.264碼流結構的分析及其實現的優化[D]. 西安電子科技大學:西安電子科技大學,2007. [3] RICHARDSONI. H. 2 6 4 andMPEG-4Videocompression [M ].London: JohnW iley Sons, 2003.