圖像、幀、片、NALU 是學習 H.264 的人常常感到困惑的一些概念。
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 也就是一個片。
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 屬於 一個片);
2 編碼條帶數據分割塊A slice_data_partition_a_layer_rbsp( )
3 編碼條帶數據分割塊B slice_data_partition_b_layer_rbsp( )
4 編碼條帶數據分割塊C slice_data_partition_c_layer_rbsp( )
3 編碼條帶數據分割塊B slice_data_partition_b_layer_rbsp( )
4 編碼條帶數據分割塊C slice_data_partition_c_layer_rbsp( )
(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 圖像。這里也有幾點值得說明:
一幅圖像根據組成它的片類型來分,可以分為標准 “表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 圖像。這里也有幾點值得說明:
(1)、nal_unit_type 值為 5 的 NALU 只會出現在 IDR 圖像中,而 IDR 圖像中的所有 NALU 都是nal_unit_type 值為 5 的 NALU;
(2)、我們以組成一 幅圖像的片的類型來區分該 圖像是否是 IDR 圖像是錯誤的。
(2)、我們以組成一 幅圖像的片的類型來區分該 圖像是否是 IDR 圖像是錯誤的。
例如:
一幅圖像中的所有片都是 I 片並不代表這幅圖像就是 IDR 圖像。因為 I 片也可以從屬於 nal_unit_type 值為 1 的 NALU
也即非IDR圖像有可能全部包含I片。只不過我們平常最常見到的形式是:所有片都是 I 片的圖像就是 IDR 圖像。其實這個時候
IDR 圖像的概念也被我們具體化和細小化了。
但IDR圖像必定全部包含I片或SI片,不過只有用NALU的類型才能判斷是不是IDR圖像
一幅圖像由 1~N 個片組組成,而 每一個片組又由一個或 若干個片組成 一個片由一個NALU或三個NALU(假如有數據分割)組成。 圖像解碼過程中總是按照片進行解碼,然后按照片組將解碼宏塊重組成圖像。從這種意義上講, 片實際是最大的解碼單元。
一幅圖像由 1~N 個片組組成,而 每一個片組又由一個或 若干個片組成 一個片由一個NALU或三個NALU(假如有數據分割)組成。 圖像解碼過程中總是按照片進行解碼,然后按照片組將解碼宏塊重組成圖像。從這種意義上講, 片實際是最大的解碼單元。
一個片又包含哪些類型的宏塊呢?
標准“表7-10”做了最好的說明。
一個 I 宏塊又分為哪些類型呢?
標准“表7-11”做了最好的說明。
一個 P 宏塊又分為哪些類型呢?
標准“表7-13”做了最好的說明。
一個 B 宏塊又分為哪些類型呢?
標准“表7-14”做了最好的說明。
一個 P 宏塊的亞宏塊又分為哪些類型呢?
標准“表7-17”做了最好的說明。
一個 B 宏塊的亞宏塊又分為哪些類型呢?
標准“表7-18”做了最好的說明。