无法将 vidoe 从网页流式传输到 python 服务器,在 python 服务器中使用flask-socketio,在java脚本中使用 socetio

问题描述

我一直在尝试将视频从网页流式传输到 python 服务器,然后在 python 中对其进行处理,然后再次将其发送回网页。

很遗憾,我无法将视频从网页发送到服务器。但是,我可以成功地将视频从服务器流式传输到网页。

对于流媒体,我使用了 python 中的flask-socketio 和java 脚本中的socketio 的网络套接字。

我在此处附加了 HTML 文件和 python 服务器文件

socket.emit('web2server',{data: data});

以上行对我不起作用。没有显示错误。数据要么没有发出,要么没有被接收。

请帮我解决这个问题。

以下是html文件

    <!DOCTYPE html>
<html lang="en">
<head>
    <Meta charset="UTF-8">
    <title>Title</title>
</head>

<body>
    <div id="container">
    <canvas id="canvasOutput"></canvas>
        <video autoplay="true" id="videoElement"></video>
    </div>
    <div class="chart-area">
        <img id="streamer-image" src="">
    </div>
    <div>
        <p id="streamer-text" style="color:red;"></p>
    </div>
</body>
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://docs.opencv.org/master/opencv.js" type="text/javascript"></script>
    <script>

      document.addEventListener("DOMContentLoaded",function(event) {
        const image_elem = document.getElementById("streamer-image");
        const text_elem = document.getElementById("streamer-text");
        var video = document.querySelector("#videoElement");


        var socket = io.connect('http://' + document.domain + ':' + location.port + '/web',{
          reconnection: false
        });

        socket.on('connect',() => {
          console.log('Connected');
          //socket.emit('web2server',"Fucj");

        });

        socket.on('disconnect',() => {
          console.log('disconnected');
        });

        socket.on('connect_error',(error) => {
          console.log('Connect error! ' + error);
        });

        socket.on('connect_timeout',(error) => {
          console.log('Connect timeout! ' + error);
        });

        socket.on('error',(error) => {
          console.log('Error! ' + error);
        });

        video.width = 500;
        video.height = 375;
        if (navigator.mediaDevices.getUserMedia) {
            navigator.mediaDevices.getUserMedia({ video: true })
            .then(function (stream) {
                video.srcObject = stream;
                video.play();

                let src = new cv.Mat(video.height,video.width,cv.CV_8UC4);
                let dst = new cv.Mat(video.height,cv.CV_8UC1);
                let cap = new cv.VideoCapture(video);
                console.log("cv cap object is created");
                const FPS = 22;
                setInterval(() => {
                    cap.read(src);
                    var type = "image/png"
                    var data = document.getElementById("canvasOutput").toDataURL('image/jpeg',1.0);
                    data = data.replace('data:' + type + ';base64,',''); //split off junk at the beginning
                    //socket.to('web2server').emit('message',data);

                    //var hidden_canvas = document.querySelector('canvasOutput'),// context = hidden_canvas.getContext('2d');
                    //context.drawImage(video,width,height);
                    //snap = hidden_canvas.toDataURL('image/jpeg',1.0);
                    socket.emit('web2server',{data: "test msg"});
                    console.log("data emitted");
                    console.log(data);

                    $.ajax({
                      type: "POST",url: "/hello",data:{
                        imageBase64: data
                      }
                    }).done(function() {
                      console.log('sent');
                    });

                },10000/FPS);



            })
            .catch(function (err0r) {
                console.log(err0r)
                console.log("Something went wrong!");
            });
        }




      });


    </script>
</html>

** 下面是python服务器文件**

from flask_socketio import SocketIO
from flask import Flask,render_template,request
from PIL import Image
from engineio.payload import Payload
from io import BytesIO
import base64
Payload.max_decode_packets = 500
import eventlet
eventlet.monkey_patch()



app = Flask(__name__)
socketio = SocketIO(app)




@app.route('/')
def entry_page():
    #return render_template('app_attendace_usermedia_socket.html')
    return render_template('test.html')


@app.route('/hello')
def hello():
    print("hello fuction that processes image is executed")
    #data_url = request.values['imageBase64']
    #data_url = data_url[22:]
    #print(data_url)
    #im = Image.open(BytesIO(base64.b64decode(data_url)))
    #print(type(im))
    #im.save('image.jpeg')
    return ''


@socketio.on('connect',namespace='/web')
def connect_web():
    print('[INFO] Web client connected: {}'.format(request.sid))


@socketio.on('disconnect',namespace='/web')
def disconnect_web():
    print('[INFO] Web client disconnected: {}'.format(request.sid))


'''@socketio.on('connect',namespace='/cv')
def connect_cv():
    print('[INFO] CV client connected: {}'.format(request.sid))


@socketio.on('disconnect',namespace='/cv')
def disconnect_cv():
    print('[INFO] CV client disconnected: {}'.format(request.sid))


@socketio.on('cv2server')
def handle_cv_message(message):
    socketio.emit('server2web',message,namespace='/web')
    #print('this is data from cv app to server')'''

@socketio.on('web2server')
def handle_web_message(message):
    print('data received')
    print(message)
    #socketio.emit('server2cv',namespace='/cv')
    print('data emitted from server')


if __name__ == "__main__":
    print('[INFO] Starting server at http://localhost:5001')
    socketio.run(app=app,host='0.0.0.0',port=5001,debug=True)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)