WebRtcVideoChannel 是 WebRTC 媒体引擎中负责管理单个 PeerConnection 视频会话的核心类。
它继承自 VideoMediaChannel(Cricket 层的抽象接口)、webrtc::Transport(网络传输接口)和 webrtc::EncoderSwitchRequestCallback(编码器切换回调)。它是上层信令逻辑(SDP 协商、RTP 参数设置)与底层 WebRTC Call 模块(实际的视频流处理、编码、解码、网络发送)之间的桥梁
cpp
class WebRtcVideoChannel : public VideoMediaChannel,
public webrtc::Transport,
public webrtc::EncoderSwitchRequestCallback
一,核心角色
1.1 主要角色功能
• 一对一映射:每个 PeerConnection 通常对应一个 WebRtcVideoChannel 实例。
• 流管理器:它内部管理着多个发送流(WebRtcVideoSendStream)和接收流(WebRtcVideoReceiveStream)。
• 网络适配器:作为 webrtc::Transport 的实现,它接收来自底层网络栈的 RTP/RTCP 包,并将其分发给对应的接收流;同时也负责将编码后的视频包通过底层网络栈发送出去。
1.2 关键成员
• call_: 指向 webrtc::Call 实例,用于创建底层的 VideoSendStream 和 VideoReceiveStream。
• send_streams_ / receive_streams_: Map 容器,Key 为 SSRC,Value 为对应的流对象指针。
• encoder_factory_ / decoder_factory_: 用于创建具体的编码器和解码器实例。
• unsignaled_stream_params_: 存储动态发现的远程流的参数。
二,主要功能
2.1 编解码器协商与管理
• SetSendParameters / SetRecvParameters:
a, 根据 SDP Offer/Answer 协商的结果,配置本地支持的发送和接收编解码器列表(如 VP8, VP9, H.264, AV1 等)。
b,处理 RTX (重传)、ULPFEC/FlexFEC (前向纠错) 等辅助流的 Payload Type 映射。
• GetSendCodec: 获取当前正在使用的发送编解码器信息。
2.2. 视频流生命周期管理
• 发送流 (Send Streams):
a,AddSendStream: 当本地添加视频轨道(Video Track)时调用,创建 WebRtcVideoSendStream。
b,SetVideoSend: 关联摄像头或屏幕共享源 (VideoSourceInterface) 到特定的 SSRC,并控制是否发送。
c,RemoveSendStream: 移除本地视频轨道时调用,销毁发送流。
• 接收流 (Receive Streams):
a,AddRecvStream: 当远程描述中包含特定的 SSRC 时调用,预先创建接收流。
b, OnPacketReceived: 当收到第一个 RTP 包但尚未建立接收流时(Unsignaled Stream),动态创建接收流。
c,RemoveRecvStream: 移除远程视频轨道时调用。
• SetSink: 将解码后的视频帧渲染到指定的 sink(如 VideoRenderer)。
2.3 . 网络传输 (Transport Interface)
• SendRtp / SendRtcp:
a,这是底层 VideoSendStream 回调的入口。
b,它将视频数据包封装,设置 DSCP(服务质量标记),并通过 VideoMediaChannel::SendPacket 发送给底层的网络传输层。
• OnPacketReceived:
a,这是底层网络层回调的入口。
b, 当网卡收到 RTP/RTCP 包时,调用此方法。它解析包头,根据 SSRC 找到对应的 WebRtcVideoReceiveStream,并将数据送入 jitter buffer 和解码器。
• OnNetworkRouteChanged: 当网络路径改变(如从 WiFi 切换到 4G)时,通知底层流以调整策略(如请求关键帧)。
2.4. 运行时控制与状态
• 发送开关:
a, SetSend(bool): 全局控制是否发送视频数据。
• 带宽与延迟:
a, FillBitrateInfo: 为带宽估计模块提供当前的比特率使用情况。
b, SetBaseMinimumPlayoutDelayMs: 调整最小播放延迟,以平衡实时性和抗抖动能力。
• 统计信息:
GetStats: 收集发送和接收流的统计数据(帧率、码率、丢包、延迟等),用于 getStats() API。
2.5. 高级特性
• 端到端加密 (E2EE):
SetFrameEncryptor / SetFrameDecryptor: 允许在编码后/解码前对视频帧进行自定义加密或解密。
• 编码器切换:
a, SetVideoCodecSwitchingEnabled: 允许在运行时动态切换编解码器(例如从 VP8 切换到 H.264)。
b, RequestEncoderSwitch: 请求底层编码器切换到特定格式。
• 未信号流处理 (Unsignaled SSRC):
处理那些在 SDP 中没有明确声明 SSRC,而是通过第一个 RTP 包动态发现的远程流。
三,工作流程
-
初始化: PeerConnection 创建时,WebRtcVideoEngine::CreateMediaChannel 生成此对象。
-
协商: SDP 交换后,SetSendParameters 和 SetRecvParameters 被调用,确定使用 VP8 还是其他编码,以及 RTX/FEC 的映射关系。
-
发送路径:
• 本地 Video Track 产生帧 -> VideoSource -> WebRtcVideoSendStream -> 编码 -> SendRtp -> 网络。
- 接收路径:
• 网络收到包 -> OnPacketReceived -> WebRtcVideoReceiveStream -> Jitter Buffer -> 解码 -> SetSink (渲染)。