如何将音频从浏览器流式传输到WebRTC本机C ++应用程序

时间:2014-05-03 20:48:37

标签: javascript c++ audio webrtc

到目前为止,我设法运行以下示例:

WebRTC native c++ to browser video streaming example

该示例演示了如何将视频从本机C ++应用程序(peerconnection_client.exe)流式传输到浏览器(我正在使用Chrome)。这很好用,我可以在浏览器中看到自己。

我想要做的是将音频从浏览器传输到本机应用程序,但我不知道如何。有人可以给我一些指示吗?

3 个答案:

答案 0 :(得分:2)

我正试图找到一种方法将视频和音频从浏览器传输到我的本机程序。到目前为止,这是我的方式。

要将视频从浏览器流式传输到本机程序而不使用gui,请按照此处的示例操作。 https://chromium.googlesource.com/external/webrtc/+/master/webrtc/examples/peerconnection/client/

使用AddOrUpdateSink添加您自己的VideoSinkInterface,您将在回调void OnFrame(const cricket::VideoFrame& frame)中收到您的帧数据。而不是像示例那样将帧渲染到GUI,您可以做任何你想做的事。

在没有真正的音频设备的情况下,将音频从浏览器传输到本机程序。你可以使用假的音频设备。

  1. 将文件https://chromium.googlesource.com/external/webrtc/+/master/webrtc/build/webrtc.gni
  2. 中的变量rtc_use_dummy_audio_file_devices修改为true
  3. 调用全局静态函数以指定文件名webrtc::FileAudioDeviceFactory::SetFilenamesToUse("", "file_to_save_audio");
  4. 补丁file_audio_device.cc,代码自爆。 (当我写这个答案时,FileAudioDevice有一些问题,可能已经修复了)
  5. 重新编译您的程序touch file_to_save_audio,您将在建立webrtc连接后在file_to_save_audio中看到pcm数据。
  6. 补丁:

        diff --git a/webrtc/modules/audio_device/dummy/file_audio_device.cc b/webrtc/modules/audio_device/dummy/file_audio_device.cc
    index 8b3fa5e..2717cda 100644
    --- a/webrtc/modules/audio_device/dummy/file_audio_device.cc
    +++ b/webrtc/modules/audio_device/dummy/file_audio_device.cc
    @@ -35,6 +35,7 @@ FileAudioDevice::FileAudioDevice(const int32_t id,
         _recordingBufferSizeIn10MS(0),
         _recordingFramesIn10MS(0),
         _playoutFramesIn10MS(0),
    +    _initialized(false),
         _playing(false),
         _recording(false),
         _lastCallPlayoutMillis(0),
    @@ -135,12 +136,13 @@ int32_t FileAudioDevice::InitPlayout() {
           // Update webrtc audio buffer with the selected parameters
           _ptrAudioBuffer->SetPlayoutSampleRate(kPlayoutFixedSampleRate);
           _ptrAudioBuffer->SetPlayoutChannels(kPlayoutNumChannels);
    +      _initialized = true;
       }
       return 0;
     }
    
     bool FileAudioDevice::PlayoutIsInitialized() const {
    -  return true;
    +  return _initialized;
     }
    
     int32_t FileAudioDevice::RecordingIsAvailable(bool& available) {
    @@ -236,7 +238,7 @@ int32_t FileAudioDevice::StopPlayout() {
     }
    
     bool FileAudioDevice::Playing() const {
    -  return true;
    +  return _playing;
     }
    
     int32_t FileAudioDevice::StartRecording() {
    diff --git a/webrtc/modules/audio_device/dummy/file_audio_device.h b/webrtc/modules/audio_device/dummy/file_audio_device.h
    index a69b47e..3f3c841 100644
    --- a/webrtc/modules/audio_device/dummy/file_audio_device.h
    +++ b/webrtc/modules/audio_device/dummy/file_audio_device.h
    @@ -185,6 +185,7 @@ class FileAudioDevice : public AudioDeviceGeneric {
       std::unique_ptr<rtc::PlatformThread> _ptrThreadRec;
       std::unique_ptr<rtc::PlatformThread> _ptrThreadPlay;
    
    +  bool _initialized;;
       bool _playing;
       bool _recording;
       uint64_t _lastCallPlayoutMillis;
    

答案 1 :(得分:1)

您可以使用以下示例为appRTC实现桌面客户端。

https://github.com/TemasysCommunications/appRTCDesk

这完成并与webrtc.org上的开源实现提供的Web客户端,Android客户端和iOs客户端互操作,为您提供了一整套客户端来使用他们的免费服务器。 peer connection_ {client | server}是lib jingle time(pre webrtc)中的一个旧例子,并不与其他任何东西互操作。

答案 2 :(得分:1)

我知道这是一个老问题,但我现在努力寻找解决方案,所以我认为分享是值得赞赏的。

有一个或多或少的简单方法可以让一个示例运行从浏览器流到本机代码。您需要webrtc源http://www.webrtc.org/native-code/development

您需要的两个工具是peerconnection服务器和客户端。两者都可以在文件夹talk / example / peerconnection

中找到

要使其正常工作,您需要对其进行修补,以便为peerconnection客户端启用DTLS。因此,使用此处提供的补丁({3}}对其进行修补并重建客户端。现在,您已在本机站点上进行设置!

对于浏览器,我建议在启动peerconnection_server和peerconnection_client尝试连接peer2peer示例后,从这里https://code.google.com/p/webrtc/issues/detail?id=3872获取peer2peer示例。

可能需要连接约束:
    {         &#34; DtlsSrtpKeyAgreement&#34;:是的     }