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 进行远程音频渲染的主要内容,如果未能解决你的问题,请参考以下文章

webrtc 上用于远程流的网络音频分析器

如何在 webrtc 的画布流上添加音频流

Flutter webrtc音频无法在android上运行

基于webRTC的前端远程控制系统

WebRTC在同一个peerConnection中的多个视频流

webRTC如何判断是否有音频