webrtc voice engine 介绍(新版webrtc)

webrtc_voice_engine模块,负责整个音频的生命周期,集成了音频采集、音频处理,传输和编解码等主要的功能。

按照流程主要为:

设备采集音频--->音频处理(增益,降噪,回音等)--->编码--->传输--->解码--->设备播放音频

一, webrtcvoiceengine 包含的核心模块

1.1, webrtc::AudioDeviceModule

主要负责设备的管理,负责系统所有麦克风和扬声器的API调用和处理;

硬件抽象: 封装了各个平台的音频驱动接口,如windows上的core audio、 linux上的ALSA或者pulseaudio等;

数据处理:从麦克风读取PCM语音数据,发生PCM语音数据到麦克风

设备管理:枚举和配置音频的输入/输出设备

状态控制:控制录音,播放的启动、停止、初始化等操作

1.2, AudioCodec

主要负责音频的编解码,该类主要存储音频编解码的核心参数:如编解码的格式("opus", "G722", "PCMU", "ISAC"等),采样率,比特率和音频通道数。 webrc把编解码拆分为2个对面模块处理,主要是为了调用方面和混乱。 如源码定义了一个recv_codecs 和send_codecs。 recv_codecs用于解码,send_codecs用于编码。

1.3,webrtc::AudioEncoderFactory

编码器工厂,一看就是工厂模式,主要负责统筹管理所有编码器的工厂,可以按需生成对应编码器的对象。

1.4,webrtc::AudioDecoderFactory

同编码器工厂,该类为解码器工厂

1.5,webrtc::AudioMixer

混音模块,用于把多路语音混音成一路, 这样可以节省带宽,利于语音的传输。 我当前版本的webtrtc混音模块,主要用于Libjingle, 没有对外。

1.6,webrtc::AudioProcessing

音频处理模块, 这里主要包括3A处理,以及其他相关处理,具体可以参考我的文章webrtc 的audio process介绍(新版本webrtc)-CSDN博客

1.7,webrtc::AudioState

多实例音频管理模块,用于解决资源冲突。 如果可能存在多个webrtc::call会话实例,但音频硬件设备和全局的音频处理算法(如回声消除,混音算法)都是单例或者需要共享滴, AudioState就是为了解决这些资源的冲突共享和状态同步问题而设计。

1.8,WebRtcVoiceMediaChannel

该模块是webrtc 音频子系统的会话控制器。该模块包含有webrtc::Transport网络传输模块,用于充当上层信令逻辑(DSP协商、RTP参数设置)与底层的webrtc::Call(音频流处理、编解码和网络发生)之间的桥梁。

具体可以参考 WebRtcVoiceMediaChannel模块介绍(新版本webrtc)-CSDN博客

附webrtcvoiceengine的成员函数

cpp 复制代码
 // The audio device module.
 rtc::scoped_refptr<webrtc::AudioDeviceModule> adm_;
 rtc::scoped_refptr<webrtc::AudioEncoderFactory> encoder_factory_;
 rtc::scoped_refptr<webrtc::AudioDecoderFactory> decoder_factory_;
 rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer_;
 // The audio processing module.
 rtc::scoped_refptr<webrtc::AudioProcessing> apm_;
 // The primary instance of WebRtc VoiceEngine.
 rtc::scoped_refptr<webrtc::AudioState> audio_state_;
 std::vector<AudioCodec> send_codecs_;
 std::vector<AudioCodec> recv_codecs_;
 std::vector<WebRtcVoiceMediaChannel*> channels_;

二,函数调用

直接WebRtcVoiceEngine对象即可,具体如下

cpp 复制代码
  MediaEngineDependencies media_dependencies;
  media_dependencies.task_queue_factory = dependencies.task_queue_factory.get();
  media_dependencies.adm = std::move(default_adm);
  media_dependencies.audio_encoder_factory = std::move(audio_encoder_factory);
  media_dependencies.audio_decoder_factory = std::move(audio_decoder_factory);
  if (audio_processing) {
    media_dependencies.audio_processing = std::move(audio_processing);
  } else {
    media_dependencies.audio_processing = AudioProcessingBuilder().Create();
  }
  media_dependencies.audio_mixer = std::move(audio_mixer);

auto audio_engine = std::make_unique<WebRtcVoiceEngine>(
    dependencies.task_queue_factory, std::move(dependencies.adm),
    std::move(dependencies.audio_encoder_factory),
    std::move(dependencies.audio_decoder_factory),
    std::move(dependencies.audio_mixer),
    std::move(dependencies.audio_processing));
相关推荐
阿童木写作11 分钟前
跨境电商图片翻译工具,批量翻译视频字幕一键抠图
人工智能·python·音视频
深圳市宝华视联6 小时前
医院内网部署手术示教系统注意事项
嵌入式硬件·实时互动·音视频·实时音视频·视频编解码·嵌入式实时数据库
小柯南敲键盘6 小时前
跨境电商图片翻译工具,批量处理视频字幕与抠图
人工智能·python·音视频
weixin_433417677 小时前
阿里视频大模型wan2.7‑t2v,可以生成视频
人工智能·python·音视频
阿童木写作9 小时前
跨境电商图片翻译工具,批量翻译视频字幕还免费
python·音视频
stuartevil10 小时前
AI图生视频常见坑:参考图风格不一致怎么解决
人工智能·深度学习·音视频
贾宝玉的玉宝贾11 小时前
FreeSWITCH 简单图形化界面 63 - 编写 mod_avsource 模块,将 RTSP/RTMP 源桥接为视频通道
音视频·voip·freeswitch·ippbx·pbx·sip通信
SendTomo11 小时前
send.wang:基于浏览器WebRTC实现无客户端文件互传
网络·python·网络协议·webrtc·p2p
Blockchina12 小时前
5个开源AI视频项目怎么选?从脚本、分镜到Shorts和剪映自动化
人工智能·开源·音视频
要开心吖ZSH12 小时前
腾讯 IM × TRTC 联动实战:后端如何撑起一次视频问诊(混流录制篇)
java·音视频·腾讯云·健康医疗·即时通讯·im