Потоковая передача с веб-камеры на сервер с использованием flask -socketio - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь создать веб-приложение, в котором изображения передаются с веб-камеры клиента на сервер, сервер выполняет некоторые вычисления для изображений, и результаты этих вычислений отправляются обратно клиенту в реальном времени.

До сих пор я пробовал это с 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, мне не нужно отправлять изображения обратно клиенту, только данные намного меньшего размера.

Проблема в том, что даже так все очень запаздывает, если только изображения, отправленные на сервер, недопустимо малы, т. е. до такой степени, что это в первую очередь наносит ущерб цели их отправки на сервер.

Проблема сохраняется, если изображение вычисления пропущены, проблема кажется т ol ie при отправке изображений.

Теперь мне интересно, ожидается ли ожидаемое поведение потокового метода canvas / toDataURL или я делаю что-то не так.

Если это Ожидается, что, возможно, кто-то может указать мне в направлении более практического способа достижения того, что я пытаюсь сделать.

(eventlet определенно установлен; Я использую heroku для развертывания в случае, если это актуально.)

Любая помощь приветствуется!

Редактировать 1 :

Я уже увеличил max_decode_packets, так что это не источник проблемы.

Редактировать 2 :

Сеть: 1

Изменить 3 :

Дополнительные снимки экрана: Сеть, сообщение веб-сокета 2 сервер-> клиент 3

...