WebRtc VoiceEngine代码解析

2024-06-01 09:32

本文主要是介绍WebRtc VoiceEngine代码解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

WebRtc中VoiceEngine可以完成大部分的VOIP相关人物,包括采集、自动增益、噪声消除、回声抑制、编解码、RTP传输。下边我们通过代码来解析Voe中处理流程;

创建VoiceEngine和VoEBase

VoiceEngine* _vePtr = VoiceEngine::Create();                    //创建VoiceEngine
VoEBase* _veBasePtr = VoEBase::GetInterface(_vePtr);            //创建VoeBase  所有Voe相关操作通过这个共有类
_veBasePtr->Init()                                              //创建整个Voe处理线程
重点就在_veBasePtr->Init()  它会创建voe线程,线程负责采集、数字信号处理、编码、rtp传输。

int VoEBaseImpl::Init(AudioDeviceModule* external_adm,AudioProcessing* audioproc)
{_shared->process_thread();   //创建voe线程_shared->process_thread()->Start();_shared->audio_device()->Init();}
audio_device()->Init()重载了int32_t AudioDeviceWindowsWave::Init()(windowns平台),别的平台是别的函数,基本差不多,在这个Init中,创建了ThreadProcess线程,ThreadProcess线程负责所有的音频流程,从设备获取音频数据包。

bool AudioDeviceWindowsWave::ThreadProcess()
{while ((nRecordedBytes = RecProc(recTime)) > 0);
}
处理过程在RecProc

int32_t AudioDeviceWindowsWave::RecProc(LONGLONG& consumedTime)
{_ptrAudioBuffer->DeliverRecordedData(); }

int32_t AudioDeviceBuffer::DeliverRecordedData()
{_ptrCbAudioTransport->RecordedDataIsAvailable();
}


RecordedDataIsAvailable是虚函数,被VoeBase重载

int32_t VoEBaseImpl::RecordedDataIsAvailable(const void* audioSamples,uint32_t nSamples,uint8_t nBytesPerSample,uint8_t nChannels,uint32_t samplesPerSec,uint32_t totalDelayMS,int32_t clockDrift,uint32_t currentMicLevel,bool keyPressed,uint32_t& newMicLevel)
{_shared->transmit_mixer()->DemuxAndMix();_shared->transmit_mixer()->EncodeAndSend();
}

DemuxAndMix() 从字面意思是分路与混合,这个函数,主要负责AudioProcess的所有过程,包括Aec,Aecm,AGC,DTMF,遍历所有channel;

TransmitMixer::DemuxAndMix()
{Channel* channelPtr = sc.GetFirstChannel(iterator);while (channelPtr != NULL){if (channelPtr->InputIsOnHold()){channelPtr->UpdateLocalTimeStamp();} else if (channelPtr->Sending()){// Demultiplex makes a copy of its input.channelPtr->Demultiplex(_audioFrame);channelPtr->PrepareEncodeAndSend(_audioFrame.sample_rate_hz_);}channelPtr = sc.GetNextChannel(iterator);}}

Channel::Demutiplex(),基本上没有什么具体任务,就是把audioFrame里边的数据 拷贝到channel自身, webrtc是client解决方案,对于client只认为有一个audio source,但可以有多个channel,每个channel中都有audio process,所以需要把数据copy到每个channel.

只有就是数据处理 PrepareEncodeAndSend()

Channel::PrepareEncodeAndSend(int mixingFrequency)
{if (_inputFilePlaying){MixOrReplaceAudioWithFile(mixingFrequency); //如果使用了voeFile::PlayFileAsMic();则从文件读取10ms数据,并覆盖audio buffer}if (_mute){AudioFrameOperations::Mute(_audioFrame);//当然如果设置mutex,则memset 0 }if (_inputExternalMedia){_inputExternalMediaCallbackPtr->Process();  //所过设置了ExternalMedia,自己的audio处理过程,就是在这里调用的}InsertInbandDtmfTone();                     //添加DTMF音频_rtpAudioProc->ProcessStream(&_audioFrame);  // 真正的GIPS牛逼代码,audio process过程: Aec Aecm AGC 
}

int AudioProcessingImpl::ProcessStream(AudioFrame* frame) 就是上述调用的_rtpAudioProc->ProcessStream();

以上是DemuxAndMix()过程,之后就是EncodeAndSend()过程,至此整个voe数据处理流程分析结束;

关于Audio Process则是另外一个大话题;


总结一下几点: 

1.  VoeBase提供大部分的对外接口

2. Channel:继承了大部分的音频功能;


这篇关于WebRtc VoiceEngine代码解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020628

相关文章

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

CSS place-items: center解析与用法详解

《CSSplace-items:center解析与用法详解》place-items:center;是一个强大的CSS简写属性,用于同时控制网格(Grid)和弹性盒(Flexbox)... place-items: center; 是一个强大的 css 简写属性,用于同时控制 网格(Grid) 和 弹性盒(F

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.