媒体引擎 · WebRtcVoiceEngine 与 WebRtcVideoEngine

媒体引擎是「协商出的媒体配置」和「实际编解码 + Call 流」之间的胶水层。这一章读 media/engine 的 WebRtcVoiceEngine/WebRtcVideoEngine:它们怎么创建媒体通道、把编解码器工厂接进来,以及在架构里承上启下的位置。

作者 David更新于 第 89 篇(共 112 篇)

媒体引擎 · 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 的流接起来。**

媒体引擎是“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。下一章看它。👉 媒体通道。

参考资料

  • [1] libwebrtc 源码.media/engine/webrtc_voice_engine.h、webrtc_video_engine.h(CreateSendChannel 等)。
  • [2] 关联Call、编解码器抽象、工厂依赖注入。
  • [3] libwebrtc 源码.media/base/media_engine.h(MediaEngineInterface)。

本页目录