美文网首页
Webrtc音频采集和播放

Webrtc音频采集和播放

作者: frank2020 | 来源:发表于2018-08-29 10:48 被阅读291次

    一:音频采集和播放

    音频的采集和播放使用模块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));
    }
    
    

    相关文章

      网友评论

          本文标题:Webrtc音频采集和播放

          本文链接:https://www.haomeiwen.com/subject/ktshwftx.html