天天看點

H.264中的NAL技術

 NAL技術

1.NAL概述

NAL全稱Network Abstract Layer, 即網絡抽象層。

在H.264/AVC視訊編碼标準中,整個系統架構被分為了兩個層面:視訊編碼層面(VCL)和網絡抽象層面(NAL)。其中,前者負責有效表示視訊資料的内容,而後者則負責格式化資料并提供頭資訊,以保證資料适合各種信道和存儲媒體上的傳輸。

現實中的傳輸系統是多樣化的,其可靠性,服務品質,封裝方式等特征各不相同,NAL這一概念的提出提供了一個視訊編碼器和傳輸系統的友好接口,使得編碼後的視訊資料能夠有效地在各種不同的網絡環境中傳輸。

2.NAL單元

NAL單元是NAL的基本文法結構,它包含一個位元組的頭資訊和一系列來自VCL的稱為原始位元組序列載荷(RBSP)的位元組流。頭資訊中包含着一個可否丢棄的訓示标記,辨別着該NAL單元的丢棄能否引起錯誤擴散,一般,如果NAL單元中的資訊不用于建構參考圖像,則認為可以将其丢棄;最後包含的是NAL單元的類型資訊,暗示着其内含有效載荷的内容。

送到解碼器端的NAL單元必須遵守嚴格的順序,如果應用程式接收到的NAL單元處于亂序,則必須提供一種恢複其正确順序的方法。

3.NAL實作編解碼器與傳輸網絡的結合

NAL提供了一個編解碼器與傳輸網絡的通用接口,而對于不同的網絡環境,具體的實作方案是不同的。對于基于流的傳輸系統如H.320、MPEG等,需要按照解碼順序組織NAL單元,并為每個NAL單元增加若幹比特位元組對齊的字首以形成位元組流;對于RTP/UDP/IP系統,則可以直接将編碼器輸出的NAL單元作為RTP的有效載荷;而對于同時提供多個邏輯信道的傳輸系統,我們甚至可以根據重要性将不同類型的NAL單元在不同服務品質的信道中傳輸[2]。

4.結論

為了實作編解碼器良好的網絡适應性,需要做兩方面的工作:第一、在Codec中将NAL這一技術完整而有效的實作;第二、在遵循H.264/AVC NAL規範的前提下設計針對不同網絡的最佳傳輸方案。如果實作了以上兩個目标,所實作的就不僅僅是一種視訊編解碼技術,而是一套适用範圍很廣的多媒體傳輸方案,該方案适用于如視訊會議,資料存儲,電視廣播,流媒體,無線通信,遠端監控等多種領域。

NALU類型

辨別NAL單元中的RBSP資料類型,其中,nal_unit_type為1, 2, 3, 4, 5及12的NAL單元稱為VCL的NAL單元,其他類型的NAL單元為非VCL的NAL單元。

0:未規定

1:非IDR圖像中不采用資料劃分的片段

2:非IDR圖像中A類資料劃分片段

3:非IDR圖像中B類資料劃分片段

4:非IDR圖像中C類資料劃分片段

5:IDR圖像的片段

6:補充增強資訊 (SEI)

7:序列參數集

8:圖像參數集

9:分割符

10:序列結束符

11:流結束符

12:填充資料

13 – 23:保留

24 – 31:未規定

NALU的順序要求

H.264/AVC标準對送到解碼器的NAL單元順序是有嚴格要求的,如果NAL單元的順序是混亂的,必須将其重新依照規範組織後送入解碼器,否則解碼器不能夠正确解碼。

1.序列參數集NAL單元必須在傳送所有以此參數集為參考的其他NAL單元之前傳送,不過允許這些NAL單元中間出現重複的序列參數集NAL單元。所謂重複的詳細解釋為:序列參數集NAL單元都有其專門的辨別,如果兩個序列參數集NAL單元的辨別相同,就可以認為後一個隻不過是前一個的拷貝,而非新的序列參數集。

2.圖像參數集NAL單元必須在所有以此參數集為參考的其他NAL單元之先,不過允許這些NAL單元中間出現重複的圖像參數集NAL單元,這一點與上述的序列參數集NAL單元是相同的。

3.不同基本編碼圖像中的片段(slice)單元和資料劃分片段(data partition)單元在順序上不可以互相交叉,即不允許屬于某一基本編碼圖像的一系列片段(slice)單元和資料劃分片段(data partition)單元中忽然出現另一個基本編碼圖像的片段(slice)單元片段和資料劃分片段(data partition)單元。

4.參考圖像的影響:如果一幅圖像以另一幅圖像為參考,則屬于前者的所有片段(slice)單元和資料劃分片段(data partition)單元必須在屬于後者的片段和資料劃分片段之後,無論是基本編碼圖像還是備援編碼圖像都必須遵守這個規則

5.基本編碼圖像的所有片段(slice)單元和資料劃分片段(data partition)單元必須在屬于相應備援編碼圖像的片段(slice)單元和資料劃分片段(data partition)單元之前。

6.如果資料流中出現了連續的無參考基本編碼圖像,則圖像序号小的在前面。

7.如果arbitrary_slice_order_allowed_flag置為1,一個基本編碼圖像中的片段(slice)單元和資料劃分片段(data partition)單元的順序是任意的,如果arbitrary_slice_order_allowed_flag置為零,則要按照片段中第一個宏塊的位置來确定片段的順序,若使用資料劃分,則A類資料劃分片段在B類資料劃分片段之前,B類資料劃分片段在C類資料劃分片段之前,而且對應不同片段的資料劃分片段不能互相交叉,也不能與沒有資料劃分的片段互相交叉。

8.如果存在SEI(補充增強資訊) 單元的話,它必須在它所對應的基本編碼圖像的片段(slice)單元和資料劃分片段(data partition)單元之前,并同時必須緊接在上一個基本編碼圖像的所有片段(slice)單元和資料劃分片段(data partition)單元後邊。假如SEI屬于多個基本編碼圖像,其順序僅以第一個基本編碼圖像為參照。

9.如果存在圖像分割符的話,它必須在所有SEI 單元、基本編碼圖像的所有片段slice)單元和資料劃分片段(data partition)單元之前,并且緊接着上一個基本編碼圖像那些NAL單元。

10.如果存在序列結束符,且序列結束符後還有圖像,則該圖像必須是IDR(即時解碼器重新整理)圖像。序列結束符的位置應當在屬于這個IDR圖像的分割符、SEI 單元等資料之前,且緊接着前面那些圖像的NAL單元。如果序列結束符後沒有圖像了,那麼它的就在比特流中所有圖像資料之後。

11.流結束符在比特流中的最後。

繼續閱讀