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(精简包,仅包含必要的报告,节省带宽)。

相关推荐
换个昵称都难2 小时前
WebRTC 视频RTP 优化模块
音视频·webrtc
换个昵称都难15 小时前
webrtc PeerConnection 模块介绍
音视频·webrtc
换个昵称都难1 天前
webrtc neteq Nack_tracker重发(ARQ 的nack技术) 介绍
webrtc
简简单单lym1 天前
WebRTC进阶--red+ulpfec深度解析3-FEC--冗余控制机制深度解析
开发语言·webrtc
hz567891 天前
实时音视频SDK发展趋势:TRTC、WebRTC与云端音视频服务融合路径
架构·音视频·webrtc·实时音视频
换个昵称都难1 天前
webrtc neteq介绍
音视频·webrtc
喵了几个咪1 天前
实时游戏网络协议深度对比:KCP vs WebRTC vs WebSocket
网络协议·游戏·webrtc
喵个咪2 天前
实时游戏网络协议深度对比:KCP vs WebRTC vs WebSocket
后端·websocket·webrtc
weixin_408318042 天前
直播延迟优化实战:从1秒到200ms,WebRTC在医疗直播中的极致优化
服务器·网络·webrtc