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));
}

上一篇下一篇

猜你喜欢

热点阅读