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