使用音频设备播放WebRTC C ++应用程序的AudioStream

时间:2019-04-16 16:22:45

标签: c++ webrtc rtp

我用C ++编写了两个使用WebRTC的命令行应用程序:

  • 客户端创建PeerConnection并打开AudioStream
  • 服务器接收并播放AudioStream

基本实现起作用:他们交换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发送的。

1 个答案:

答案 0 :(得分:0)

最后,我找到了解决方案:首先,我不得不说我的代码使用了2017年以来的WebRTC。因此,以下事情可能已更改和/或已修复:

调试代码和WebRTC库后,我看到:添加远程流后,播放应自动开始。开发人员方面无需在playout()中调用VoiceEngine或类似的东西。当库识别出远程音频流时,播放将暂停,新的源将添加到混音器中,然后恢复播放。 webrtc::MediaStreamInterface提供了唯一的用于控制播放的API,这些API通过PeerConnectionObserver::OnAddStream传递。例如SetVolume()set_enabled()

那么,我的情况出了什么问题?我使用了FileAudioDevice类,该类应该将原始音频数据写入输出文件而不是扬声器。我的实现包含两个错误:

  • FileAudioDevice::Playing()在任何情况下均返回true。因此,该库添加了要恢复播出的远程流,称为FileAudioDevice::Playing(),该流返回true并中止,因为它认为AudioDevice已经处于播出模式。
  • FileWrapper类中似乎有一个错误。最终输出通过FileAudioDevice::PlayThreadProcess()_outputFile.Write(_playoutBuffer, kPlayoutBufferSize)的形式写入磁盘。但是,这不起作用。幸运的是,一个普通的C fwrite()确实可以解决hacky错误。