H.264视频RTP负载格式/NALU的类型
1. 網(wǎng)絡(luò)抽象層單元類(lèi)型(NALU)
NALU 頭由一個(gè)字節(jié)組成, 它的語(yǔ)法如下:
????? +===============+
????? |0|1|2|3|4|5|6|7|
????? +=+=+=+=+=+=+=+=+
????? |F|NRI|?? Type ?|
????? +===============+
F: 1 個(gè)比特.
? forbidden_zero_bit:在H.264規(guī)范中規(guī)定了這一位必須為0。
NRI: 2 個(gè)比特.
? nal_ref_idc:取00~11,似乎指示這個(gè)NALU的重要性, 如00的NALU解碼器可以丟棄它而不影響圖像的回放。不過(guò)一般情況下不太關(guān)心這個(gè)屬性。
Type: 5 個(gè)比特.
??nal_unit_type:這個(gè)NALU單元的類(lèi)型。簡(jiǎn)述如下:
?? 0 ? ? 沒(méi)有定義
? 1-23?? NAL單元 ? 單個(gè)NAL單元包
? 24???? STAP-A ? ?單一時(shí)間的組合包
? 25 ??? STAP-B ? ?單一時(shí)間的組合包
? 26???? MTAP16 ? ?多個(gè)時(shí)間的組合包
? 27???? MTAP24 ? ?多個(gè)時(shí)間的組合包
? 28???? FU-A ? ? ?分片的單元
? 29???? FU-B ? ? ?分片的單元
? 30-31 ?沒(méi)有定義
2. 打包模式
? 下面是RFC 3550中規(guī)定的RTP頭的結(jié)構(gòu).
?????? 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???????????? |
????? |???????????????????????????? ....????????????????????????????? |
????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
? 負(fù)載類(lèi)型 Payload type (PT): 7 bits
? 序列號(hào) Sequence number (SN): 16 bits
? 時(shí)間戳 Timestamp: 32 bits
?
? H.264 Payload格式定義了三種不同的基本的負(fù)載(Payload)結(jié)構(gòu). 接收端可能通過(guò)RTP Payload的第一個(gè)字節(jié)來(lái)識(shí)別它們.?這一個(gè)字節(jié)類(lèi)似NALU頭的格式, 而這個(gè)頭結(jié)構(gòu)的NAL單元類(lèi)型字段則指出了代表的是哪一種結(jié)構(gòu),這個(gè)字節(jié)的結(jié)構(gòu)如下, 可以看出它和H.264的NALU頭結(jié)構(gòu)是一樣的.
??????+===============+
????? |0|1|2|3|4|5|6|7|
????? +=+=+=+=+=+=+=+=+
????? |F|NRI|?? Type ?|
????? +===============+
? 字段 Type: 這個(gè)RTP payload中NAL單元的類(lèi)型. 這個(gè)字段和H.264中類(lèi)型字段的區(qū)別是, 當(dāng)type的值為24 ~ 31表示這是一個(gè)特別格式的NAL單元, 而H.264中, 只取1~23是有效的值.
??
? 24??? STAP-A?? 單一時(shí)間的組合包
? 24??? STAP-B?? 單一時(shí)間的組合包
? 26??? MTAP16?? 多個(gè)時(shí)間的組合包
? 27??? MTAP24?? 多個(gè)時(shí)間的組合包
? 28??? FU-A???? 分片的單元
? 29??? FU-B???? 分片的單元
? 30-31? 沒(méi)有定義
? 可能的結(jié)構(gòu)類(lèi)型分別有:
? 1. 單一NAL單元模式
???? 即一個(gè)RTP包僅由一個(gè)完整的NALU組成. 這種情況下RTP NAL頭類(lèi)型字段和原始的H.264的NALU頭類(lèi)型字段是一樣的.
??2. 組合封包模式
??? 即可能是由多個(gè)NAL單元組成一個(gè)RTP包. 分別有4種組合方式: STAP-A, STAP-B, MTAP16, MTAP24.那么這里的類(lèi)型值分別是24, 25, 26以及27.
??3. 分片封包模式
??? 用于把一個(gè)NALU單元封裝成多個(gè)RTP包. 存在兩種類(lèi)型FU-A和FU-B. 類(lèi)型值分別是28和29.
2.1 單一NAL單元模式
? 對(duì)于NALU的長(zhǎng)度小于MTU大小的包, 一般采用單一NAL單元模式.
? 對(duì)于一個(gè)原始的H.264 NALU單元常由[Start Code] [NALU Header] [NALU Payload]三部分組成, 其中Start Code用于標(biāo)示這是一個(gè)NALU 單元的開(kāi)始, 必須是 "00 00 00 01"或"00 00 01", NALU頭僅一個(gè)字節(jié), 其后都是NALU單元內(nèi)容.
? 打包時(shí)去除"00 00 01"或"00 00 00 01"的開(kāi)始碼, 把其他數(shù)據(jù)封包成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??????? |
????? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
? 如有一個(gè)H.264的NALU是這樣的:
? [00 00 00 01 67 42 A0 1E 23 56 0E 2F ... ]
? 這是一個(gè)序列參數(shù)集NAL單元. [00 00 00 01]是四個(gè)字節(jié)的開(kāi)始碼, 67是NALU頭, 42開(kāi)始的數(shù)據(jù)是NALU內(nèi)容.
? 封裝成RTP包將如下:
? [RTP Header] [67 42 A0 1E 23 56 0E 2F]
? 即只要去掉4個(gè)字節(jié)的開(kāi)始碼就可以了.
2.2 組合封包模式
? 其次, 當(dāng)NALU的長(zhǎng)度特別小時(shí), 可以把幾個(gè)NALU單元封在一個(gè)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).
? 而當(dāng)NALU的長(zhǎng)度超過(guò)MTU時(shí), 就必須對(duì)NALU單元進(jìn)行分片封包. 也稱(chēng)為 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參數(shù)
? 下面描述了如何在SDP中表示一個(gè)H.264流:
? . "m=" 行中的媒體名必須是 "video"
? . "a=rtpmap" 行中的編碼名稱(chēng)必須是 "H264".
? . "a=rtpmap" 行中的時(shí)鐘頻率必須是 90000.
? . 其他參數(shù)都包括在"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==
? 下面介紹一些常用的參數(shù).
3.1 packetization-mode:
? 表示支持的封包模式.
? 當(dāng) packetization-mode 的值為 0 時(shí)或不存在時(shí), 必須使用單一NALU單元模式.
? 當(dāng) packetization-mode 的值為 1 時(shí)必須使用非交錯(cuò)(non-interleaved)封包模式.
? 當(dāng) packetization-mode 的值為 2 時(shí)必須使用交錯(cuò)(interleaved)封包模式.
? 這個(gè)參數(shù)不可以取其他的值.
3.2 sprop-parameter-sets:
? 這個(gè)參數(shù)可以用于傳輸H.264的序列參數(shù)集和圖像參數(shù)NAL單元. 這個(gè)參數(shù)的值采用Base64進(jìn)行編碼. 不同的參數(shù)集間用","號(hào)隔開(kāi).
?
3.3 profile-level-id:
? 這個(gè)參數(shù)用于指示H.264流的profile類(lèi)型和級(jí)別. 由Base16(十六進(jìn)制)表示的3個(gè)字節(jié). 第一個(gè)字節(jié)表示H.264的Profile類(lèi)型, 第三個(gè)字節(jié)表示H.264的Profile級(jí)別.
?
3.4 max-mbps:
? 這個(gè)參數(shù)的值是一個(gè)整型, 指出了每一秒最大的宏塊處理速度
?
NALU的類(lèi)型
NALU(NAL單元)的順序要求
NALU類(lèi)型
????標(biāo)識(shí)NAL單元中的RBSP數(shù)據(jù)類(lèi)型,其中,nal_unit_type為1, 2, 3, 4, 5及12的NAL單元稱(chēng)為VCL的NAL單元,其他類(lèi)型的NAL單元為非VCL的NAL單元。
????0:未規(guī)定
????1:非IDR圖像中不采用數(shù)據(jù)劃分的片段
????2:非IDR圖像中A類(lèi)數(shù)據(jù)劃分片段
????3:非IDR圖像中B類(lèi)數(shù)據(jù)劃分片段
????4:非IDR圖像中C類(lèi)數(shù)據(jù)劃分片段
????5:IDR圖像的片段
????6:補(bǔ)充增強(qiáng)信息 (SEI)
????7:序列參數(shù)集
????8:圖像參數(shù)集
????9:分割符
????10:序列結(jié)束符
????11:流結(jié)束符
????12:填充數(shù)據(jù)
????13 – 23:保留
????24 – 31:未規(guī)定
????H.264/AVC標(biāo)準(zhǔn)對(duì)送到解碼器的NAL單元順序是有嚴(yán)格要求的,如果NAL單元的順序是混亂的,必須將其重新依照規(guī)范組織后送入解碼器,否則解碼器不能夠正確解碼。
????1. 序列參數(shù)集NAL單元(nal_unit_type為7)必須在傳送所有以此參數(shù)集為參考的其他NAL單元之前傳送,不過(guò)允許這些NAL單元中間出現(xiàn)重復(fù)的序列參數(shù)集NAL單元。所謂重復(fù)的詳細(xì)解釋為:序列參數(shù)集NAL單元都有其專(zhuān)門(mén)的標(biāo)識(shí),如果兩個(gè)序列參數(shù)集NAL單元的標(biāo)識(shí)相同,就可以認(rèn)為后一個(gè)只不過(guò)是前一個(gè)的拷貝,而非新的序列參數(shù)集。
????2.圖像參數(shù)集NAL單元(nal_unit_type為8)必須在所有以此參數(shù)集為參考的其他NAL單元之先,不過(guò)允許這些NAL單元中間出現(xiàn)重復(fù)的圖像參數(shù)集NAL單元,這一點(diǎn)與上述的序列參數(shù)集NAL單元是相同的。
????3. 不同基本編碼圖像中的片段(slice)單元和數(shù)據(jù)劃分片段(data partition)單元在順序上不可以相互交叉,即不允許屬于某一基本編碼圖像的一系列片段(slice)單元和數(shù)據(jù)劃分片段(data partition)單元中忽然出現(xiàn)另一個(gè)基本編碼圖像的片段(slice)單元片段和數(shù)據(jù)劃分片段(data partition)單元。
????4.參考圖像的影響:如果一幅圖像以另一幅圖像為參考,則屬于前者的所有片段(slice)單元和數(shù)據(jù)劃分片段(data partition)單元必須在屬于后者的片段和數(shù)據(jù)劃分片段之后,無(wú)論是基本編碼圖像還是冗余編碼圖像都必須遵守這個(gè)規(guī)則
????5.基本編碼圖像的所有片段(slice)單元和數(shù)據(jù)劃分片段(data partition)單元必須在屬于相應(yīng)冗余編碼圖像的片段(slice)單元和數(shù)據(jù)劃分片段(data partition)單元之前。
????6.如果數(shù)據(jù)流中出現(xiàn)了連續(xù)的無(wú)參考基本編碼圖像,則圖像序號(hào)小的在前面。
????7. 如果arbitrary_slice_order_allowed_flag置為1,一個(gè)基本編碼圖像中的片段(slice)單元和數(shù)據(jù)劃分片段(data partition)單元的順序是任意的,如果arbitrary_slice_order_allowed_flag置為零,則要按照片段中第一個(gè)宏塊的位置來(lái)確定片段的順序,若使用數(shù)據(jù)劃分,則A類(lèi)數(shù)據(jù)劃分片段在B類(lèi)數(shù)據(jù)劃分片段之前,B類(lèi)數(shù)據(jù)劃分片段在C類(lèi)數(shù)據(jù)劃分片段之前,而且對(duì)應(yīng)不同片段的數(shù)據(jù)劃分片段不能相互交叉,也不能與沒(méi)有數(shù)據(jù)劃分的片段相互交叉。
????8.如果存在SEI(補(bǔ)充增強(qiáng)信息) 單元的話,它必須在它所對(duì)應(yīng)的基本編碼圖像的片段(slice)單元和數(shù)據(jù)劃分片段(data partition)單元之前,并同時(shí)必須緊接在上一個(gè)基本編碼圖像的所有片段(slice)單元和數(shù)據(jù)劃分片段(data partition)單元后邊。假如SEI屬于多個(gè)基本編碼圖像,其順序僅以第一個(gè)基本編碼圖像為參照。
????9.如果存在圖像分割符的話,它必須在所有SEI 單元、基本編碼圖像的所有片段slice)單元和數(shù)據(jù)劃分片段(data partition)單元之前,并且緊接著上一個(gè)基本編碼圖像那些NAL單元。
????10. 如果存在序列結(jié)束符,且序列結(jié)束符后還有圖像,則該圖像必須是IDR(即時(shí)解碼器刷新)圖像。序列結(jié)束符的位置應(yīng)當(dāng)在屬于這個(gè)IDR圖像的分割符、SEI 單元等數(shù)據(jù)之前,且緊接著前面那些圖像的NAL單元。如果序列結(jié)束符后沒(méi)有圖像了,那么它的就在比特流中所有圖像數(shù)據(jù)之后。
????11.流結(jié)束符在比特流中的最后。
????①NALU(Network Abstract Layer Unit):H264標(biāo)準(zhǔn)中的比特流是以NAL為單位,每個(gè)NAL單元包含一個(gè)RBSP(raw byte sequence payload,原始字節(jié)序列載荷),NALU的頭信息定義了RBSP所屬類(lèi)型。類(lèi)型一般包括序列參數(shù)集(SPS)、圖像參數(shù)集(PPS)、增強(qiáng)信息(SEI)、條帶(Slice)等,其中,SPS和PPS屬于參數(shù)集,兩標(biāo)準(zhǔn)采用參數(shù)集機(jī)制是為了將一些主要的序列、圖像參數(shù)(解碼圖像尺寸、片組數(shù)、參考幀數(shù)、量化和濾波參數(shù)標(biāo)記等)與其他參數(shù)分離,通過(guò)解碼器先解碼出來(lái)。此外,為了增強(qiáng)圖像的清晰度,AVS-M添加了圖像頭(Picture head)信息。讀取NALU流程中,每個(gè)NALU前有一個(gè)起始碼0x000001,為防止 內(nèi)部0x000001序列競(jìng)爭(zhēng),H.264編碼器在最后一字節(jié)前插入一個(gè)新的字節(jié)——0x03,所以解碼器檢測(cè)到該序列時(shí),需將0x03刪掉,而AVS-M只需識(shí)別出起始碼0x000001。
????②讀取宏塊類(lèi)型(mb type)和宏塊編碼模板(cbp):編解碼圖像以宏塊劃分,一個(gè)宏塊由一個(gè)16*16亮度塊和相應(yīng)的一個(gè)8*8cb和一個(gè)8*8cr色度塊組成。
總結(jié)
以上是生活随笔為你收集整理的H.264视频RTP负载格式/NALU的类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Upsync:微博开源基于Nginx容器
- 下一篇: RTMP直播应用与延时分析