媒体引擎 · WebRtcVoiceEngine 与 WebRtcVideoEngine
媒体引擎是「协商出的媒体配置」和「实际编解码 + Call 流」之间的胶水层。这一章读 media/engine 的 WebRtcVoiceEngine/WebRtcVideoEngine:它们怎么创建媒体通道、把编解码器工厂接进来,以及在架构里承上启下的位置。
媒体引擎 · WebRtcVoiceEngine 与 WebRtcVideoEngine
Call 管媒体流,编解码器有统一抽象,但中间需要一个胶水层——把“SDP 协商出的媒体配置”翻译成“用哪些编解码器、建哪些 Call 流”。这就是媒体引擎(media/engine/):音频的 WebRtcVoiceEngine、视频的 WebRtcVideoEngine。
两个引擎
媒体引擎按音视频分两个(media/engine/):
// media/engine/webrtc_voice_engine.h(节选)
class WebRtcVoiceEngine final : public VoiceEngineInterface {
std::unique_ptr<VoiceMediaSendChannelInterface> CreateSendChannel(...);
std::unique_ptr<VoiceMediaReceiveChannelInterface> CreateReceiveChannel(...);
};
// media/engine/webrtc_video_engine.h:WebRtcVideoEngine 对称媒体引擎是“媒体能力的提供者 + 媒体通道的工厂”——它知道支持哪些编解码器(持有编解码器工厂),并据协商结果创建媒体通道**(CreateSendChannel/CreateReceiveChannel),把编解码器和 Call 的流接起来。**
WebRtcVoiceEngine—— 音频引擎。持有音频编解码器工厂(Opus 等)、ADM、APM、音频混音器。它CreateSendChannel建的音频发送通道,内部会用AudioSendStream干活。WebRtcVideoEngine—— 视频引擎。持有视频编解码器工厂(VP8/VP9/AV1/H264 的编解码器实现)。它建的视频通道内部用VideoSendStream/VideoReceiveStream2。
媒体引擎是“SDP 协商”和“Call 流”之间的翻译官:协商说“用 Opus、双向”,媒体引擎就据此建一个配好 Opus 的音频通道,通道再让 Call 建对应的流。它把抽象的媒体配置落地成具体的编解码 + 收发管线。
承上启下的位置
媒体引擎在架构里承上启下:
- 上承 SDP 协商——协商出的编解码器、方向、参数,通过媒体通道传给引擎。
- 下启 Call 流 + 编解码器——引擎据配置建通道、通道让
Call建流、流用引擎提供的编解码器编解码。
它是“控制面的协商结果”最终变成“媒体面的实际管线”的转换点——协商说的话,在这里变成真正跑起来的编解码。
引擎的初始化
媒体引擎在 PeerConnectionFactory 初始化时创建,是 ConnectionContext 里的 media_engine_ 成员(第 1 部分见过)。创建时,把工厂依赖里的编解码器工厂、ADM 等注入进来。所以你想换编解码器 / 音频设备,就是通过工厂依赖影响媒体引擎——这呼应了第 1 部分的依赖注入:媒体引擎是那些可替换部件(编解码器、ADM、APM)的汇聚地。
小结与下一章
媒体引擎(WebRtcVoiceEngine/WebRtcVideoEngine,media/engine/)是“SDP 协商配置”和“Call 流 + 编解码”之间的翻译胶水:持有编解码器工厂(及 ADM/APM/混音器),据协商 CreateSendChannel/CreateReceiveChannel 建媒体通道,通道驱动 Call 建流。它承上(协商)启下(管线),是控制面到媒体面的转换点,也是可替换部件的汇聚地。
媒体引擎建的“媒体通道”,和 SDP 协商对接的那层,是 channel。下一章看它。👉 媒体通道。