WebRTC 库通过 AddSink 进行远程音频渲染
Posted
技术标签:
【中文标题】WebRTC 库通过 AddSink 进行远程音频渲染【英文标题】:WebRTC library remote audio rendering via AddSink 【发布时间】:2014-08-01 08:09:41 【问题描述】:当连接建立并准备就绪时,我的webrtc::PeerConnectionObserver
实现会收到对
void OnAddStream(webrtc::MediaStreamInterface* stream);
我将webrtc::AudioTrackInterface
拉出webrtc::MediaStreamInterface
。
我从这里得到一个有效的(非空)指针,称之为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::VideoRendererInterface
的调用一样,但我没有。
我做错了什么?
【问题讨论】:
【参考方案1】:除了使用尚未实现的接口之外,您没有做错任何事情。好吧,接口已经实现了,但是它背后没有代码可以真正调用你的OnData()
方法!
有问题的接口在 WebRTC 的mediastreaminterface.h 中。文件下方有一条注释提示AddSink()
和OnData()
的未实现状态:
// 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;
不幸的是,这里引用的AudioRenderer
类看起来不太容易使用。它在 Chromium 的 audio_renderer.h 中定义,并使用各种 Chromium 内部类型。如果您知道如何处理它,请告诉我,因为我正在尝试自己解决同样的问题。
我确实注意到 WebRTC 的 mediastreamhandler.cc 中的一些代码使用 OnData()
的方式与您和我尝试的方式相同。有一个LocalAudioTrackHandler
构造函数调用音轨上的track->AddSink()
并将LocalAudiosinkAdapter
类的实例传递给它。这个类有一个OnData()
方法,它转发到sink_->OnData()
。 track->AddSink()
调用确实被执行,但 OnData()
方法永远不会被调用!
我认为这个 AddSink()
/OnData()
代码是在 Chromium 内部实现这些调用的预期中添加的,所以当他们切换时它将开始使用这个代码而不是 AudioRenderer
代码。这避免了更新两个代码库彼此完美同步的需要。
所以我只能等到调用 OnData()
的代码在 Chromium 中实现。
【讨论】:
那么,这有没有实现过? mediastreaminterface.h 中的 cmets 似乎不再存在,但我正在尝试使用 AudioTrackSinkInterface 并且永远不会调用 onData 回调。 看起来它已经实现了,但是(据我所知)它只适用于远程流,而不适用于本地流(VideoSinkInterface 两者都适用)以上是关于WebRTC 库通过 AddSink 进行远程音频渲染的主要内容,如果未能解决你的问题,请参考以下文章