【问题标题】:Processing video data captured with WebRTC (Socket.IO) in a C++ server在 C++ 服务器中处理使用 WebRTC (Socket.IO) 捕获的视频数据
【发布时间】:2014-04-13 15:29:10
【问题描述】:

我正在尝试找出做以下事情的最佳方法:

(A) 使用网络浏览器(例如 Chrome / Chromium)在客户端 PC 中捕获视频帧。

(B) 将它们发送到运行 C++ 处理算法(例如基于 OpenCV 的突变松鼠检测例程)的服务器计算机。

(C) 将处理结果发送回客户端 PC 中的浏览器以显示它们(实时会很好,但总体延迟当然是可以预料的)。

到目前为止,我发现 WebRTC 非常适合执行 (A)(getUserMedia() 等),理论上,(B) .在将数据发送到 C++ 服务器时出现了我的问题。我一直在研究 WebRTC 的基础知识(包括 P2P 通信示例和 Native C++ API 文档),但我仍然不知道如何开始构建我的服务器并从浏览器发送数据。虽然我在 Javascript 方面的经验很少,但我已经在类似的场景中工作过(Javascript Client C++ Server with webSockets),但我认为 webRTC 解决方案应该更容易实现。

在这种情况下使用 webRTC 是否正确?我错过了什么吗?是否有任何教程或示例涵盖了我错过的场景?

【问题讨论】:

    标签: javascript c++ websocket webrtc


    【解决方案1】:

    所以你想通过使用 Webrtc、web 套接字和 c++ 服务器来进行视频共享。

    我们需要信令服务器(在你的情况下是 c++)来建立浏览器之间的连接,建立连接后,浏览器在没有服务器的情况下共享视频。

    您可以使用 libwebsocket 来建立浏览器之间的连接。

    需要共享用户浏览器、电脑的各种数据,如音视频信息、IP地址等。

    您需要在每个浏览器上通过new RTCPeerConnection(configuration);创建peerConnection对象,并需要通过creatOffer()createAnswer()方法共享各种信息。

    分享相关信息后,浏览器之间将建立连接,您的视频将开始分享。

    过程是什么?(给出一些总结)

    在您的客户端,如何向/从 c++ 服务器发送/获取请求。

    1) 在 browser1browser2

    上创建套接字
    var websocket = new WebSocket('ws://127.0.0.1:9000', 'echo');
    

    2) 浏览器 1(为浏览器 2 创建报价)

    websocket.send("createOfferForVideo");
    

    3) 服务器

    服务器收到请求后,会将响应广播到浏览器2。

    printf("received data: %s\n", (char *) in);
    

    4) Browser 2(收到 offer 后为 browser1 创建答案)

    websocket.onmessage = function (message){
       if(messageAboutCreateOffer){
           websocket.send("createAnswerForVideo");
       }
    }
    

    这就是建立浏览器和视频之间的连接将开始共享的方式。

    更多关于WEBRTC的信息

    带有 c++websockets 的库 libwebsocket

    有用的例子是Example1Example2

    【讨论】:

    • 谢谢,但我不想在浏览器之间设置 C++ 信令服务器。我只想将视频数据从点“a”(机器#1 中的浏览器)发送到点“b”(机器#2 中的 c++ 服务器)以存储和处理它。我已经用 websockets 做了类似的事情,但我认为通过 webrtc 发送视频数据应该更高效,对吗?
    • 浏览器之间首先需要信令服务器建立连接。建立浏览器之间的连接后,视频将通过 webrtc 机制在没有服务器的情况下共享。这取决于您将使用哪个信令服务器。
    • 问题是如何将视频发送到其他计算机,并且首先要通过信令服务器建立浏览器之间的连接。
    • @SumanBogati 据我了解没有第二个浏览器的问题。只有一个浏览器和一个开放的cv处理服务器(或称它为c客户端)
    【解决方案2】:

    从您的帖子中,我了解到您需要一个 WebRTC C 客户端来在 C 客户端和浏览器之间建立一个 RTCPeerConnection。之后,您可以处理流并使用另一个 RTCPeerConnection 将其返回给浏览器。

    我通常不使用 C/C++,但请查看此存储库:https://github.com/mozilla/webrtc-standalone,也许它会很有用。

    【讨论】:

    • 谢谢!我肯定在寻找类似的东西。不过,我还有很多东西要学。 graciñas meu! :)
    • 您的另一个选择是强制视频通过 TURN 服务器,您将修改该服务器以捕获数据,然后对它做任何您想做的事情。
    【解决方案3】:

    webRTC 的 RTCPeer 连接用于在客户端与客户端之间建立连接,无需服务器在其间传输数据。对于客户端之间的这种连接,我们需要用于 NAT 遍历的服务器(Stun 和 Turn 服务器),但是一旦建立连接,数据就可以从客户端双向发送到客户端,而无需存储在服务器中。

    如果您想将数据发送到服务器并对其进行处理,则必须使用 websockets。

    【讨论】:

      【解决方案4】:

      看看你是否真的需要使用 c++ 来处理数据(不太可能),因为如果你甚至可以轻松实现它并破坏 peer2peer 的优势,例如,这会产生很大的开销。不会给您的服务器带来负担。

      在 javascript 中处理数据并在客户端进行面部识别(以及更多),并且有许多库可以做到这一点。查看 webrtc.io 模块,它们具有用于处理数据的 rtc-videoproc ect。

      可以使用插件在浏览器中使用c++(加载缓慢)。

      【讨论】:

        猜你喜欢
        • 2019-06-05
        • 1970-01-01
        • 2013-01-22
        • 1970-01-01
        • 2015-01-26
        • 2018-01-18
        • 2023-03-18
        • 2013-08-06
        • 2021-10-06
        相关资源
        最近更新 更多