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

相关推荐
Fisher3Star1 天前
带宽分配策略解析:保音频弃视频
webrtc
换个昵称都难1 天前
webrtc 的audio process介绍(新版本webrtc)
音视频·webrtc
Fisher3Star3 天前
mediasoup WebRtcTransport核心机制解析
webrtc
小小前端--可笑可笑3 天前
【Web 流媒体三部曲之一】直播、点播与 WebRTC 是什么?
前端·webrtc
hz567893 天前
实时音视频SDK选型指南:TRTC、WebRTC与音视频PaaS能力对比
安全·音视频·webrtc·实时音视频·信息与通信·paas
Fisher3Star4 天前
WebRTC回声消除定位方法
webrtc
Fisher3Star4 天前
WebRTC音频模块替换方案
webrtc
Fisher3Star4 天前
WebRTC Android音频播放三方案解析
webrtc
Fisher3Star5 天前
mediasoup如何基于RTCP更新媒体流score
webrtc