webrtc自带client的音频引擎创建代码走读
src\webrtc\examples\peerconnection\client\conductor.cc
1、bool Conductor::InitializePeerConnection()
1.1 webrtc::CreatePeerConnectionFactory();
src\talk\app\webrtc\peerconnectionfactory.cc
2、 bool PeerConnectionFactory::Initialize()
2.1.1 cricket::MediaEngineInterface* PeerConnectionFactory::CreateMediaEngine_w() {
return cricket::WebRtcMediaEngineFactory::Create(default_adm_.get(), video_encoder_factory_.get(),video_decoder_factory_.get());
}
src\talk\media\webrtc\webrtcmediaengine.cc
2.1.2
MediaEngineInterface* WebRtcMediaEngineFactory::Create(
webrtc::AudioDeviceModule* adm,WebRtcVideoEncoderFactory* encoder_factory,WebRtcVideoDecoderFactory* decoder_factory)
{
return CreateWebRtcMediaEngine(adm, encoder_factory, decoder_factory);
}
2.1.3
cricket::MediaEngineInterface* WebRtcMediaEngineFactory::CreateWebRtcMediaEngine(
webrtc::AudioDeviceModule* adm,WebRtcVideoEncoderFactory* encoder_factory,WebRtcVideoDecoderFactory* decoder_factory)
{
return new cricket::WebRtcMediaEngine2(adm, encoder_factory,
decoder_factory);
}
2.1.4
class WebRtcMediaEngine2
: public CompositeMediaEngine<WebRtcVoiceEngine, WebRtcVideoEngine2>
{
public:
WebRtcMediaEngine2(webrtc::AudioDeviceModule* adm,WebRtcVideoEncoderFactory* encoder_factory,WebRtcVideoDecoderFactory* decoder_factory)
};
2.1.5
\src\talk\media\webrtc\webrtcvoiceengine.cc
WebRtcVoiceEngine::WebRtcVoiceEngine()
: voe_wrapper_(new VoEWrapper())
{
Construct();
}
2.1.6
src\talk\media\webrtc\webrtcvoe.h
class VoEWrapper {
public:
VoEWrapper()
: engine_(webrtc::VoiceEngine::Create())
, processing_(engine_),
base_(engine_), codec_(engine_)
, dtmf_(engine_),
hw_(engine_), network_(engine_)
, rtp_(engine_), volume_(engine_){}
};
2.1.7
src\webrtc\voice_engine\voice_engine_impl.cc
VoiceEngine* VoiceEngine::Create()
{
return GetVoiceEngine(config, true);
}
VoiceEngine* GetVoiceEngine(const Config* config, bool owns_config)
{
VoiceEngineImpl* self = new VoiceEngineImpl(config, owns_config);
}
2.1.9
src\webrtc\voice_engine\voice_engine_impl.h
class VoiceEngineImpl : public voe::SharedData, public VoiceEngine, public VoEBaseImpl ,public VoEHardwareImpl
{public:
VoiceEngineImpl(const Config* config, bool owns_config)
:SharedData(*config),
VoEBaseImpl(this),
VoEHardwareImpl(this),
{}
};
2.1.10
void WebRtcVoiceEngine::Construct()
{
// Load our audio codec list.
内部调用voe_wrapper_->codec()->NumOfCodecs()
ConstructCodecs();
//获取是否需要回音消除,降噪,自动调节音量等
options_ = GetDefaultEngineOptions();
}
src\talk\session\media\channelmanager.cc
2.2
bool ChannelManager::Init()
{
initialized_ = worker_thread_->Invoke<bool>(Bind(
&ChannelManager::InitMediaEngine_w, this));
}
2.2.1
bool ChannelManager::InitMediaEngine_w()
{
return (media_engine_->Init(worker_thread_));
}
2.2.2
template<class VOICE, class VIDEO>
class CompositeMediaEngine : public MediaEngineInterface
{
public:
virtual bool Init(rtc::Thread* worker_thread)
{
if (!voice_.Init(worker_thread))
return false;
video_.Init();
return true;
}
protected:
VOICE voice_; //默认的WebRtcVoiceEngine或自定义的音频引擎
}
2.2.3
bool WebRtcVoiceEngine::Init(rtc::Thread* worker_thread)
{
bool res = InitInternal();
}
2.2.4
bool WebRtcVoiceEngine::InitInternal()
{
if (voe_wrapper_->base()->Init(adm_) == -1) // VoiceEngineImpl 的init
}
2.2.5
VoiceEngineImpl(const Config* config, bool owns_config)
:SharedData(*config)
, VoEHardwareImpl(this)
,VoEBaseImpl(this)
src\webrtc\voice_engine\voe_base_impl.cc
VoEBaseImpl::VoEBaseImpl(voe::SharedData* shared)
:shared_(shared)
int VoEBaseImpl::Init(AudioDeviceModule* external_adm,AudioProcessing* audioproc)
{
if (external_adm == nullptr)
{
// Create the internal ADM implementation. //shared_指向VoiceEngineImpl
shared_->set_audio_device(AudioDeviceModuleImpl::Create(
VoEId(shared_->instance_id(), -1), shared_->audio_device_layer())); // create函数中调用CreatePlatformSpecificObjects
}
else
{
// Use the already existing external ADM implementation.
shared_->set_audio_device(external_adm);
}
SharedData::SharedData(const Config& config)
: _channelManager(_gInstanceCounter, config)
,_audioDevicePtr(NULL)
{
_audioDeviceLayer = AudioDeviceModule::kPlatformDefaultAudio;
}
SharedData::set_audio_device(AudioDeviceModule* audio_device){ _audioDevicePtr = audio_device;}
AudioDeviceModule* SharedData::audio_device() { return _audioDevicePtr; }
// Register the AudioObserver implementation
if (shared_->audio_device()->RegisterEventObserver(this) != 0)
// Register the AudioTransport implementation
if (shared_->audio_device()->RegisterAudioCallback(this) != 0)
// ADM initialization
if (shared_->audio_device()->Init() != 0) // AudioDeviceModuleImpl::Init(),调用_ptrAudioDevice->Init()开启了一些音频处理线程,这些线程负责来采集音频,
// 如AudioDeviceWindowsWave::Init()中调用 _ptrThread = ThreadWrapper::CreateThread(ThreadFunc, this, threadName);
//->AudioDeviceWindowsWave::ThreadFunc
//->AudioDeviceWindowsWave::ThreadProcess()
//->AudioDeviceWindowsWave::RecProc(LONGLONG& consumedTime)
//->_ptrAudioBuffer->DeliverRecordedData();
int32_t AudioDeviceModuleImpl::CreatePlatformSpecificObjects()
{
AudioDeviceGeneric* ptrAudioDevice(NULL);
AudioLayer audioLayer(PlatformAudioLayer()); // AudioDeviceModule::kPlatformDefaultAudio;
ptrAudioDevice = new AudioDeviceWindowsWave(Id());
或
ptrAudioDevice = new AudioDeviceWindowsCore(Id());
_ptrAudioDevice = ptrAudioDevice;
}
// Initialize the default speaker
if (shared_->audio_device()->SetPlayoutDevice(WEBRTC_VOICE_ENGINE_DEFAULT_DEVICE) != 0)
if (shared_->audio_device()->InitSpeaker() != 0)
// Initialize the default microphone
if (shared_->audio_device()->SetRecordingDevice(WEBRTC_VOICE_ENGINE_DEFAULT_DEVICE) != 0)
int32_t AudioDeviceModuleImpl::SetRecordingDevice(WindowsDeviceType device)
{
return (_ptrAudioDevice->SetRecordingDevice(device));
}
if (shared_->audio_device()->InitMicrophone() != 0)
// Set number of channels
if (shared_->audio_device()->StereoPlayoutIsAvailable(&available) != 0)
if (shared_->audio_device()->SetStereoPlayout(available) != 0)
if (!audioproc) {
audioproc = AudioProcessing::Create();
}
shared_->set_audio_processing(audioproc);
}
VoEBaseImpl::StartSend()
{
if (shared_->audio_device()->StartRecording() != 0)
}
int32_t AudioDeviceModuleImpl::StartRecording()
{
return (_ptrAudioDevice->StartRecording()); // AudioDeviceWindowsWave或AudioDeviceWindowsCore启动录音
}
webrtc自带client的音频引擎创建代码走读的更多相关文章
- webrtc自带client的视频引擎创建代码走读
src\webrtc\examples\peerconnection\client\conductor.ccbool Conductor::InitializePeerConnection()1 we ...
- WebRTC源码分析:音频模块结构分析
一.概要介绍WebRTC的音频处理流程,见下图: webRTC将音频会话抽象为一个通道Channel,譬如A与B进行音频通话,则A需要建立一个Channel与B进行音频数据传输.上图中有三个Chann ...
- 使用“Cocos引擎”创建的cpp工程如何在VS中调试Cocos2d-x源码
前段时间Cocos2d-x更新了一个Cocos引擎,这是一个集合源码,IDE,Studio这一家老小的整合包,我们可以使用这个Cocos引擎来创建我们的项目. 在Cocos2d-x被整合到Cocos引 ...
- 基于cocos2d-x的Android游戏中使用fmod音频引擎
cocos2d-x的音频引擎是cocosDenshion, 它的Android版比较弱, 只能播放一个背景音乐和些许音效, 如果要实现稍微复杂一点的音频播放, 比如同时播放几个音轨就不能了. 这一点远 ...
- 【Cocos2d入门教程八】浅析Cocoss2d下的音频引擎及封装音频类
Cocos2d-x提供了一个音频CocosDenshion引擎,CocosDenshion引擎可以独立于Cocos2d-x单独使用,CocosDenshion引擎本质上封装了OpenAL音频处理库.具 ...
- 带你走近AngularJS 之创建自定义指令
带你走近AngularJS 之创建自定义指令 为什么使用AngularJS 指令? 使用过 AngularJS 的朋友应该最感兴趣的是它的指令.现今市场上的前端框架也只有AngularJS 拥有自定义 ...
- 使用Three.js网页引擎创建酷炫的3D效果的标签墙
使用Three.js引擎(这是开源的webgl三维引擎,gitgub)进行一个简单应用. 做一个酷炫的3d效果的标签墙(已经放在我的博客首页,大屏幕可见), 去我的博客首页看看实际效果 www.son ...
- WebRTC代码走读(八):代码目录结构
转载注明出处http://blog.csdn.net/wanghorse ├── ./base //基础平台库,包括线程.锁.socket等 ├── ./build //编译脚本,gyp ├── ./ ...
- java版微信公众平台自定义菜单创建代码实现
微信公众平台自定义菜单创建代码实现—java版 搞了两天的自定义菜单,终于搞定了,现在分享下心得,以便后来者少走弯路...... 好了,先看先微信官方的API 官方写的很详细,但是我看完后很茫然,不知 ...
随机推荐
- MATLAB常用指令记录
help + 'command name' % 查询指令用法 Ctrl + Break % 强制终止程序运行 Shift + Enter % command window下换行不运行指令 M'; % ...
- 《机器学习基石》第一周 —— When Can Machine Learn?
(注:由于之前进行了吴恩达机器学习课程的学习,其中有部分内容与机器学习基石的内容重叠,所以以下该系列的笔记只记录新的知识) <机器学习基石>课程围绕着下面这四个问题而展开: 主要内容: 一 ...
- TortoiseSVN教程级别指南
安装说明 开发人员强烈建议使用IDE中的SVN插件更加智能与人性化. 首先安装SVN客户端,windows一般选择乌龟客户端https://tortoisesvn.net/downloads.html ...
- SQL题
1.取出sql表中第31到40的记录(以自动增长ID为主键) sql server方案: select top 10 * from t where id not in (select top 30 i ...
- Java properties配置文件工具类
/* * Copyright (c) 2017. Panteng.Co.Ltd All rights reserved */ import org.apache.log4j.Logger; impor ...
- 权限【TLCL】
用户帐户 定义在/etc/passwd 文件里面,用户组定义在/etc/group 文件里面. /etc/shadow 包含了关于用户密码的信息 文件属性: 属性 文件类型 - 一个普通文件 d 一个 ...
- JAVA 中的集合框架
java集合框架提供了一套性能优良.使用方便的接口和类,它们位于java.util包中 一.集合与数组 数组:(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知 ...
- review35
使用Thread创建线程通常使用的方法是:Thread(Runnable target).该构造方法中的参数是一个Runnable类型的接口,因此在创建线程对象时必须向构造方法的参数传递一个实现Run ...
- WPF中如何在文本外面加虚线外框
WPF中如何在文本外面加虚线外框 昨天突然被问到如何在wpf里面给一段文本加个虚线外框,由于有一段时间没玩wpf了,一时还真没想出来,虽然大概有个思路,但是也不保证正确.今天回到家,闲着没事情也就随便 ...
- github-如何设置SSH Key
设置SSH Key 在注册好github账号后,打开你的电脑桌面上的一个文件夹,这就建立了一个本地工作库,在里面点击鼠标右键,找到你的git bash here-点击开,如图所示:进行下面操作: 输入 ...