建立连接并准备好后,我的webrtc::PeerConnectionObserver实现会收到一个调用
void OnAddStream(webrtc::MediaStreamInterface* stream);
Run Code Online (Sandbox Code Playgroud)
在哪里我拉出webrtc::AudioTrackInterface了webrtc::MediaStreamInterface.
我从中得到一个有效的(非空)指针,调用它 track
webrtc::AudioTrackInterface* track;
Run Code Online (Sandbox Code Playgroud)
然后我继续调用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;
Run Code Online (Sandbox Code Playgroud)
在这一点上,我期望通过解码的音频数据接收到我的具体类的常规回调,就像我接收到有关视频数据webrtc::VideoRendererInterface的cricket::VideoFrame*时候的调用,但我没有.
我究竟做错了什么?
除了使用尚未实现的接口之外,您没有做任何错误。好吧,接口已实现,但背后没有代码来实际调用您的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; }
Run Code Online (Sandbox Code Playgroud)
不幸的是,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 内部实现。
| 归档时间: |
|
| 查看次数: |
1303 次 |
| 最近记录: |