使用Flask进行YUV直播视频流

时间:2016-02-16 21:04:20

标签: python flask live-streaming yuv

我目前正在开展一项涉及使用Raspberry Pi的小型机器人汽车的项目。为了有效地使用picamera(用于图像处理和实时网络流),我想使用YUV420格式(由picamera支持)。这允许我直接使用Y值进行图像处理,并将任何进一步的转换留给客户端。

是否可以通过Flask Response对象快速传输此数组(使用Python生成器)(如此处显示为JPEG:http://blog.miguelgrinberg.com/post/video-streaming-with-flask)?如果是这样,我知道我可以在JavaScript中将YUV数据转换为RGB,然后将其绘制到画布,但是如何一次一帧地访问YUV流?

如果还有其他更有效的解决方案(同时坚持使用Flask),我也想听听它们。使用Python生成器的Flask Response就像JPEG网络流的魅力一样。

1 个答案:

答案 0 :(得分:0)

查看the picamera documentationthe blog post you've linked,您可以创建一个多部分响应,其中包含从相机捕获的YUV420帧流,其代码如下:

def gen():
    with picamera.PiCamera() as camera:
      camera.start_preview()
      # Camera warm-up time
      time.sleep(2)

      while True:
        stream = io.BytesIO()
        camera.capture(stream, 'yuv')
        yield stream.getvalue()
        #perhaps add a time.sleep() here to enforce a constant framerate?

然而,这并未涉及客户端。因为您想在JavaScript中使用图像数据,而不是仅仅在<img>标记中显示它,您需要使用XMLHTTPRequest从JavaScript中获取它,而XMLHTTPRequest不支持多部分响应(特别是Firefox { {3}})。

更好的方法是使用used to and no longer does,从那时起WebSocket很容易,依次读取每个帧(每个帧都在自己的WebSocket消息中发送),并执行必要的操作图像处理。但是服务器端怎么样? open a WebSocket connection from JavaScript看起来它会起作用,然后发送帧流看起来像这样:

@sockets.route('/stream')
def stream_socket(ws):
    with picamera.PiCamera() as camera:
      camera.start_preview()
      # Camera warm-up time
      time.sleep(2)

      while not ws.closed:
        stream = io.BytesIO()
        camera.capture(stream, 'yuv')
        ws.send(stream.getvalue())
        #perhaps add a time.sleep() here to enforce a constant framerate?