WebRtcVoiceMediaChannel模块介绍(新版本webrtc)

WebRtcVoiceMediaChannel 是 WebRTC 媒体引擎(Media Engine)中负责管理单个 PeerConnection 音频会话的核心类。 与AudioDeviceModule 、AudioCodec 、AudioMixer 和AudioProcessing 等几个核心模块,共同构成webrtc_voice_engine模块

一,核心角色

• 一对一映射:每个 PeerConnection 通常对应一个 WebRtcVoiceMediaChannel 实例。

• 流管理器:它内部管理着多个发送流(WebRtcAudioSendStream)和接收流(WebRtcAudioReceiveStream)。在大多数语音通话中,通常只有一个发送流(本地麦克风)和一个或多个接收流(远程参与者)。

• 网络适配器:作为 webrtc::Transport 的实现,它接收来自底层网络栈的 RTP/RTCP 包,并将其分发给对应的接收流;同时也负责将编码后的音频包通过底层网络栈发送出去。

二,主要功能模块

2.1 编码器协商与管理

• SetSendParameters / SetRecvParameters:

根据 SDP Offer/Answer 协商的结果,配置本地支持的发送和接收编解码器列表(如 OPUS, G711 等)。

初始化解码器映射表 (decoder_map_),以便根据 RTP Payload Type 快速找到对应的解码器。

• send_codecs_ / recv_codecs_: 缓存当前会话协商好的编解码器信息。

2.2 音频流生命周期管理

• 发送流 (Send Streams):

AddSendStream: 当本地添加音频轨道(Audio Track)时调用,创建 WebRtcAudioSendStream。

SetAudioSend: 控制是否真正发送音频数据(静音/取消静音)。

RemoveSendStream: 移除本地音频轨道时调用,销毁发送流。

• 接收流 (Receive Streams):

AddRecvStream: 当远程描述中包含特定的 SSRC 时调用,预先创建接收流。

OnPacketReceived: 当收到第一个 RTP 包但尚未建立接收流时(Unsignaled Stream),动态创建接收流。

RemoveRecvStream: 移除远程音频轨道时调用。

2.3 网络传输 (Transport Interface)

• SendRtp / SendRtcp:

这是底层 AudioSendStream 回调的入口。

它将音频数据包封装,设置 DSCP(服务质量标记),并通过 VoiceMediaChannel::SendPacket 发送给底层的网络传输层(如 P2P Transport Channel)。

• OnPacketReceived:

这是底层网络层回调的入口。

当网卡收到 RTP/RTCP 包时,调用此方法。它解析包头,根据 SSRC 找到对应的 WebRtcAudioReceiveStream,并将数据送入 jitter buffer 和解码器。

2.4 运行时控制与状态

• 播放与录制开关:

SetPlayout(bool): 控制是否将远程音频混合后输出到扬声器。

SetSend(bool): 控制是否从麦克风采集并发送音频。

• 音量控制:

SetOutputVolume(ssrc, volume): 设置特定远程参与者的音量。

SetDefaultOutputVolume: 设置新加入参与者的默认音量。

• DTMF (双音多频):

InsertDtmf: 支持发送电话按键音(RFC 4733)。

2.5 高级特性

• 端到端加密 (E2EE):

SetFrameEncryptor / SetFrameDecryptor: 允许在编码后/解码前对音频帧进行自定义加密或解密,用于实现插入式端到端加密。

• 音频 sink:

SetRawAudioSink: 允许应用层直接获取原始的远程音频数据(例如用于语音识别或可视化波形),绕过默认的扬声器输出。

• 抖动缓冲区控制:

SetBaseMinimumPlayoutDelayMs: 调整最小播放延迟,以平衡实时性和抗抖动能力。

三, 工作流程介绍

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

  2. 协商: SDP 交换后,SetSendParameters 和 SetRecvParameters 被调用,确定使用 OPUS 还是其他编码。

  3. 发送路径:

本地 Audio Track 产生数据 -> AudioSource -> WebRtcAudioSendStream -> 编码 -> SendRtp -> 网络。

  1. 接收路径:

网络收到包 -> OnPacketReceived -> WebRtcAudioReceiveStream -> Jitter Buffer -> 解码 -> AudioMixer -> AudioDeviceModule -> 扬声器。

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