WebRtcVideoEngine模块介绍(新版webrtc)

WebRtcVideoEngine 是 WebRTC 媒体引擎(Media Engine)中负责视频子系统初始化和全局管理的核心类。

它继承自 VideoEngineInterface,主要充当了上层应用(通过 PeerConnection 和 MediaEngine)与底层 WebRTC Call 模块之间的桥梁。它的职责比音频引擎更轻量,因为视频流的复杂性更多地被下放到了 WebRtcVideoChannel 中处理。

WebRTC 视频功能的全局配置和管理者。它不直接处理视频帧或网络包,而是负责:

  1. 定义能力:告诉系统"我能编码/解码什么格式"。

  2. 创建上下文:为每个通话(PeerConnection)创建独立的视频处理通道 (WebRtcVideoChannel)。

  3. 管理依赖:持有并管理编解码器工厂的生命周期。

一,核心职责

• 工厂模式入口:它是创建视频媒体通道(WebRtcVideoChannel)的工厂。每个 PeerConnection 都会通过它创建一个独立的视频通道实例。

• 编解码器管理:持有视频编码器工厂 (VideoEncoderFactory) 和解码器工厂 (VideoDecoderFactory)。这些工厂决定了当前环境支持哪些视频编码格式(如 VP8, VP9, H.264, AV1 等),无论是软件编码还是硬件加速编码。

• 能力协商支持:提供当前引擎支持的发送和接收编解码器列表,用于 SDP Offer/Answer 协商。

二, 构造函数与成员变量

2.1 构造函数依赖注入

cpp 复制代码
WebRtcVideoEngine(
    std::unique_ptr<webrtc::VideoEncoderFactory> video_encoder_factory,
    std::unique_ptr<webrtc::VideoDecoderFactory> video_decoder_factory);

• video_encoder_factory: 负责创建视频编码器实例。WebRTC 允许注入自定义工厂以支持特定的硬件编码器或第三方软件编码器。

• video_decoder_factory: 负责创建视频解码器实例。同样支持硬件加速解码器的注入。

• 所有权:WebRtcVideoEngine 拥有这两个工厂的所有权(std::unique_ptr),并在生命周期结束时销毁它们。

2.2 成员变量

cpp 复制代码
const std::unique_ptr<webrtc::VideoDecoderFactory> decoder_factory_;
const std::unique_ptr<webrtc::VideoEncoderFactory> encoder_factory_;
const std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
    bitrate_allocator_factory_;

• encoder_factory_ / decoder_factory_:

存储传入的编解码器工厂。当创建 WebRtcVideoChannel 时,这些工厂会被传递给通道,以便通道在需要时创建具体的编码器或解码器对象。

• bitrate_allocator_factory_:

虽然构造函数签名中未直接显示初始化列表,但类定义中包含此成员。它用于创建比特率分配器,决定如何在多个视频流(如 simulcast 多层流)之间分配可用的网络带宽。

三、主要接口方法

3.1 CreateMediaChannel(...):

• 最重要的方法。当 PeerConnection 需要建立视频连接时调用。

• 它会实例化一个 WebRtcVideoChannel 对象,并将 Call 实例、配置、选项、加密选项以及编解码器工厂传递给它。

• 返回的 VideoMediaChannel* 指针将被上层用于控制视频流的发送和接收。

3.2 send_codecs() / recv_codecs():

• 查询当前引擎支持的编解码器列表。

• 内部会遍历 encoder_factory_ 和 decoder_factory_ 获取所有可用的编码格式及其参数(如 profile, level 等),并将其转换为 cricket::VideoCodec 结构体列表,供 SDP 生成使用。

3.3 GetRtpHeaderExtensions():

• 返回支持 RTP 头部扩展列表(如绝对发送时间、视频旋转、色彩空间信息等)。

四,与 WebRtcVideoChannel 配合使用

• 一对多关系:一个 WebRtcVideoEngine 实例可以被多个 PeerConnection 共享(尽管在现代 Chromium/WebRTC 架构中,通常每个 PeerConnectionFactory 会有一个引擎实例,或者引擎是单例的),但每个 PeerConnection 会拥有一个独立的 WebRtcVideoChannel。

• 资源分享:WebRtcVideoEngine 持有的编解码器工厂是共享资源。WebRtcVideoChannel 并不复制这些工厂,而是引用它们来创建具体的编解码器实例。

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