webrtc媒体部分主要研究媒体数据的处理和传输,这也是webrtc的核心,重点研究传输方向,包括传输过程中丢包、抖动、拥塞问题,涉及到的协议就是流传输协议RTP/RTCP。
RTP/RTCP协议栈位于webrtc-master\webrtc-master\modules\rtp_rtcp目录,主要负责将帧打包成RTP报文,RTP报文解包成帧。RTP/RTCP协议栈模块类ModuleRtpRtcpImpl,重点关注其中RTPSender,RTCPSender,RTCPReceiver类型对象,用于包收发处理;RtpPacket类派生RtpPacketToSend,RtpPacketReceived,用于存储RTP包数据和打包解包;RtcpPacket类派生App,Bye,Psfb,CompoundPacket等类,用于存储RTCP包数据和打包解包。
常见情况,RTP、RTCP收发分别用偶数、奇数端口,webrtc可以使用端口复用,RTCP用RTP端口收发,在RtpTransport::OnReadPacket函数,根据不同包类型分类处理,在RtpTransport::SendPacket函数,支持rtcp_mux_enabled_的RTCP包用rtp_packet_transport_发,不支持用rtcp_packet_transport_发。
从webrtc源码中找的RTP/RTCP包结构:
一、RTP数据包
// 0 1 2 3
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
// ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
// |V=2|P|X| CC |M| PT | sequence number |
// ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
// | timestamp |
// ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
// | synchronization source (SSRC) identifier |
// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
// | Contributing source (CSRC) identifiers |
// | … |
// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
// | header eXtension profile id | length in 32bits |
// ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
// | Extensions |
// | … |
// +=+=+=+=+=+=+=+=+=+=+=+=+=