天天看點

H264的RBSP類型之AUD

AUD從哪來

Access Unit Delimiter通路單元分隔符

以TS檔案為例,下面開始剝洋蔥~

  1. TS由一個一個188位元組的TS資料包組成。有PCR和包計數(0-15)
  2. 去掉TS標頭,根據TS包的PID過濾,承載資料組成的就是PES流(打包的原始流),PES由一個個不定長的PES包組成。裡面有PTS/DTS,
  3. 去掉PES頭資訊得到ES(基本碼流),也就是H264流或者AAC流,或者…
  4. H264由一個個NAL-網絡提取層組成。
  5. NAL是有起始碼和一個一個NALU-網絡提取層單元組成。
  6. NALU由NALU標頭和RBSP組成。標頭占一個位元組,最後5位指定了後面的BRSP的類型。當類型為9時,代表AUD,也就是Access Unit Delimiter通路單元分隔符。

AUD 的文法

基本還是NALU頭+RBSP,下面是其RBSP定義

access_unit_delimiter_rbsp( ) {  
primary_pic_type        3 bit
rbsp_trailing_bits( )  
}      

rbsp_trailing_bits 是填充位元組,也就是為了對齊1個位元組,先填充1bit1,再填充若幹bit0。填充前叫做SODB-資料比特串,填充後叫做RBSP-原始位元組序列載荷。

AUD 的意義

AUD 是分解符,也就是AUD之間是一個完整的幀。

primary_pic_type 指明了這個幀的類型。

primary_pic_type 可能會出現在基本編碼圖像中的 slice_type 值
I
1 I, P
2 I, P, B
3 SI
4 SI, SP
5 I, SI
6 I, SI, P, SP
7 I, SI, P, SP, B

這部分為了幫助了解,看下面百科内容。

執行個體

00 00 00 01 09 10      

00 00 00 01 為NAL起始碼

09 說明類型為9,也就是AUD。

10 說明後面跟的是I幀

以下摘自百度百科:

位址:​​https://baike.baidu.com/item/%E5%9B%BE%E5%83%8F%E5%B8%A7​​

H.264 是一次概念的革新,它打破正常,完全沒有 I 幀、P幀、B 幀的概念,也沒有 IDR 幀的概念。對于 H.264 中出現的一些概念從大到小排序依次是:序列、圖像、片組、片、NALU、宏塊、亞宏塊、塊、像素。

這裡有幾點值得說明:
(1)、在 H.264 協定中圖像是個集合概念,頂場、低場、幀都可以稱為圖像(本文後面内容用到圖像概念時都是集合概念,不再重複說明)。是以我們可以知道,對于 H.264 協定來說,我們平常所熟悉的那些稱呼,例如:I 幀、P 幀、B 幀等等,實際上都是我們把圖像這個概念具體化和細小化了。我們在 H.264 裡提到的“幀”通常就是指不分場的圖像;
(2)、如果不采用 FMO(靈活宏塊排序) 機制,則一幅圖像隻有一個片組;
(3)、如果不使用多個片,則一個片組隻有一個片;
(4)、如果不采用 DP(資料分割)機制,則一個片就是一個 NALU,一個 NALU 也就是一個片。否則,一個片由三個 NALU 組成(即标準“表7-1”中 nal_unit_type 值為 2、3、4 的三個 NALU 屬于一個片);
(5)、以上所述的片和 NALU 的大小關系并不是抽象概念上的從屬關系。從概念的從屬關系上來看,NALU其實又是片的一個集合概念,例如:标準“表7-1”中 nal_unit_type 值為 5 的 NALU 包括 I 片或者 SI 片。
一幅圖像根據組成它的片類型來分,可以分為标準“表7-5”中的 8 種類型。我們平常應用中所最常見到的其實是這些類型的特例。例如:我們平常所謂的“I 幀”和“IDR 幀”,其實是 primary_pic_type 值為 0 的圖像,我們平常所謂的“P幀”其實是 primary_pic_type 值為 1 的圖像的特例,我們平常所謂的“B幀”其實是 primary_pic_type 值為 2 的圖像的特例。
一幅圖像根據概念來分可以分為兩種:IDR 圖像和非 IDR 圖像。一幅圖像是否是 IDR 圖像是由組成該圖像的 NALU 決定的,如果組成該圖像的 NALU 為标準“表7-1”中 nal_unit_type 值為 5 的 NALU,則該圖像為 IDR 圖像,否則為非 IDR 圖像。      

以下來自轉載

H.264 的功能分為兩層:視訊編碼層(VCL, Video Coding Layer)和網絡提取層(NAL,Network Abstraction Layer)。VCL 資料即編碼處理的輸出,它表示被壓縮編碼後的視訊資料序列。

VCL存在三種封裝形式:SODB, RBSP, EBSP.

SODB:資料比特串,即編碼後的最原始的資料;

RBSP:原始位元組序列載荷,即在SODB的後面添加了trailing bits,即一個bit 1和若幹個bit 0,以便位元組對齊;

EBSP:擴充位元組序列載荷,即在RBSP的基礎上添加了仿校驗位元組0x03.—-annexb

二、聯系、差別與作用

SODB是編碼收的原始資料,經過封裝後為RBSP,RBSP是NAL單元的資料部分的封裝格式。在NAL内部為了防止與起始碼競争,進而引入填充位元組0x03,這樣便形成了EBSP。

1、RBSP的形成過程

如果SODB的内容是空的,那麼RBSP的内容也是空的;

否則,RBSP的第一個位元組取自SODB的第1到第8個比特,RBSP位元組内部按照從左到右從高到低的順序排列。以此類推,RBSP中的每個位元組都直接取自SODP的相應比特。RBSP的最後一個位元組包含SODB的最後幾個比特,以及trailing bits。其中,trailing bits的第一個比特為1,其餘的比特為0,保證位元組對齊。最後,在結尾添加0x0000,即CABAC ZERO WORD,進而形成RBSP。

2、EBSP的形成過程

NALU資料+起始碼就形成了AnnexB格式,起始碼包括兩種,0x00000001和0x000001。為了不讓NALU的主體與起始碼之間産生競争,在對RBSP進行掃描時,如果遇到連續的兩個0x00位元組,則在該兩個位元組後面添加一個0x03位元組。在解碼的時候将該0x03位元組去掉,也成為脫殼操作。

通過該種方式形成EBSP,這需要将近兩倍的整幀圖像碼流大小。為了減少存儲器需求,在每個macroblock結束後,即檢查該macroblock的SODB的起始碼競争問題,并保留SODB的最後兩個位元組的零位元組個數,以便與下一個macroblock的SODB的開始位元組形成連續的起始碼競争檢測。對一幀圖像的最後一個macroblock,先添加結尾停止bit,在檢查起始碼競争。