H264解碼之RTP流解析

2021-09-25 17:11:40 字數 4322 閱讀 3388

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 ...