WebRTC 对音频设备部分封装比较简单,结构非常清晰,容易理解。
- AudioDeviceModule 实现了 WebRTC 的模块规范。实现类 AudioDeviceModuleImpl 是各个平台的通用实现。
- AudioDeviceGeneric 是音频设备的一个抽象接口类,提供了一组虚函数,对音频设备的录制和播放做了一层抽象。
- AudioDeviceWindowsCore 是 Windows 系统 Audio Core 的封装。Windows 系统相关 API 调用都封装在此类中,主要是音频采集和播放相关 API 的调用。
- AudioDeviceBuffer 用于保存采集到的音频数据。AudioDeviceBuffer 的实例是由 AudioDeviceModuleImpl 持有,AudioDeviceWindowsCore 只是引用了一个指针。
- AudioTransport 是 Audio Device 模块对外提供数据输出、输入的接口。
- AudioDeviceModule 暴露了 RegisterAudioCallback 函数,用于向AudioDeviceBuffer 注册接收音频数据的实例。
- ADMWrapper 是对 AudioDeviceModule 的一个包装,是为了使用的方便,对外通过 AudioDeviceDataObserver 来实现数据的输入、输出。
- AudioDeviceDataObserver 类似 AudioTransport 的作用。
音频设备既有录音设备也有播放设备。比如,麦克风、耳机、音响等。音频采集也叫录音过程,或者是音频数据捕获(capture)过程。音频播放,有时也叫音频数据渲染(render)过程。采集与播放是两个相反的过程,所以编程实现逻辑也略有差异,我们分两部分来分析。
音频数据采集过程
音频数据的采集过程,是从音频设备(比如麦克风)采集声音,然后将数字化的音频数据发送给应用程序。
- AudioDeviceModule 提供了一个工厂方法用于创建 AudioDeviceModule 实例。
- 调用 AudioDeviceModule::Init 方法初始化 AudioDevice,主要是根据不同平台的类型,创建相应平台的 AudioDevice。比如,在windows 上是创建 AudioDeviceWindowsCore。
- 调用 AudioDeviceModule::RegisterAudioCallback 注册一个接收或者发送音频数据的类的实例,此类需要实现 AudioTransport 接口。
- 调用 AudioDeviceModule::SetRecordingDevice 方法设置录音设备,参数是录音设备的索引。在 Windows 上可以传入参数。 webrtc::AudioDeviceModule::WindowsDeviceType::kDefaultCommunicationDevice。
- 调用 AudioDeviceModule::InitRecording 方法初始化录音逻辑。
- 通过 AudioDeviceModule::StartRecording 启动录音。
- 通过调用 AudioDeviceModule::StopRecording 方法停止录音。
- 如果停止音频设备,需要调用 AudioDeviceModule::Terminate 来释放资源。
通过以上 1-6 步骤就可以采集到音频的 PCM 数据。
音频数据回放过程
音频数据的回放过程是从应用程序获取数字语音数据,然后送给喇叭或者是耳机播放出来。
- AudioDeviceModule 提供了一个工厂方法用于创建 AudioDeviceModule 实例。
- 调用 AudioDeviceModule::Init 方法初始化 AudioDevice,主要是根据不同平台的类型,创建相应平台的 AudioDevice。比如,在windows 上是创建 AudioDeviceWindowsCore。
- 调用 AudioDeviceModule::RegisterAudioCallback 注册一个接收或者发送音频数据的类的实例,此类需要实现 AudioTransport 接口。
- 调用 AudioDeviceModule::SetPlayoutDevice 方法设置播放设备,参数是播放设备的索引。在 Windows 上可以传入参数。 webrtc::AudioDeviceModule::WindowsDeviceType::kDefaultCommunicationDevice。
- 调用 AudioDeviceModule::InitPlayout 方法初始化声音播放逻辑。
- 通过 AudioDeviceModule::StartPlayout 方法启动播放。
- 通过调用 AudioDeviceModule::StopPlayout 方法停止播放。
- 如果停止音频设备,需要调用 AudioDeviceModule::Terminate 来释放资源。