首页 > 解决方案 > 使用flask-socketio从网络摄像头流式传输到服务器

问题描述

我正在尝试构建一个 Web 应用程序,其中图像从客户端的网络摄像头流式传输到服务器,服务器对图像执行一些计算,并将这些计算的结果实时发送回客户端。

到目前为止,我已经用flask-socketio尝试过,修改了这段代码:

https://github.com/dxue2012/python-webcam-flask

我认为这又是从这个例子改编而来的:

https://github.com/miguelgrinberg/flask-video-streaming

客户端的相关代码位是:

function sendSnapshot() {
  if (!localMediaStream) {
    return;
  }

  ctx.drawImage(video, 0, 0, video.videoWidth, video.videoHeight, 0, 0, 300, 150);

    let dataURL = canvas.toDataURL('image/jpeg');
      socket.emit('input image', dataURL);
  }

  navigator.mediaDevices.getUserMedia(constraints).then(function(stream) {
    video.srcObject = stream;
    localMediaStream = stream;

    setInterval(function () {
      sendSnapshot();
    }, 50);
  }).catch(function(error) {
    console.log(error);
  });

在服务器上:

app = Flask(__name__)

app.config['SECRET_KEY'] = 'secret!'
app.config['DEBUG'] = True

socketio = SocketIO(app)


val = 0

@socketio.on('input image', namespace='/test')
def test_message(input):
    input = input.split(",")[1]

    global val
    val = do_stuff(input)

@socketio.on('get value', namespace='/test')
def send_stuff_back():

    global val

    emit("val ready", val)

除了在 GitHub 示例中,我不需要将图像发送回客户端,只需要小得多的数据。

问题是,即便如此,除非发送到服务器的图像非常小,否则一切都非常滞后,也就是说,它确实违背了首先将它们发送到服务器的目的。

如果跳过图像计算,问题仍然存在,问题似乎在于发送图像。

现在我想知道这是否是这种 canvas/toDataURL 流媒体方法的预期行为,或者我做错了什么。

如果这是意料之中的,也许有人可以为我指明一个更实际的方法来实现我正在尝试做的事情。

(肯定安装了eventlet;我正在使用heroku进行部署以防万一。)

任何帮助表示赞赏!

编辑 1

我已经增加了“max_decode_packets”,所以这不是问题的根源。

编辑 2

网络:1

编辑 3

更多截图:网络、websocket message 2 server->client 3

标签: flaskwebsocketsocket.iovideo-streamingflask-socketio

解决方案


推荐阅读