[筆記] WebRTC VP8 視頻封包的解析

WebRTC媒体流中,从RTP视频流接收到的封包,封包包含RTP header头部以及RTP payload,其中RTPpayload内含是VP8视频内容。将封包刨除RTP header后的VP8内容,其包含两部分:Payload descriptorPayload data部分。Payload descriptor用来描述每笔收到的RTP封包中的VP8画面资料,descriptor后面就带着VP8的资料。


🔰 底下是 Payload descriptor 的部分

90代表 VP8 第一个header,栏位意义如下

X

0

N

S

0

PID

 


X1代表后面还有option

S1代表VP8第一个partition

PID0~7,第一个为0

80代表option

I

L

T

K

000

 


                I1代表后面有I行,带着picture ID

CC-B5 代表picture ID,当M=0ID7-bitM=1ID15-bitID随机产生。

M

Picture ID

 

  

🔰 底下是 Payload data 的 header 部分

70 - C7 - 00 这三个byte代表意义,如下

Size0

H

Ver

P

Size1

Size2

Size = 0 * 2048 + 0xC7 * 8 + 3 = 0x63B = 1595 后面有1595 bytes

                P0代表key frame1代表inter frame

                H0代表不显示,1代表显示

 

9D - 01 - 2A:是 magic number

0x80 0x02:代表宽度Width 0x0280 = 640

0xE0 0x01:代表高度Height 0x01E0 = 480

 

對於 key frame,所占用的 header 為 10 bytes 長度,而對於 inter frame,所占用的 header 長度為 3 bytes。在 RTP 传输中,一个 VP8 frame 会被切成数个封包传送,范例如下。前三个RTP封包是同一 PictureID,后面的封包则ID增加一。先要将 payload descriptor 栏位去掉后,才能丢给ffmpeg 处理。请参考连结 http://www.watersprings.org/pub/id/draft-ietf-payload-vp8-05.html


留言

此網誌的熱門文章

[筆記] Raspberry Pi 樹莓派的軟體開發

[應用] 在 ESP32 Audio 開發板的 VoIP 範例

[筆記] ESP32 在 VS Code 開發環境的編譯與除錯

[筆記] Visual Studio 遠端偵錯的設定步驟

[筆記] Android APP 藍芽範例說明 -- BluetoothChat

[應用] 藍芽 BLE client/server 架構:BLE remote controller

[模組] LD3320 離線語音辨識晶片與 ESP32 無線傳輸