原文地址html
先前的話題是關於色彩模型,以及如何存儲像素色彩數據的。如今是時候去更深瞭解H.264碼流格式,並找到這些像素的數據。
segmentfault
顯然,解碼器接收一個特定的格式的比特序列,並進行操做。二進制流是結構化的,由packets組成。在上層,流由NAL-packets組成,並具備如下形式:網絡
NAL表示Network Abstraction Layer(網絡抽象層)的縮寫。數據結構
packet結構以下圖編碼
NAL-packet的第一個字節是一個包含關於packet的類型信息的報頭。spa
表1中描述了全部可能的數據包類型。code
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。接着是一箇中止位和均衡位(以下圖) orm
如今,讓咱們更進一步查看咱們的比特流: 視頻
任何已編碼圖片都包含slice(切片),slice包含macroblocks(宏塊)。大多數狀況下,一個已編碼圖像對應於一個切片。此外,一個圖像能夠有多個切片。所述切片被分爲如下類型:htm
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):亮度和色度份量的集合。