WebRTC库通过AddSink进行远程音频渲染

WebRTC库通过AddSink进行远程音频渲染,webrtc,libjingle,Webrtc,Libjingle,当连接设置完毕并准备就绪时,mywebrtc::PeerConnectionObserver实现会收到对 void OnAddStream(webrtc::MediaStreamInterface* stream); 在这里,我从webrtc::MediaStreamInterface中拉出webrtc::AudioTrackInterface 我从这里得到一个有效(非空)指针,称之为track webrtc::AudioTrackInterface* track; 我继续调用track->

当连接设置完毕并准备就绪时,my
webrtc::PeerConnectionObserver
实现会收到对

void OnAddStream(webrtc::MediaStreamInterface* stream);
在这里,我从
webrtc::MediaStreamInterface
中拉出
webrtc::AudioTrackInterface

我从这里得到一个有效(非空)指针,称之为
track

webrtc::AudioTrackInterface* track;
我继续调用
track->AddSink(sink)
,其中
sink
是一个类的实例,该类继承自
webrtc::AudioTrackSinkInterface
,并实现

  virtual void OnData(const void* audio_data,
                      int bits_per_sample,
                      int sample_rate,
                      int number_of_channels,
                      int number_of_frames) = 0;
此时,我希望通过解码的音频数据定期回调到我的具体类中,就像在视频数据可用时,我通过
cricket::VideoFrame*
接收对
webrtc::videorenderinterface
的调用一样,但我没有


我做错了什么?

除了使用尚未实现的接口之外,您没有做错任何事情。好的,接口已经实现了,但是它后面没有代码真正调用您的
OnData()
方法

该接口位于WebRTC的中。文件中还有一个注释提示
AddSink()
OnData()
的未实现状态:

不幸的是,这里引用的
AudioRenderer
类看起来并不容易使用。它在Chromium中定义,并使用各种内部类型的Chromium。如果你想好如何处理它,请让我知道,因为我正试图自己解决同样的问题

我确实注意到WebRTC中的一些代码使用了
OnData()
,与您和我尝试使用的方式相同。有一个
LocalAudioTrackHandler
构造函数调用音频曲目上的
track->AddSink()
,并将
LocalAudioSinkAdapter
类的实例传递给它。这个类有一个
OnData()
方法,该方法转发到
sink->OnData()
。确实执行了
track->AddSink()
调用,但从未调用过
OnData()
方法

我认为这个
AddSink()
/
OnData()
代码是在Chromium内部实现这些调用时添加的,因此当他们切换时,它将开始使用此代码而不是
AudioRenderer
代码。这样就避免了更新两个代码基时彼此完全同步的需要


因此,我只能建议等待调用
OnData()
的代码在Chromium中实现。

那么,这有实现过吗?mediastreaminterface.h中的注释似乎不再存在,但我正在尝试使用AudioTrackSinkInterface,并且onData回调从未被调用。看起来它已实现,但(据我所知)它仅适用于远程流,而不适用于本地流(VideoSinkInterface适用于两者)
// Get a pointer to the audio renderer of this AudioTrack.
// The pointer is valid for the lifetime of this AudioTrack.
// TODO(xians): Remove the following interface after Chrome switches to
// AddSink() and RemoveSink() interfaces.
virtual cricket::AudioRenderer* GetRenderer() { return NULL; }