使用Django Channels将WebRTC视频流发送到服务器

6

我正在尝试使用django创建一个人脸检测的Web应用。该应用程序的工作方式如下:

  1. 用户导航到URL
  2. 摄像头在客户端计算机上启动
  3. 然后将每个帧发送到服务器进行人脸检测
  4. 处理后的帧随即在网页上显示

我了解到不能使用OpenCV VideoCapture,因为它只在服务器端起作用。当我在网上阅读时,有人建议我使用JavaScript,特别是WebRTC,在客户端启动实时流。因此,我找到了这篇教程,它解释了如何使用JavaScript在客户端计算机上启动网络摄像头。

现在我的问题是如何将来自客户端计算机上JavaScript的每个帧发送到服务器端的Python OpenCV?

所有这些都应该实时发生,因此我不能保存实时视频,然后在保存的视频上运行Python代码。

一些网站要求我使用AJAX将数据发送到服务器端,但我不确定如何在JavaScript代码中定位要发送的每个帧。

以下是我迄今为止的代码:

通过WebRTC访问客户端摄像头

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta content="stuff, to, help, search, engines, not" name="keywords">
  <meta content="What this page is about." name="description">
  <meta content="Display Webcam Stream" name="title">
  <title>Display Webcam Stream</title>

  <style>
    #container {
      margin: 0px auto;
      width: 500px;
      height: 375px;
      border: 10px #333 solid;
    }

    #videoElement {
      width: 500px;
      height: 375px;
      background-color: #666;
    }
  </style>
</head>

<body>
  <div id="container">
    <video autoplay="true" id="videoElement">

    </video>
  </div>
  <script>
    var video = document.querySelector("#videoElement");

    if (navigator.mediaDevices.getUserMedia) {
      navigator.mediaDevices.getUserMedia({
          video: true
        })
        .then(function(stream) {
          video.srcObject = stream;
          // myJson = JSON.stringify(stream)
        })
        .catch(function(err0r) {
          console.log("Something went wrong!");
        });
    }

    console.log(video)
  </script>
</body>

</html>

在这段代码中,我如何从网络摄像头访问每个帧。我尝试使用console.log打印video的内容,但没有帮助。

DJANGO视图.py

def index(request):
    return render(request, 'cwrtc/index.html', {})

我使用django channels是因为我认为,为了从客户端发送和接收数据,我可能必须使用web sockets。而且我使用python,因为我计划添加更多功能到应用程序中,使用python编写比其他语言更容易。
是否可能从javascript发送视频流到python?
提前致谢。
2个回答

4
是的,您可以使用JavaScript将视频发送到服务器上的Python,但是您不能使用Ajax或Web套接字来发送帧。
以下是如何实现:
1. 使用JavaScript在客户端创建WebRTC会话。 2. 使用本地代码在服务器端运行WebRTC。 3. 通过交换SDP之间创建客户端和服务器之间的点对点会话。请注意,您需要在服务器端使用视频捕获设备,否则将无法进行视频会话。如果没有,您可以在服务器端使用虚拟视频捕获器。 4. 然后,您可以将Python代码与在服务器上运行的WebRTC实例进行接口。
如果需要更多帮助,请告诉我。

嘿!感谢回复。我是一个新手,不一定知道如何在服务器端运行本机webrtc代码。您能指点我一些教程吗?还有,如何将Python代码与webrtc实例接口化?我在网上搜索了一下,只找到了关于在Android上运行原生代码的教程。 - Sashaank
1
我该如何在服务器端使用Python实现WebRTC?我查看了aiortc,但它在Windows 10上无法工作。 - Sashaank
我建议您选择Linux作为服务器运行环境,并使用python-C模块接口来连接Python。请访问webrtc.org获取本地代码和构建说明。如果需要任何特定的指导,我很乐意提供帮助。 - mesibo
@Sashaank,我也在尝试做同样的事情,你成功实现了吗? - Hari

0
我认为这不是通过服务器流式传输视频的好方法。当webrtc直接提供p2p连接时,为什么要将视频帧发送到服务器呢?你只需要一个套接字库来管理用户并连接它们。您可以将随机生成的roo_id传递给Django通道以创建房间。如果您擅长Node.js,我建议您使用socket.io库,因为Django通道与webrtc的资源和文档非常少。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接