1. 程式人生 > >H264編碼器11( H.264 探索 第二部分 H264碼流格式)

H264編碼器11( H.264 探索 第二部分 H264碼流格式)

來自:https://segmentfault.com/a/1190000006698552

表1中描述了所有可能的資料包型別。

Type Definition
0 Undefined
1 Slice layer without partitioning non IDR
2 Slice data partition A layer
3 Slice data partition B layer
4 Slice data partition C layer
5 Slice layer without partitioning IDR
6 Additional information (SEI)
7 Sequence parameter set
8 Picture parameter set
9 Access unit delimiter
10 End of sequence
11 End of stream
12 Filler data
13..23 Reserved
24..31 Undefined

NAL型別定義了當前NAL-packet資料結構。它可以是slice,parameter set,filler等等。
如從圖中可以看出, NAL-packet的有效載荷被定義為RBSP(Raw Byte Sequence Payload)。
RBSP描述了一行被定義為SODB(String Of Data Bits)的位元組集。所以RBSP包含SODB。
根據ITU-T規範,如果SODB為空(0位元長度),RBSP也為空。
RBSP的第一位元組(最顯著,最左邊)包含八位SODB; RBSP的下一個位元組應該也包括以下八個SODB等等,直到有少於8位SODB。接著是一個停止位和均衡位(如下圖)

 

任何已編碼圖片都包含slice(切片),slice包含macroblocks(巨集塊)。大多數情況下,一個已編碼影象對應於一個切片。此外,一個影象可以有多個切片。所述切片被分為以下型別:

Type Description
0 P-slice. Consists of P-macroblocks (each macro block is predicted using one reference frame) and / or I-macroblocks.
1 B-slice. Consists of B-macroblocks (each macroblock is predicted using one or two reference frames) and / or I-macroblocks.
2 I-slice. Contains only I-macroblocks. Each macroblock is predicted from previously coded blocks of the same slice.
3 SP-slice. Consists of P and / or I-macroblocks and lets you switch between encoded streams.
4 SI-slice. It consists of a special type of SI-macroblocks and lets you switch between encoded streams.
5 P-slice.
6 B-slice.
7 I-slice.
8 SP-slice.
9 SI-slice.

看起來像上表包含了一些冗餘資料,但事實並非如此:
型別5 - 9意味著當前影象的所有其他切片將是同一型別。正如你所看到的每個切片都由header和data組成。切片頭包含了關於切片型別,切片巨集塊的型別,切片幀的數量的資訊。當然切片頭也包含了參照幀的設定(the reference frame settings)和量化引數(quantification parameters)的資訊。最好,我們來檢視切片data,這是儲存畫素資料的地方。巨集塊是資訊的主要載體,因為它們包含將對應於單個畫素的亮度和色度分量的集合。無需進入細節可以得出結論,不考慮細節可以得出的結論是,視訊解碼最終可以簡化為從位元流中對巨集塊的搜尋和提取,以及後續藉助亮度和色度分量對畫素顏色的恢復。巨集塊組成如下圖:

在這裡,我們有巨集塊型別,預測型別(這是下一文章的主題),編碼塊模式(Coded Block Pattern),量化引數(Quantization Parameter )(如果我們有CPB),最後資料(data):亮度和色度分量的集合。