1 概述
經(jīng)過H264編碼器編碼后輸出的H264裸流數(shù)據(jù)乎芳,輸出的形式是以nalu的格式輸出的馋缅,主要分為兩層贫途,VCL(視頻編碼層)和NAL(網(wǎng)絡(luò)提取層),VCL主要負(fù)責(zé)表示壓縮后的視頻數(shù)據(jù)蹋肮,像塊出刷、宏塊、片等坯辩。NAL主要是在VCL之上針對于網(wǎng)絡(luò)傳輸提取出來的層級馁龟。然后NALU到達(dá)rtp封包模塊進(jìn)行封包,以下內(nèi)容詳細(xì)描述漆魔。
1.1 Nalu 結(jié)構(gòu)格式
一個(gè)原始的H.264 NALU單元常由[StartCode] [NALU Header] [NALU Payload]三部分組成坷檩,其中 Start Code 用于標(biāo)示這是一個(gè)NALU 單元的開始却音,必須是"00 00 00 01" 或"00 00 01",除此之外基本相當(dāng)于一個(gè)NAL header + RBSP;
RBSP矢炼、SODB系瓢、EBSP三者的區(qū)別和聯(lián)系
(1)SODB:最原始的編碼數(shù)據(jù),沒有任何附加數(shù)據(jù)
(2)RBSP:在SODB的基礎(chǔ)上加了rbsp_stop_ont_bit(bit 值為 1)并用 0 按字節(jié)補(bǔ)位對齊
(3)EBSP:在 RBSP 的基礎(chǔ)上增加了防止偽起始碼字節(jié)(0X03)
(4)NALU是對RBSP的封裝句灌。而RTP之類的是對NALU的封裝夷陋。
具體格式參見下圖
1.2 rtp包格式
rtp包頭如下:
V:RTP協(xié)議的版本號,占2位胰锌,當(dāng)前協(xié)議版本號為2
P:填充標(biāo)志骗绕,占1位,如果P=1资昧,則在該報(bào)文的尾部填充一個(gè)或多個(gè)額外的八位組爹谭,它們不是有效載荷的一部分。
X:擴(kuò)展標(biāo)志榛搔,占1位,如果X=1东揣,則在RTP報(bào)頭后跟有一個(gè)擴(kuò)展報(bào)頭
CC:CSRC計(jì)數(shù)器践惑,占4位,指示CSRC 標(biāo)識符的個(gè)數(shù)
M: 標(biāo)記嘶卧,占1位尔觉,不同的有效載荷有不同的含義,對于視頻芥吟,標(biāo)記一幀的結(jié)束侦铜;對于音頻,標(biāo)記會話的開始钟鸵。
PT: 有效荷載類型钉稍,占7位,用于說明RTP報(bào)文中有效載荷的類型棺耍,如GSM音頻贡未、JPEM圖像等,在流媒體中大部分是用來區(qū)分音頻流和視頻流的,這樣便于客戶端進(jìn)行解析蒙袍。
序列號:占16位俊卤,用于標(biāo)識發(fā)送者所發(fā)送的RTP報(bào)文的序列號,每發(fā)送一個(gè)報(bào)文害幅,序列號增1消恍。這個(gè)字段當(dāng)下層的承載協(xié)議用UDP的時(shí)候,網(wǎng)絡(luò)狀況不好的時(shí)候可以用來檢查丟包以现。同時(shí)出現(xiàn)網(wǎng)絡(luò)抖動的情況可以用來對數(shù)據(jù)進(jìn)行重新排序狠怨,序列號的初始值是隨機(jī)的约啊,同時(shí)音頻包和視頻包的sequence是分別記數(shù)的。
時(shí)戳(Timestamp):占32位取董,必須使用90 kHz 時(shí)鐘頻率棍苹。時(shí)戳反映了該RTP報(bào)文的第一個(gè)八位組的采樣時(shí)刻。接收者使用時(shí)戳來計(jì)算延遲和延遲抖動茵汰,并進(jìn)行同步控制枢里。
同步信源(SSRC)標(biāo)識符:占32位,用于標(biāo)識同步信源蹂午。該標(biāo)識符是隨機(jī)選擇的栏豺,參加同一視頻會議的兩個(gè)同步信源不能有相同的SSRC。
特約信源(CSRC)標(biāo)識符:每個(gè)CSRC標(biāo)識符占32位豆胸,可以有0~15個(gè)奥洼。每個(gè)CSRC標(biāo)識了包含在該RTP報(bào)文有效載荷中的所有特約信源。
rtp頭后的負(fù)載,負(fù)載的封包格式有負(fù)載的第一個(gè)自己的后5位決定晚胡,具體格式如下圖.
右上圖可以看出和nalu的header格式一樣灵奖,但是后5位表示的含義不相同。nalu表示的是slice類型估盘,對于rtp payload代表后面的數(shù)據(jù)的打包方式瓷患。type取值如下:
0 沒有定義
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 沒有定義
以上類型大概可以分為三類:
- 單個(gè) NAL 單元包:荷載中只包含一個(gè) NAL 單元。 NAL 頭類型域等于原始 NAL 單元類型, 即在范圍 1到 23 之間;
- 聚合包:本類型用于聚合多個(gè) NAL 單元到單個(gè) RTP 荷載中遣妥。有四種版本, 單時(shí)間聚合包類型 A(STAP-A) 擅编,單時(shí)間聚合包類型 B (STAP-B) ,多時(shí)間聚合包類型(MTAP)16 位位移(MTAP16), 多時(shí)間聚合包類型(MTAP)24 位位移(MTAP24) 箫踩。賦予 STAP-A, STAP-B, MTAP16, MTAP24 的 NAL 單元類型號分別是 24,25, 26, 27;
- 分片單元: 由于單個(gè)nal的大小超過了一個(gè)rtp傳輸負(fù)載的mtu,所以將其進(jìn)行分片爱态,用于分片單個(gè) NAL 單元到多個(gè) RTP 包。 現(xiàn)存兩個(gè)版本 FU-A境钟, FU-B, 用 NAL 單元類型 28锦担,29 標(biāo)識;
1.2.1 單個(gè) NAL 單元包
定義在此的NAL單元包必須只包含一個(gè)。這意味聚合包和分片單元不可以用在單個(gè)NAL 單元包中吱韭。并且RTP序號必須符合NAL單元的解碼順序吆豹。NAL單元的第一字節(jié)和RTP荷載頭第一個(gè)字節(jié)重合。
1.2.2 聚合包
-
STAP-A
STAP-A 聚合2個(gè)NALU
抓包webrtc中sps理盆、pps封包痘煤,如下:
sps\pps 封包抓包場景.png -
STAP-B
STAP-B 封包格式
STAP-B比STAP-A多了一個(gè)公共的DON,DON域指定STAP-B傳輸順序中第一個(gè)NAL單元的DON值. 對每個(gè)后續(xù)出現(xiàn)在STAP-B中的NAL單元猿规,它的DON值等于(STAP-B中前一個(gè)NAL的DON值+1)%65535, %是取模運(yùn)算衷快。
單時(shí)刻聚合單元有一個(gè)16位無符號大小信息(網(wǎng)絡(luò)字節(jié)序),他指示后續(xù)NAL單元的大幸塘(以字節(jié)為單位)(不包括這兩個(gè)字節(jié),但包括NAL單元類型字節(jié)),后面緊跟NAL單元本身, 包括它的NAL單元類型字節(jié). 單時(shí)刻聚合單元在RTP荷載中是字節(jié)對齊的,但可以不是32位字邊界對齊蘸拔。
-
MTAP16/24
MTAP16/24 格式
兩個(gè)不同多時(shí)刻聚合單元师郑。兩個(gè)都有16位的無符號大小信息用于后續(xù)NAL單元(網(wǎng)絡(luò)字節(jié)序),一個(gè)8位無符號解碼序號差值(DOND), 和n位 (網(wǎng)絡(luò)字節(jié)序) 時(shí)戳位移(TS 位移)用于本NAL單元,n可以是16/24. 不同MTAP類型的選擇是應(yīng)用相關(guān)的(MTAP16/MTAP24): 時(shí)戳位移越大, MTAP的靈活性越大, 但是負(fù)擔(dān)也越大。
MTAP16/MTAP24多時(shí)刻聚合單元的結(jié)構(gòu)分別在圖 10 调窍,11表示宝冕。一個(gè)包中的聚合單元的開始/結(jié)束不要求位于32位的邊界。跟隨NAL單元的DON 等于(DONB + DOND) % 65536, %代表取摸操作. 本文沒有指定MTAP內(nèi)的NAL單元如何排序邓萨,但大多數(shù)情況地梨,應(yīng)該使用NAL單元解碼順序。
時(shí)戳位移域必須設(shè)置成等于以下公式的值:如果NALU-time大于等于包的RTP時(shí)戳,則時(shí)戳位移等于(NALU-time - 包的RTP時(shí)戳).
如果NALU-time小于包的RTP時(shí)戳,則時(shí)戳位移等于 NALU-time + (2^32 - 包的RTP時(shí)戳).
1.2.3 分片單元(FU-A缔恳、FU-B)
本荷載類型允許分片一個(gè)NAL單元到幾個(gè)RTP包中宝剖。
FU indicator對應(yīng)格式:
其中type=28,29表示FU-A和FU-B
FU header對應(yīng)格式:
S: 1 bit
當(dāng)設(shè)置成1,開始位指示分片NAL單元的開始歉甚。當(dāng)跟隨的FU荷載不是分片NAL單元荷載的開始万细,開始位設(shè)為0。
E: 1 bit
當(dāng)設(shè)置成1, 結(jié)束位指示分片NAL單元的結(jié)束纸泄,即, 荷載的最后字節(jié)也是分片NAL單元的最后一個(gè)字節(jié)赖钞。當(dāng)跟隨的FU荷載不是分片NAL單元的最后分片,結(jié)束位設(shè)置為0。
R: 1 bit
保留位必須設(shè)置為0聘裁,接收者必須忽略該位仁烹。
Type: 5bit
與NALU Header type 對應(yīng)
標(biāo)準(zhǔn)文檔
http://www.rosoo.net/Files/UpFiles/RsProduct/avtools/2009-4/2009491562537854.txt