RtpConfig 结构体定义了 WebRTC 中单个 RTP 发送流(Send Stream)或接收流的配置参数。它涵盖了从基本的标识符(SSRC)、编解码器信息到高级的差错控制机制(NACK, FEC, RTX)等所有关键设置。
RtpConfig 是 WebRTC 媒体流建立的蓝图。它在 VideoSendStream 或 AudioSendStream 创建时被传入,决定了:
-
身份:我是谁(SSRC, MID, CNAME)。
-
内容:我发什么编码(Payload Type, Name)。
-
可靠性:我如何抗丢包(NACK 缓存多久,是否有 RTX/FEC 备份流)。
-
格式:包有多大,头里带什么扩展信息。
一 ,基本标识与映射
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(精简包,仅包含必要的报告,节省带宽)。