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