摘要::
本備忘錄描述了一種用于 ITU-T H.264 視頻編碼標準(與 ISO/IEC 國際標準 14496-10 技術上相同)的 RTP 負載格式,但不包括可伸縮視頻編碼(SVC)擴展和多視角視頻編碼(MVC)擴展,這兩種擴展的 RTP 負載格式在其他文檔中有定義。該 RTP 負載格式允許在每個 RTP 負載中封裝一個或多個由 H.264 視頻編碼器產生的網絡抽象層單元(NALU)。這種負載格式具有廣泛的適用性,支持從簡單的低比特率會話應用,到帶有交錯傳輸的互聯網視頻流,再到高比特率的視頻點播等多種應用場景。
The H.264 Codec:
H.264 視頻編碼器具有非常廣泛的應用范圍,涵蓋了各種形式的數字壓縮視頻,從低比特率的互聯網流媒體應用,到高清電視(HDTV)廣播和幾乎無損編碼的數字電影應用。與當前的技術水平相比,H.264 在整體性能方面表現優異,據報道其比特率節省可達到 50% 甚至更多。例如,據稱數字衛星電視的畫質可在 1.5 Mbit/s 的比特率下實現,而當前 MPEG-2 視頻的典型比特率大約為 3.5 Mbit/s ?。
編碼規范在概念上將視頻編碼層(VCL)和網絡抽象層(NAL)區分開來。VCL 包含編解碼器的信號處理功能,包括變換、量化、運動補償預測等機制,以及環路濾波器。它遵循當今大多數視頻編解碼器的一般概念:基于宏塊的編碼器,采用帶有運動補償的幀間預測和殘差信號的變換編碼。VCL 編碼器輸出的是切片(slice):即包含若干個宏塊數據的比特串,以及切片頭的信息(其中包含該切片中第一個宏塊的空間地址、初始量化參數以及其他相關信息)。除非通過切片組(slice groups)的語法另作指定,否則切片中的宏塊按掃描順序排列。幀內預測僅在切片內部使用。更多信息可參考文獻 。
NAL 編碼器會將 VCL(視頻編碼層)編碼器輸出的切片封裝成網絡抽象層單元(NALU),以便適用于在分組網絡中傳輸,或者用于面向分組的復用環境。H.264 標準的附錄 B 定義了一種用于字節流導向網絡(比如本地存儲、串行傳輸等)上傳輸這些 NALU 的封裝方法。但在本備忘錄(即該 RTP 負載格式規范)的討論范圍內,附錄 B 的內容并不適用或相關,因為 RTP 是基于分組的傳輸方式,而不是字節流方式。
在內部,NAL(網絡抽象層)使用的是 NAL 單元。每個 NAL 單元由一個字節的頭部和有效負載字節流組成。
每個 NAL 單元包含兩個部分:
● 一個字節的頭部(header):這個頭部指出了 NAL 單元的類型(比如是幀、SPS、PPS 等),是否可能存在比特錯誤或語法錯誤,以及這個單元在解碼過程中有多重要。
● 有效負載部分(payload):也就是實際的數據內容,比如一幀圖像的數據.
頭部指示該 NAL 單元的類型、有效負載中是否可能存在比特錯誤或語法違規,以及該 NAL 單元在解碼過程中相對的重要性。本 RTP 負載規范在設計時并不關心 NAL 單元有效負載中的比特流內容。
H.264 的一個主要特點是:切片(slice)和圖像的傳輸時間、解碼時間以及采樣或顯示時間是完全解耦的。H.264 中規定的解碼過程與時間無關,H.264 語法中也不攜帶類似于早期視頻壓縮標準中“時間參考(Temporal Reference)”那樣表示跳幀數量的信息。此外,還有一些 NAL 單元會影響多幀圖像,因此本質上不具備時間屬性。因此,在處理 RTP 時間戳時,對于那些采樣時間或顯示時間未定義或在傳輸時尚未知的 NAL 單元,需要進行特別的處理和考慮。
Parameter Set Concept:
H.264 的一個非常基礎的設計理念是生成自包含的分組,從而使諸如 RFC 4629 [11] 中的頭部重復機制,或 MPEG-4 Visual 的頭部擴展碼(HEC)等機制變得不再必要。
這是通過將涉及多個切片的信息從媒體流中解耦來實現的。 這些高層的元信息應當以可靠的、異步的、提前的方式發送,與包含切片數據的 RTP 數據流分開進行傳輸。
(對于沒有合適的帶外傳輸通道的應用,也提供了帶內發送該信息的機制。) 這一類高層參數的組合被稱為參數集(parameter set)。H.264 規范中定義了兩種參數集:
● 序列參數集(Sequence Parameter Set, SPS)
● 圖像參數集(Picture Parameter Set, PPS)
一個活動的序列參數集在整個編碼視頻序列期間保持不變, 一個活動的圖像參數集在一個編碼圖像內保持不變。
這些參數集結構中包含了如下信息:
● 圖像大小
● 所使用的可選編碼模式
● 宏塊與切片組之間的映射關系等。
為了能夠在無需與切片數據流同步傳輸參數集的情況下更改圖像參數(例如圖像大小),編碼器和解碼器可以各自維護一個包含多個序列和圖像參數集的列表。每個切片頭中都會包含一個碼字,用于標識應該使用哪個序列參數集和圖像參數集。這種機制允許將參數集的傳輸與視頻數據包的傳輸分離,并可以通過外部手段進行傳輸(例如作為能力交換的一部分),或者通過可靠或不可靠的控制協議來發送。甚至在某些情況下,這些參數集可以完全不通過網絡傳輸,而是在應用設計規范中預設并固定。
H.264 通過把編碼參數信息(如分辨率、編碼方式)從圖像數據中剝離出來,形成獨立的參數集,從而實現了數據包的自包含和高效傳輸。這些參數集不依賴 RTP 流,可以通過其他方式靈活傳輸或預設,大大增強了系統的適應性和效率。
Network Abstraction Layer Unit Types:
所有NAL單元都由一個單獨的NAL單元類型字節組成,該字節同時也作為本RTP載荷格式的載荷頭(payload header)。隨后是對NAL單元載荷的描述。
NAL單元類型字節的語法和語義在h264官方文檔中進行了規定,但其基本屬性在下文中簡要總結。NAL單元類型字節的格式如下:
+---------------+|0|1|2|3|4|5|6|7|+-+-+-+-+-+-+-+-+|F| NRI | Type ?|+---------------+
根據H.264標準,對NAL單元類型字節各組成部分的語義簡要說明如下:
● F:1位
forbidden_zero_bit。H.264標準中規定該位為1即為語法違規。
● NRI:2位
nal_ref_idc。值為 00 表示該NAL單元的內容不會用于重建參考圖像,因此可以被丟棄而不會影響參考圖像的完整性。值大于 00 表示該NAL單元的解碼對保持參考圖像的完整性是必要的。
● Type:5位
nal_unit_type。該字段表示NAL單元載荷的類型。
Definitions::
● 訪問單元(access unit):一組NAL單元,總是包含一個主編碼圖像(primary coded picture)。除了主編碼圖像之外,訪問單元還可以包含一個或多個冗余編碼圖像,或其他不包含片(slice)或編碼圖像的切片數據分區的NAL單元。訪問單元的解碼始終會產生一個解碼圖像。
● 編碼視頻序列(coded video sequence):按解碼順序排列的訪問單元序列,由一個瞬時解碼刷新(IDR)訪問單元開始,后面跟著零個或多個非IDR訪問單元,直到下一個IDR訪問單元(不包括該IDR單元)為止。
● IDR訪問單元(IDR access unit):其主編碼圖像是IDR圖像的訪問單元。
● IDR圖像(IDR picture):僅包含I或SI片類型的編碼圖像,該圖像會觸發解碼過程的“重置”。解碼IDR圖像之后,其后的所有編碼圖像都可以在無需對IDR圖像之前的圖像進行幀間預測的情況下完成解碼。
● 主編碼圖像(primary coded picture):H.264標準中用于解碼處理的圖像編碼表示。主編碼圖像包含圖像的所有宏塊(macroblock)。
● 冗余編碼圖像(redundant coded picture):圖像或圖像部分的編碼表示。對于符合H.264標準的碼流,解碼過程不會使用冗余編碼圖像的內容。但在存在錯誤或丟包的碼流中,冗余編碼圖像的內容可用于解碼處理。
● VCL NAL單元(VCL NAL unit):用于統稱編碼片(coded slice)和編碼數據分區(coded data partition)類型的NAL單元。
此外,以下定義也適用:
● 解碼順序號(decoding order number, DON):RTP負載結構中的一個字段,或一個表示NAL單元解碼順序的派生變量。DON的取值范圍為0到65535。當達到最大值后,會回繞至0。
● NAL單元解碼順序(NAL unit decoding order):符合文獻 [1] 第7.4.1.2節所述順序約束的NAL單元順序。
● NALU時間(NALU-time):如果NAL單元被傳輸在其獨立的RTP包中,該值表示RTP時間戳應取的值。
● 傳輸順序(transmission order):按RTP序列號升序排列的數據包順序(按模算術處理)。在聚合包中,NAL單元的傳輸順序與其在包中出現的順序一致。
● 媒體感知網絡元素(media-aware network element, MANE):如中間設備或應用層網關這類網絡元素,能夠解析RTP載荷頭或RTP載荷的某些部分,并對內容做出反應。
說明性注釋:MANE的概念超越了普通路由器或網關,因為MANE需要了解信令(例如,獲取媒體流的負載類型映射信息),并且在使用安全實時傳輸協議(SRTP)時需要被信任。使用MANE的好處是可以根據媒體編碼的需要丟棄數據包。例如,在某個鏈路上因擁塞而必須丟包時,MANE可以識別并丟棄對用戶體驗影響最小的數據包。
● 靜態宏塊(static macroblock):視頻流中某些宏塊可被定義為靜態塊,詳見文獻 [3] 第8.3.2.8節。靜態宏塊可釋放出額外的處理資源用于非靜態宏塊處理。在一定視頻處理資源和分辨率條件下,靜態宏塊數量越多,幀率越高。
● 默認子配置(default sub-profile):編碼工具的子集,可以是一個profile的全部編碼工具,也可以是多個profile共有的編碼工具子集,由 profile-level-id 參數指示。
● 默認等級(default level):由 profile-level-id 參數指示的等級,由三個字節組成:profile_idc、profile-iop 和 level_idc。默認情況下,level_idc 表示等級,在某些情況下還需結合 profile-iop 一起判斷。
Abbreviations:
● DON:解碼順序號(Decoding Order Number)
● DONB:解碼順序號基值(Decoding Order Number Base)
● DOND:解碼順序號差值(Decoding Order Number Difference)
● FEC:前向糾錯(Forward Error Correction)
● FU:分片單元(Fragmentation Unit)
● IDR:瞬時解碼刷新(Instantaneous Decoding Refresh)
● IEC:國際電工委員會(International Electrotechnical Commission)
● ISO:國際標準化組織(International Organization for Standardization)
● ITU-T:國際電信聯盟 電信標準化部門(International Telecommunication Union, Telecommunication Standardization Sector)
● MANE:媒體感知網絡元素(Media-Aware Network Element)
● MTAP:多時間聚合包(Multi-Time Aggregation Packet)
● MTAP16:帶有16位時間戳偏移的MTAP(MTAP with 16-bit timestamp offset)
● MTAP24:帶有24位時間戳偏移的MTAP(MTAP with 24-bit timestamp offset)
● NAL:網絡提取層(Network Abstraction Layer)
● NALU:NAL單元(NAL Unit)
● SAR:采樣寬高比(Sample Aspect Ratio)
● SEI:補充增強信息(Supplemental Enhancement Information)
● STAP:單時間聚合包(Single-Time Aggregation Packet)
● STAP-A:STAP類型A
● STAP-B:STAP類型B
● TS:時間戳(Timestamp)
● VCL:視頻編碼層(Video Coding Layer)
● VUI:視頻可用性信息(Video Usability Information)
參考來源:
https://www.yuque.com/u2132176/yfiyal/kbobkofh66aldrg7