使用子进程在 Flask 中传输数据

问题描述 投票:0回答:1

所以,基本上我正在制作一个网络流媒体服务,并且我使用 opencv 和 Flask 在浏览器中流式传输网络摄像头视频:

def gen(camera):
    frame  = camera.get_frame()
    yield (b'--frame\r\n'
           b'Content-Type: image/jpeg\r\n\r\n' + frame.tobytes() + b'\r\n')

@app.route('/video_feed')
def video_feed():
    return Response(gen(Camera()),
                mimetype='multipart/x-mixed-replace; boundary=frame')

这工作正常。现在,当用户查看网络摄像头(比如说面部点)时,我会生成一个数据流。我想使用子进程将此数据流式传输到浏览器。这是我到目前为止所写的:

服务器端

@app.route('/yield')
def conso():
    def inner():
        proc = subprocess.Popen(                 # where L is the stream of data
        L,            
        shell=True,
        stdout=subprocess.PIPE
    )

    for line in iter(proc.stdout.readline,''):
        time.sleep(1)                         
        yield ( line.rstrip() + b'\r\n')

return Response(inner(), mimetype='text/event-stream') 

客户端

<script>
if (!!window.EventSource) {
  var source = new EventSource('/yield');
  source.onmessage = function(e) {
  $("#data").text(e.data);
  }
 }
</script>
<div id="data">nothing received yet</div>

但是无法传输任何数据。它也没有给出任何错误。有人可以帮我确定问题出在哪里吗?

python multithreading flask subprocess
1个回答
0
投票

我曾经处理过这样的问题,那就是 $(#data) 选择器不起作用,您可以尝试使用 document.getElementById 来测试是否可以解决问题:

    <script type='text/javascript'>
        var source = new EventSource('/yield');
        source.onmessage = function(event) {
           document.getElementById("result").innerHTML += event.data + '<br>';
        };
    </script>
© www.soinside.com 2019 - 2024. All rights reserved.