日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

H.264视频RTP负载格式/NALU的类型

發布時間:2024/2/28 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 H.264视频RTP负载格式/NALU的类型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 網絡抽象層單元類型(NALU)
NALU 頭由一個字節組成, 它的語法如下:
????? +===============+
????? |0|1|2|3|4|5|6|7|
????? +=+=+=+=+=+=+=+=+
????? |F|NRI|?? Type ?|
????? +===============+
F: 1 個比特.
? forbidden_zero_bit:在H.264規范中規定了這一位必須為0。


NRI: 2 個比特.
? nal_ref_idc:取00~11,似乎指示這個NALU的重要性, 如00的NALU解碼器可以丟棄它而不影響圖像的回放。不過一般情況下不太關心這個屬性。

Type: 5 個比特.
??nal_unit_type這個NALU單元的類型。簡述如下:

?? 0 ? ? 沒有定義
? 1-23?? NAL單元 ? 單個NAL單元包
? 24???? STAP-A ? ?單一時間的組合包
? 25 ??? STAP-B ? ?單一時間的組合包
? 26???? MTAP16 ? ?多個時間的組合包
? 27???? MTAP24 ? ?多個時間的組合包
? 28???? FU-A ? ? ?分片的單元
? 29???? FU-B ? ? ?分片的單元
? 30-31 ?沒有定義

2. 打包模式
? 下面是RFC 3550中規定的RTP頭的結構.
?????? 0 ? ? ? ? ? ? ? ? ? 1 ? ? ? ? ? ? ? ? ? 2 ? ? ? ? ? ? ? ? ? 3
?????? 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
????? |V=2|P|X|? CC?? |M|???? PT????? |?????? sequence number???????? |
????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
????? |?????????????????????????? timestamp?????????????????????????? |
????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
????? |?????????? synchronization source (SSRC) identifier??????????? |
????? +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
????? |??????????? contributing source (CSRC) identifiers???????????? |
????? |???????????????????????????? ....????????????????????????????? |
????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

? 負載類型 Payload type (PT): 7 bits
? 序列號 Sequence number (SN): 16 bits
? 時間戳 Timestamp: 32 bits
?
? H.264 Payload格式定義了三種不同的基本的負載(Payload)結構. 接收端可能通過RTP Payload的第一個字節來識別它們.?這一個字節類似NALU頭的格式, 而這個頭結構的NAL單元類型字段則指出了代表的是哪一種結構,這個字節的結構如下, 可以看出它和H.264的NALU頭結構是一樣的.
??????+===============+
????? |0|1|2|3|4|5|6|7|
????? +=+=+=+=+=+=+=+=+
????? |F|NRI|?? Type ?|
????? +===============+
? 字段 Type: 這個RTP payload中NAL單元的類型. 這個字段和H.264中類型字段的區別是, 當type的值為24 ~ 31表示這是一個特別格式的NAL單元, 而H.264中, 只取1~23是有效的值.
??
? 24??? STAP-A?? 單一時間的組合包
? 24??? STAP-B?? 單一時間的組合包
? 26??? MTAP16?? 多個時間的組合包
? 27??? MTAP24?? 多個時間的組合包
? 28??? FU-A???? 分片的單元
? 29??? FU-B???? 分片的單元
? 30-31? 沒有定義

? 可能的結構類型分別有:
? 1. 單一NAL單元模式
???? 即一個RTP包僅由一個完整的NALU組成. 這種情況下RTP NAL頭類型字段和原始的H.264的NALU頭類型字段是一樣的.
??2. 組合封包模式
??? 即可能是由多個NAL單元組成一個RTP包. 分別有4種組合方式: STAP-A, STAP-B, MTAP16, MTAP24.那么這里的類型值分別是24, 25, 26以及27.
??3. 分片封包模式
??? 用于把一個NALU單元封裝成多個RTP包. 存在兩種類型FU-A和FU-B. 類型值分別是28和29.

2.1 單一NAL單元模式

? 對于NALU的長度小于MTU大小的包, 一般采用單一NAL單元模式.
? 對于一個原始的H.264 NALU單元常由[Start Code] [NALU Header] [NALU Payload]三部分組成, 其中Start Code用于標示這是一個NALU 單元的開始, 必須是 "00 00 00 01"或"00 00 01", NALU頭僅一個字節, 其后都是NALU單元內容.
? 打包時去除"00 00 01"或"00 00 00 01"的開始碼, 把其他數據封包成RTP包即可.
?????? 0 ? ? ? ? ? ? ? ? ? 1 ? ? ? ? ? ? ? ? ? 2 ? ? ? ? ? ? ? ? ? 3
?????? 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
????? |F|NRI|? type?? | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
????? +-+-+-+-+-+-+-+-+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
????? |?????????????????????????????????????????????????????????????? |
?? ? ?|?????????????? Bytes 2..n of a Single NAL unit???????????????? |
????? |?????????????????????????????????????????????????????????????? |
????? |?????????????????????????????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
?? ? ?|?????????????????????????????? :...OPTIONAL RTP padding??????? |
????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

? 如有一個H.264的NALU是這樣的:
? [00 00 00 01 67 42 A0 1E 23 56 0E 2F ... ]
? 這是一個序列參數集NAL單元. [00 00 00 01]是四個字節的開始碼, 67是NALU頭, 42開始的數據是NALU內容.
? 封裝成RTP包將如下:

? [RTP Header] [67 42 A0 1E 23 56 0E 2F]
? 即只要去掉4個字節的開始碼就可以了.

