Webrtc音频采集和播放
2018-08-29 本文已影响291人
frank2020
一:音频采集和播放
音频的采集和播放使用模块AudioDeviceModule,定义在modules/audio_device中。
AudioDeviceModule 使用AudioDeviceModule采集和播放音频的例子。
使用AudioDeviceModule需要实现AudioTransport接口,接口主要是获取采集的音频数据和播放音频数据,主要实现如下:
获取和播放音频数据 3_1.JPG注:webrtc提供了CreateAudioDeviceWithDataObserver方法,对上述逻辑的封装,可以更方便的使用AudioDeviceModule。
二: Webrtc对AudioDeviceModule的使用
webrtc使用AudioDeviceModule是通过AudioTransportImpl进行的。
class AudioTransportImpl : public AudioTransport
通过构造函数和RecordedDataIsAvailable的实现,我们可以得知AudioTransportImpl对采集的音频数据进行了混音和预处理操作,然后webrtc::AudioSendStream 进行处理音频数据(这边类型AudioTransportImpl对音频数据进行了分发)。
// AudioMixer混音
// AudioProcessing音频数据预处理
AudioTransportImpl(AudioMixer* mixer,
AudioProcessing* audio_processing);
// RecordedDataIsAvailable中部分实现
if (!sending_streams_.empty()) {
auto it = sending_streams_.begin();
while (++it != sending_streams_.end()) {
std::unique_ptr<AudioFrame> audio_frame_copy(new AudioFrame());
audio_frame_copy->CopyFrom(*audio_frame.get());
// 分发音频数据
(*it)->SendAudioData(std::move(audio_frame_copy));
}
// Send the original frame to the first stream w/o copying.
(*sending_streams_.begin())->SendAudioData(std::move(audio_frame));
}
// 解码 audio/audio_send_stream.cc
void AudioSendStream::SendAudioData(std::unique_ptr<AudioFrame> audio_frame) {
RTC_CHECK_RUNS_SERIALIZED(&audio_capture_race_checker_);
// 编码数据
channel_proxy_->ProcessAndEncodeAudio(std::move(audio_frame));
}