我用C ++编写了两个使用WebRTC的命令行应用程序:
基本实现起作用:他们交换SDP-Offer和-Answer,使用ICE查找其外部IP,创建具有相应约束的PeerConnection和PeerConnectionFactory,等等。我在服务器端向{{1 }}将收到的有效负载写入文件。该文件包含有效的PCM音频。因此,我假设客户端通过网络成功将数据流传输到服务器应用程序。
在服务器端,我的回调RtpReceiverImpl::IncomingRtpPacket
被调用并收到一个PeerConnectionObserver::OnAddStream
。此外,我可以通过音频设备迭代MediaStreamInterface
。所以基本上,一切都很好。
缺少的内容:我需要某种胶水来告诉WebRTC在相应的设备上播放我的AudioStream。我已经看到可以得到一个AudioSink,AudioRenderer和AudioTrack对象。再次:不幸的是,我看不到将它们传递到音频设备的界面。有人可以帮我吗?
一个重要的注意事项:我想避免调试实际的硬件。因此,在构建WebRTC模块时,我添加了-DWEBRTC_DUMMY_FILE_DEVICES。它应该将音频写入输出文件,但该文件仅包含0x00。输入文件已成功读取,因为如前所述,音频是通过RTP发送的。
答案 0 :(得分:0)
最后,我找到了解决方案:首先,我不得不说我的代码使用了2017年以来的WebRTC。因此,以下事情可能已更改和/或已修复:
调试代码和WebRTC库后,我看到:添加远程流后,播放应自动开始。开发人员方面无需在playout()
中调用VoiceEngine
或类似的东西。当库识别出远程音频流时,播放将暂停,新的源将添加到混音器中,然后恢复播放。 webrtc::MediaStreamInterface
提供了唯一的用于控制播放的API,这些API通过PeerConnectionObserver::OnAddStream
传递。例如SetVolume()
或set_enabled()
。
那么,我的情况出了什么问题?我使用了FileAudioDevice
类,该类应该将原始音频数据写入输出文件而不是扬声器。我的实现包含两个错误:
FileAudioDevice::Playing()
在任何情况下均返回true。因此,该库添加了要恢复播出的远程流,称为FileAudioDevice::Playing()
,该流返回true并中止,因为它认为AudioDevice已经处于播出模式。FileAudioDevice::PlayThreadProcess()
以_outputFile.Write(_playoutBuffer, kPlayoutBufferSize)
的形式写入磁盘。但是,这不起作用。幸运的是,一个普通的C fwrite()确实可以解决hacky错误。