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 (渲染)。

相关推荐
草根大哥6 分钟前
08-横向扩容与突发高并发:加机器到底买到了什么
运维·webrtc·srt·横向扩容·whip·自建cdn
草根大哥3 小时前
07-P2P 直连与节点池调度
webrtc·p2p·srt·whip·whep·自建cdn
草根大哥3 小时前
06-可观测性:端到端延迟、稳定性与画质
webrtc·srt·whip·自建cdn·ppcdn
大文说跨境3 小时前
用 Python 自动化检测浏览器环境指纹:WebRTC 泄露、Canvas 哈希与时区一致性校验
python·自动化·webrtc
EasyDSS1 天前
基于WebRTC的视频会议系统:私有化视频会议平台EasyDSS视频会议到底能干什么
音视频·webrtc·easydss
福大大架构师每日一题4 天前
RustDesk 1.5.0发布:WebRTC、HDR 色调映射、剪贴板同步与百余项修复全面汇总
webrtc
福大大架构师每日一题9 天前
webrtc-rs/webrtc v0.21.0发布:API 可扩展、异步集成、确定性时间、ICE 重启与 SCTP 全面修复
webrtc
智联视频超融合平台10 天前
WebRTC + AI:实时音视频中嵌入神经网络推理的架构设计
人工智能·webrtc·实时音视频
P1Browser10 天前
换了 IP 还是被关联:WebRTC 泄露本地 IP 的三种触发路径
网络协议·tcp/ip·webrtc
福大大架构师每日一题11 天前
pion/webrtc v4.2.22 最新发布:TCP mux 写缓冲区调整至 4 MB,补齐缺失媒体方向处理
tcp/ip·webrtc·媒体