2.2 組合封包模式
? 其次, 當NALU的長度特別小時, 可以把幾個NALU單元封在一個RTP包中.
?????? 0 ? ? ? ? ? ? ? ? ? 1 ? ? ? ? ? ? ? ? ? 2 ? ? ? ? ? ? ? ? ? 3
?????? 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
????? |????????????????????????? RTP Header?????????????????????????? |
????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
????? |STAP-A NAL HDR |???????? NALU 1 Size?????????? | NALU 1 HDR??? |
????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
????? |???????????????????????? NALU 1 Data?????????????????????????? |
????? :?????????????????????????????????????????????????????????????? :
????? +?????????????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
????? |?????????????? | NALU 2 Size?????????????????? | NALU 2 HDR??? |
????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
????? |???????????????????????? NALU 2 Data?????????????????????????? |
????? :?????????????????????????????????????????????????????????????? :
????? |?????????????????????????????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
????? |?????????????????????????????? :...OPTIONAL RTP padding??????? |
????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

2.3 Fragmentation Units (FUs).
? 而當NALU的長度超過MTU時, 就必須對NALU單元進行分片封包. 也稱為 Fragmentation Units(FUs).
?????? 0 ? ? ? ? ? ? ? ? ? 1 ? ? ? ? ? ? ? ? ? 2 ? ? ? ? ? ? ? ? ? 3
?????? 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
????? | FU indicator? |?? FU header?? |?????????????????????????????? |
????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+?????????????????????????????? |
????? |?????????????????????????????????????????????????????????????? |
????? |???????????????????????? FU payload??????????????????????????? |
????? |?????????????????????????????????????????????????????????????? |
????? |?????????????????????????????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
????? |?????????????????????????????? :...OPTIONAL RTP padding??????? |
????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

????? Figure 14.? RTP payload format for FU-A

?? The FU indicator octet has the following format:
?? ? ?+===============+
????? |0|1|2|3|4|5|6|7|
????? +=+=+=+=+=+=+=+=+
????? |F|NRI|?? Type ?|
????? +===============+
?? The FU header has the following format:
????? +===============+
????? |0|1|2|3|4|5|6|7|
????? +=+=+=+=+=+=+=+=+
????? |S|E|R|?? Type ?|
????? +===============+

3. SDP參數

? 下面描述了如何在SDP中表示一個H.264流:
? . "m=" 行中的媒體名必須是 "video"
? . "a=rtpmap" 行中的編碼名稱必須是 "H264".
? . "a=rtpmap" 行中的時鐘頻率必須是 90000.
? . 其他參數都包括在"a=fmtp"行中.

? 如:
? m=video 49170 RTP/AVP 98
? a=rtpmap:98 H264/90000
? a=fmtp:98 profile-level-id=42A01E; sprop-parameter-sets=Z0IACpZTBYmI,aMljiA==

? 下面介紹一些常用的參數.

3.1 packetization-mode:
? 表示支持的封包模式.
? 當 packetization-mode 的值為 0 時或不存在時, 必須使用單一NALU單元模式.
? 當 packetization-mode 的值為 1 時必須使用非交錯(non-interleaved)封包模式.
? 當 packetization-mode 的值為 2 時必須使用交錯(interleaved)封包模式.
? 這個參數不可以取其他的值.

3.2 sprop-parameter-sets:
? 這個參數可以用于傳輸H.264的序列參數集和圖像參數NAL單元. 這個參數的值采用Base64進行編碼. 不同的參數集間用","號隔開.
?
3.3 profile-level-id:
? 這個參數用于指示H.264流的profile類型和級別. 由Base16(十六進制)表示的3個字節. 第一個字節表示H.264的Profile類型, 第三個字節表示H.264的Profile級別.
?
3.4 max-mbps:
? 這個參數的值是一個整型, 指出了每一秒最大的宏塊處理速度

?

NALU的類型

NALU(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:未規定

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

????1. 序列參數集NAL單元(nal_unit_type為7)必須在傳送所有以此參數集為參考的其他NAL單元之前傳送,不過允許這些NAL單元中間出現重復的序列參數集NAL單元。所謂重復的詳細解釋為:序列參數集NAL單元都有其專門的標識,如果兩個序列參數集NAL單元的標識相同,就可以認為后一個只不過是前一個的拷貝,而非新的序列參數集。
????2.圖像參數集NAL單元(nal_unit_type為8)必須在所有以此參數集為參考的其他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.流結束符在比特流中的最后。

????①NALU(Network Abstract Layer Unit):H264標準中的比特流是以NAL為單位,每個NAL單元包含一個RBSP(raw byte sequence payload,原始字節序列載荷),NALU的頭信息定義了RBSP所屬類型。類型一般包括序列參數集(SPS)、圖像參數集(PPS)、增強信息(SEI)、條帶(Slice)等,其中,SPS和PPS屬于參數集,兩標準采用參數集機制是為了將一些主要的序列、圖像參數(解碼圖像尺寸、片組數、參考幀數、量化和濾波參數標記等)與其他參數分離,通過解碼器先解碼出來。此外,為了增強圖像的清晰度,AVS-M添加了圖像頭(Picture head)信息。讀取NALU流程中,每個NALU前有一個起始碼0x000001,為防止 內部0x000001序列競爭,H.264編碼器在最后一字節前插入一個新的字節——0x03,所以解碼器檢測到該序列時,需將0x03刪掉,而AVS-M只需識別出起始碼0x000001。
????②讀取宏塊類型(mb type)和宏塊編碼模板(cbp):編解碼圖像以宏塊劃分,一個宏塊由一個16*16亮度塊和相應的一個8*8cb和一個8*8cr色度塊組成。

總結

以上是生活随笔為你收集整理的H.264视频RTP负载格式/NALU的类型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。