rtp全名是real-time transport protocol(實時傳輸協議)。它是ietf提出的乙個標準,對應的rfc文件為rfc3550(rfc1889為其過期版本)。rfc3550不僅定義了rtp,而且定義了配套的相關協議rtcp(real-time transport control protocol,即實時傳輸控制協議)。rtp用來為ip網上的語音、影象、傳真等多種需要實時傳輸的多**資料提供端到端的實時傳輸服務。rtp為internet上端到端的實時傳輸提供時間資訊和流同步,但並不保證服務質量,服務質量由rtcp來提供。
rtp用於在單播或多播網路中傳送實時資料。它們典型的應用場合有如下幾個。
rtp包頭佔位12個位元組,其欄位組成如下圖所示:
字段含義
vrtp協議版本號,佔位2bit,當前協議為v=2
p填充字段,佔位1bit,如果p=1,則表示此包的尾部填充乙個或多個額外的八位組,它們不是有效載荷的一部分。
x擴充套件字段,佔位1bit,如果x=1,則表示rtp包頭後面跟有乙個擴充套件報頭;
cccsrc計數器,佔位4bit,表示csrc識別符號的個數;mpt
sequence number
timestamp
時間戳字段,佔位32bit,必須使用90khz 時鐘頻率。時戳反映了該rtp報文的第乙個八位組的取樣時刻。接收者使用時戳來計算延遲和延遲抖動,並進行同步控制。
ssrc
csrc
特約信源識別符號,每個csrc識別符號佔位32bit,可以有0~15個。每個csrc標識了包含在該rtp報文有效載荷中的所有特約信源。
注:基本的rtp說明並不定義任何頭擴充套件本身,如果遇到x=1,需要特殊處理
如果擴充套件標誌被置位則說明緊跟在報頭後面是乙個頭擴充套件,其格式如下:
取一段碼流如下:
其中:碼流
含義80
v_p_x_cc
e0m_pt
00 1e
sequencenum
00 00 d2 f0
timestamp
00 00 00 00
ssrc
把前兩位元組換成二進位制如下
1000 0000 1110 0000
按順序解釋如下:10v
0p0x
0000cc1
m110 0000
pt每個nal單元是乙個一定語法元素的可變長位元組字串,包括包含乙個位元組的頭資訊(用來表示資料型別),以及若干整數位元組的負荷資料。乙個nal單元可以攜帶乙個編碼片、a/b/c型資料分割或乙個序列或影象引數集。
nalu封包成rtp有三種方式:
一般我們常用的就是單一nal單元和分片封包模式兩種。即我們所使用的rtp+h264一般都是乙個rtp包中最多只有乙個nalu包;在nal_unit_type的定義中(見表一),0到23是給h264用的,24~31未使用,在rtp打包時,如果乙個nalu放在乙個rtp包裡,可以使用nalu的nal_unit_type,但是當需要把多個nalu打包成乙個rtp包,或者需要把乙個nalu打包成多個rtp包時,就定義新的type來標識。
表一:
nal_unit_type
nal型別c0
未指定1
不分割槽、非idr影象的片
slice_layer_without_partitioning_rbsp( )
2,3,4
2片分割槽a
slice_data_partition_a_layer_rbsp( )23
片分割槽b
slice_data_partition_b_layer_rbsp( )34
片分割槽c
slice_data_partition_c_layer_rbsp( )45
idr影象的片
slice_layer_without_partitioning_rbsp( )
2,36
輔助增強資訊 (sei)
sei_rbsp( )57
序列引數集
seq_parameter_set_rbsp( )08
影象引數集
pic_parameter_set_rbsp( )19
訪問單元分隔符
access_unit_delimiter_rbsp( )610
序列結尾
end_of_seq_rbsp( )711
碼流結尾
end_of_stream_rbsp( )812
填充資料
filler_data_rbsp( )913
序列引數集擴充套件
seq_parameter_set_extension_rbsp( )
14…18
保留19
未分割槽的輔助編碼影象的片
slice_layer_without_partitioning_rbsp( )
20…23
保留24…31
未指定nalu 頭由乙個位元組組成, 它的語法如下:
nal單元按rtp序列號按序傳送。其中,f為禁止位,佔1bit,r為重要性指示位,佔2個bit;t為負荷資料型別,佔5bit。具體如下:
h264乙個影象序列的組成:sps+pps+sei+乙個i幀+若干個p幀。sps、pps、sei、乙個i幀、乙個p幀都可以稱為乙個nalu。
h264的nalu結構:開始碼+nalu頭+nalu資料
264常見的幀頭資料為:
00 00 00 01 67 (sps)
00 00 00 01 68 (pps)
00 00 00 01 65 ( idr 幀)
00 00 00 01 61 (p幀)
00 00 00 01 41 (p幀)
nalu資料為編碼器編出來的影象資訊或影象資料。
五種型別的nalu
(1)、sps(序列引數集)
:nalu頭值為0x67(十六進製制),nalu頭type位值為7(十進位制)。
(2)、pps(影象引數集)
:nalu頭值為0x68(十六進製制),nalu頭type位值為8(十進位制)。
(3)、sei(補充增強資訊)
:nalu頭值為0x06(十六進製制),nalu頭type位值為6(十進位制)。
(4)、i幀
:nalu頭值為0x65(十六進製制),nalu頭type位值為5(十進位制)。
(5)、p幀
:nalu頭值為0x61(十六進製制),nalu頭type位值為1(十進位制)。
h264的nalu打包成rtp包的模式(下面是用到的兩種模式)
當 nalu 的長度特別小時, 可以把幾個 nalu 單元封在乙個 rtp 包中.
type
packet
type name
0沒有定義
1-23
nal單元
單個 nal 單元包.
24stap-a
單一時間的組合包
24stap-b
單一時間的組合包
26mtap16
多個時間的組合包
27mtap24
多個時間的組合包
28fu-a
分片的單元
29fu-b
分片的單元
30-31
沒有定義
2 ) fu header的格式如下:
s: 1 bit 當設定成1,開始位指示分片nal單元的開始。當跟隨的fu荷載不是分片nal單元荷載的開始,開始位設為0。
e: 1 bit 當設定成1, 結束位指示分片nal單元的結束,即, 荷載的最後位元組也是分片nal單元的最後乙個位元組。
當跟隨的fu荷載不是分片nal單元的最後分片,結束位設定為0。
r: 1 bit
保留位必須設定為0,接收者必須忽略該位。
type: 5 bits
此處的type就是nalu頭中的type,取1-23的那個值,表示 nal單元荷載型別定義,見表一
H264解碼之PES流解析
可以看出 固定頭由3部分組成 下面依次介紹其每個欄位的含義 escr欄位 此欄位佔位48bit,由33bit的escr base欄位和9bit的escr extension欄位組成,escr flag 1時此字段存在 資料依次順序 es rate欄位 目標解碼器接收pes分組位元組速率,禁止為0,佔...
h264碼流rtp打包(一)
一幀image 編碼完的資料儲存在 h264buffer 中,編碼後的 h264 碼流的大小為 nh264size 因為對於nalu,並不是一幀對應乙個nalu,而是對於slice而言,乙個slice就封裝層乙個nal,所以一幀可以有多個slice,即一幀有多個nal。具體一幀中有幾個nalu則是可...
RTP封裝H264詳解
nalu buff nal資料buff len nal資料長度 cnt 包數 max fu size 每包長度,一般1400 nalu type nal型別 cnt len max fu size 0 len max fu size len max fu size 1 nalu type buff ...