webrtcパッケージsdk(六)ローカルpcm音声データとリモートミキシング後のpcmデータを取得

3484 ワード

録音を行うには,まずローカルで採取したpcmデータとすべてのリモートユーザが合成したpcmデータ,すなわち再生時にスピーカに渡されたpcmデータを取得する必要があり,webrtcの元のオーディオデータを取得する方法について説明する.
Webrtcバージョンの説明
本明細書で使用するwebrtc apiは、branch 57および以前のバージョンでwebrtcブランチバージョン<=branch 57に依存してテストに合格するはずです.branch>=58でVoEExternalMediaが削除される場合があります.
使用するインタフェース
使用するインタフェースはwebrtc::VoEExternalMediaクラスが存在するファイルは:webrtc/voice_engine/include/voe_external_Media.hはまず、データコールバックで使用されるcallbackクラスを実現する必要があります.
class AudioMixDataCallBack :public webrtc::VoEMediaProcess
{
public:
    virtual void Process(int channel,
                         webrtc::ProcessingTypes type,
                         int16_t audio10ms[],
                         size_t length,
                         int samplingFreq,
                         bool isStereo)
    {
        if (type == webrtc::kPlaybackAllChannelsMixed)
        {
            printf("get remote mix pcm data
"); } if (type == webrtc::kRecordingAllChannelsMixed) { printf("get local record pcm data
"); // , mp3 // } } };

データの入手方法
Webrtcデータコールバックをオンにします.
  AudioMixDataCallBack* p = new AudioMixDataCallBack();
    webrtc::VoEExternalMedia* externalMedia =
                webrtc::VoEExternalMedia::GetInterface(g_voe->engine());
    //        
    externalMedia->RegisterExternalMediaProcessing(-1, 
                webrtc::kRecordingAllChannelsMixed, 
                *p);
    //           
    externalMedia->RegisterExternalMediaProcessing(-1, 
                webrtc::kPlaybackAllChannelsMixed, 
                *p);
    return 0;

注意ハイブリッドデータ取得要求RegisterExternalMediaProcessingの最初のパラメータchannelIdを-1に設定
Webrtc branch 55では、branch 56では以上の方法でデータを取得できますが、branch 57ではwebrtcのコードを修正してからデータを取得する必要があります.変更されたファイルは、webrtc/audio/audio_です.state.cc
AudioState::AudioState(const AudioState::Config& config)
    : config_(config),
      voe_base_(config.voice_engine),
      audio_transport_proxy_(voe_base_->audio_transport(),
                             voe_base_->audio_processing(),
                             config_.audio_mixer) {
  process_thread_checker_.DetachFromThread();
  RTC_DCHECK(config_.audio_mixer);

  // Only one AudioState should be created per VoiceEngine.
  RTC_CHECK(voe_base_->RegisterVoiceEngineObserver(*this) != -1);

  auto* const device = voe_base_->audio_device_module();
  RTC_DCHECK(device);

  // This is needed for the Chrome implementation of RegisterAudioCallback.
  //        
  // device->RegisterAudioCallback(nullptr);
  // device->RegisterAudioCallback(&audio_transport_proxy_);
}

正しい呼び出しスタック
branch 57で上記2行のコードを注記しないと、再生スレッドがVoEBaseImpl::NeedMorePlayData()に再生データを受け取らないため、設定したコールバックは実行されません.修正後のaudio renderスレッドは、音声を再生する前に、ミックスされたデータを私たちが定義したAudioMixDataCallBackで呼び出しスタックに戻します.
AudioMixDataCallBack::Process()
AudioMixDataCallBack::Process()
webrtc::voe::OutputMixer::DoOperationsOnCombinedSignal()
webrtc::VoEBaseImpl::GetPlayoutData()
webrtc::VoEBaseImpl::NeedMorePlayData()
webrtc::VoEBaseImpl::NeedMorePlayData()
webrtc::AudioDeviceBuffer::RequestPlayoutData()
webrtc::AudioDeviceMac::RenderWorkerThread()
webrtc-test`webrtc::AudioDeviceMac::RunRender()

次の作業
VoEExternalMediaクラスは新版webrtcから削除されるそうで、最新バージョンのwebrtcでどのようにデータを入手するかはまだ検討されていません.
キーワード:webrtc録音pcmデータaudio混音