1. 程式人生 > >webrtc程式碼走讀五(vp8 rtp 報文解析)

webrtc程式碼走讀五(vp8 rtp 報文解析)

一、wireshark解析VP8報文方法

首先webrtc裡面預設開啟了FEC和SRTP功能,導致wireshark無法正常解析VP8的報文。所以若想了解VP8的RTP報文格式,還需要先關閉FEC、SRTP。

1、關閉FEC。

internalencoderfactory.cc檔案遮蔽kRedCodecName、kUlpfecCodecName

2、關閉SRTP

webrtc\src\webrtc\api\peerconnectioninterface.h

disable_encryption = true 取消SRTP

bool Conductor::CreatePeerConnection(bool dtls)配置不生成金鑰。

3、啟動RTP資料抓包

這樣就能捕獲VP8的RTP報文,進行分析了。

二、協議定義

 

1、RTP公共頭

2、VP8 Payload Descriptor

 

X:該位為1時,後面這些 OPTIONAL(Ibit、Lbit、Tbit、Kbit)需要進行解析,如果為0的話,則直接忽略這些可選的專案。
R:保留。
N:Non-reference幀。預設是0,以備後續擴充套件。
S:Start of VP8 partition,如果當前的幀為VP8 partition的起始,則該引數必須被置1。
PartID:partition index,如果S位為1,那麼partid為1。

之後的I bit、L bit、T bit、K bit都是需要X置1才有效。

I:picture id呈現標誌位,置1時,必須在後面I所示行呈現picture id。
L:TL0PICIDX呈現標誌位,置1時,必須在後面L所示行呈現TL0PICIDX。
T:TID呈現標誌位.被置1時,可選的TID/KEYIDX部分必須被呈現。TID|Y部分必須在其之後。如果K被置1但T為0,TID/KEYIDX必須呈現出來,但是TID|Y必須被忽略。T或K都不為1時,TID/KEYIDX都不必呈現!
K:KEYIDX present,這個其實和T說明的差不多了。
RSV:保留。

PictureID:8位或16位的長度,其中首位為為1時,則為16位的長度,後15位為picture id,為0,則為8位的長度,後7位為picture id。PictureID為視訊幀序列號。可以以隨機數起始,但是必須以1遞增。
TL0PICIDX:8位temporal level為0的幀序號。當下面的TID為0時,是temporal level為0的幀序號。否則是當前幀參考前面幀的個數。
TID:2為temporal layer index.目前VPX和264支援最大4層Temporal Scalability。
Y:1 layer sync bit.
Informative note: This document does not describe how to determine the dependency status for a frame; this information is preferably provided from the encoder implementation. In the case of unknown status, the Y bit can safely be set to 0.
KEYIDX:5 bits temporal key frame index.

關於TID、TL0PICIDX、Y引數含義的理解,請參考https://blog.csdn.net/CrystalShaw/article/details/81184531

2、VP8 Payload Header

三、參考

 

https://tools.ietf.org/html/rfc7741

http://elkpi.com/topics/vp8-rtp-payload.html