5

当连接建立并准备就绪时,我的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;

在这一点上,我希望通过解码的音频数据接收到我的具体类的常规回调,就像我在视频数据可用时接收到我webrtc::VideoRendererInterface的调用一样cricket::VideoFrame*,但我没有。

我究竟做错了什么?

4

1 回答 1

4

除了使用尚未实现的接口之外,您没有做错任何事情。好吧,接口已实现,但它背后没有代码可以实际调用您的OnData()方法!

有问题的接口在 WebRTC 的mediastreaminterface.h中。文件下方有一条注释,提示AddSink()and的未实现状态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 中实现。

于 2014-09-04T05:21:13.363 回答