WebRtcVideoChannel (新版webrtc)

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 包动态发现的远程流。

三,工作流程

  1. 初始化: PeerConnection 创建时,WebRtcVideoEngine::CreateMediaChannel 生成此对象。

  2. 协商: SDP 交换后,SetSendParameters 和 SetRecvParameters 被调用,确定使用 VP8 还是其他编码,以及 RTX/FEC 的映射关系。

  3. 发送路径:

• 本地 Video Track 产生帧 -> VideoSource -> WebRtcVideoSendStream -> 编码 -> SendRtp -> 网络。

  1. 接收路径:

• 网络收到包 -> OnPacketReceived -> WebRtcVideoReceiveStream -> Jitter Buffer -> 解码 -> SetSink (渲染)。

相关推荐
OpenLoong 开源社区2 小时前
打破 NAT 限制,零侵入跨网络通信:基于 WebRTC 的透明 TCP 隧道跨网络通信方案
网络协议·tcp/ip·开源·webrtc·openloong开源社区
探鸽小钛3 天前
4G 终端 ES8311 - 挂断一次,下次说话就没声了之解决办法
物联网·音视频·嵌入式·esp32·webrtc
草根大哥4 天前
AI 编程实践之自建视频CDN
音视频·webrtc·低延迟直播·视频cdn·低延迟cdn
EasyCVR4 天前
应急指挥怕延迟?聊聊视频汇聚/视频融合/视频分析EasyCVR平台WebRTC低延迟方案
音视频·webrtc·easycvr
TrueDei5 天前
WebRTC ICE 候选变成 mDNS 地址导致连接失败:原因分析与解决方案
webrtc
中屹指纹浏览器svip8 天前
WebRTC泄露是什么,怎么关闭?
webrtc
海边捡石子9 天前
从零设计一个通用智能电话平台:FreeSWITCH + ESL + AI 实战架构
人工智能·架构·webrtc
音视频牛哥9 天前
不换摄像机,也能接入 WebRTC?SmartMediaKit RTSP/RTMP 转 WHIP 技术实践
音视频·webrtc·smartmediakit·rtsp转whip·rtmp转whip·whip推流·rtsp转webrtc播放
直播技术开发交流11 天前
Android 端 WHIP 协议推流技术实践:相机/录屏/多路转发WHIP实现测试
webrtc·android whip·rtsp转whip·毫秒级实时媒体流·whip低延时推送·whip推送实现·rtsp转webrtc
程序员阿明13 天前
docker搭建视频流服务go2rtc,webRTC
docker·容器·webrtc