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クラスを実現する必要があります.
データの入手方法
Webrtcデータコールバックをオンにします.
注意ハイブリッドデータ取得要求RegisterExternalMediaProcessingの最初のパラメータchannelIdを-1に設定
Webrtc branch 55では、branch 56では以上の方法でデータを取得できますが、branch 57ではwebrtcのコードを修正してからデータを取得する必要があります.変更されたファイルは、webrtc/audio/audio_です.state.cc
正しい呼び出しスタック
branch 57で上記2行のコードを注記しないと、再生スレッドがVoEBaseImpl::NeedMorePlayData()に再生データを受け取らないため、設定したコールバックは実行されません.修正後のaudio renderスレッドは、音声を再生する前に、ミックスされたデータを私たちが定義したAudioMixDataCallBackで呼び出しスタックに戻します.
次の作業
VoEExternalMediaクラスは新版webrtcから削除されるそうで、最新バージョンのwebrtcでどのようにデータを入手するかはまだ検討されていません.
キーワード:webrtc録音pcmデータaudio混音
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混音