webrtc RTP config

RtpConfig 结构体定义了 WebRTC 中单个 RTP 发送流(Send Stream)或接收流的配置参数。它涵盖了从基本的标识符(SSRC)、编解码器信息到高级的差错控制机制(NACK, FEC, RTX)等所有关键设置。

RtpConfig 是 WebRTC 媒体流建立的蓝图。它在 VideoSendStream 或 AudioSendStream 创建时被传入,决定了:

  1. 身份:我是谁(SSRC, MID, CNAME)。

  2. 内容:我发什么编码(Payload Type, Name)。

  3. 可靠性:我如何抗丢包(NACK 缓存多久,是否有 RTX/FEC 备份流)。

  4. 格式:包有多大,头里带什么扩展信息。

一 ,基本标识与映射

1.1 std::vector<uint32_t> ssrcs:

• 同步源标识符 (SSRC) 列表。

• 在 simulcast(多路并发流,如高清/标清/低清同时发送)场景下,这里会有多个 SSRC,分别对应不同的层级。单路流通常只有一个。

1.2 std::vector<std::string> rids:

• RTP Stream IDs (RID)。这是 RFC 8852 定义的扩展,用于在 SDP 协商后唯一标识一个 RTP 流,而不依赖 SSRC(因为 SSRC 可能会变)。

• ridsi 对应 ssrcsi。例如:{"h", "l"} 对应高分辨率和低分辨率流。

1.3 std::string mid:

• Media Identification。对应 SDP 中的 a=mid 属性。

• 用于将 RTP 包绑定到特定的媒体部分(m-line),特别是在 BUNDLE 策略下,多个媒体流共享同一个传输通道时,MID 用于区分它们。

1.4 std::string c_name:

• RTCP CNAME (Canonical Name)。

• 遵循 RFC 3550,用于在 RTCP 包中标识参与者。同一个 PeerConnection 中的所有流通常共享同一个 CNAME,以便进行音视频同步。

二、编解码器与载荷

2.1 std::string payload_name:

• 编解码器名称,如 "VP8", "VP9", "H264", "OPUS"。

2.2 int payload_type:

• RTP Payload Type (PT)。7-bit 整数,标识载荷格式。动态范围通常是 96-127。

2.3 bool raw_payload:

• 如果为 true,表示载荷是"原始"的,不包含特定的编解码器头部(如 VP8 起始字节)。元数据将通过通用的 RTP 头扩展(Generic Frame Descriptor)传递。这通常用于实验性或特定的封装格式。

三、包大小与扩展

3.1 size_t max_packet_size:

• 最大 RTP 包大小(字节)。默认值为 1500 - 40 = 1460,这是为了适应以太网 MTU (1500) 减去 IPv4 头部 (20) 和 UDP 头部 (8) 以及可能的其他开销,防止 IP 分片。

3.2 std::vector<RtpExtension> extensions:

• 启用的 RTP 头扩展列表。例如:绝对发送时间 (urn:ietf:params:rtp-hdrext:toffset)、视频旋转、色彩空间信息等。

3.3 bool extmap_allow_mixed:

• 对应 SDP 属性 extmap-allow-mixed。允许在同一个会话中混合使用单字节和双字节的头扩展 ID 映射。

四、差错控制与重传 (Error Control & Retransmission)

4.1 NACK (ARQ的模式之一)

NackConfig nack:

• 包含 rtp_history_ms。

• 表示发送端需要缓存多久(毫秒)的数据包,以便在接收端请求重传(NACK)时能够重新发送。设为 0 则禁用 NACK。

4.2 RTX (重传流)

struct Rtx rtx:

• ssrcs: 专门用于重传的 SSRC 列表。RTX 流通常有独立的 SSRC,以便与主媒体流区分开。

• payload_type: RTX 使用的 Payload Type。RTX 包的结构是 Original HeaderOriginal Payload,接收端剥离 RTX 头后恢复原始包。

4.3 ULPFEC / RED (前向纠错)

UlpfecConfig ulpfec:

• ulpfec_payload_type: ULPFEC (Uneven Level Protection Forward Error Correction) 包的 PT。

• red_payload_type: RED (Redundant Audio Data) 包的 PT。RED 用于将主数据和 FEC 数据打包在一起,或者将当前帧与前一帧打包。

• red_rtx_payload_type: 如果 RED 包本身丢失,用于重传 RED 包的 RTX PT。

• 注:ULPFEC 主要用于音频或旧版视频保护,现代视频更多使用 FlexFEC。

4.4 FlexFEC (灵活前向纠错)

struct Flexfec flexfec:

• payload_type: FlexFEC 包的 PT。设为 -1 禁用。

• ssrc: FlexFEC 流专用的 SSRC。

• protected_media_ssrcs: 被此 FlexFEC 流保护的媒体流 SSRC 列表。目前通常只保护一个主视频流。FlexFEC 比 ULPFEC 更强大,支持跨包纠错和更灵活的冗余策略。

4.5 LNTF (丢包通知)

LntfConfig lntf:

• enabled: 是否启用 Loss Notification。这是一种实验性机制,接收端明确通知发送端哪些包丢失了,帮助发送端调整编码策略(如立即生成关键帧)。

五,RTCP 模式

RtcpMode rtcp_mode:

• 通常为 kCompound(复合包,SR/RR 与 SDES/APP 等在一起)或 kReducedSize(精简包,仅包含必要的报告,节省带宽)。

相关推荐
换个昵称都难13 天前
webrtc peerconnection_server 模块介绍
运维·服务器·webrtc
EasyGBS13 天前
延迟直降90%!国标GB28181视频平台EasyGBS支持WebRTC WHIP推流设备接入,让万物互联更简单
音视频·webrtc
换个昵称都难14 天前
webrtc RtpRtcp模块化测试-MockRtpRtcp
webrtc
如意IT14 天前
指纹浏览器检测之BrowserScan的webrtc指纹检测和反检测
自动化·webrtc·chromium·浏览器开发
换个昵称都难14 天前
webrtc TURN 主要源码介绍
webrtc
换个昵称都难14 天前
webrtc RTC_P2P源码解析
asp.net·webrtc·p2p
换个昵称都难14 天前
webrtc StunServer源码介绍
webrtc
数据知道15 天前
指纹浏览器:DNS 泄漏防范与 WebRTC 本地 IP 屏蔽的底层实现
爬虫·网络协议·tcp/ip·安全·webrtc·数据采集·指纹浏览器
换个昵称都难16 天前
webrtc源码解析概要介绍
webrtc
换个昵称都难16 天前
WebRTC 完整调用流程(前端纯 JS 实现,最简可运行)
webrtc