我正在尝试在网页上显示实时网络摄像头视频流,并且我有一份工作草案。但是,我对表现并不满意,并寻找更好的方式来完成这项工作。
我有一个连接到Raspberry PI的网络摄像头和一个简单的python-Flask服务器的Web服务器。使用OpenCV捕获网络摄像头图像并格式化为JPEG。之后,这些JPEG将被发送到服务器的一个UDP端口。到目前为止我所做的就像是自制的MJPEG(运动jpeg)流式传输。
在服务器端,我有一个简单的python脚本,它连续读取UDP端口并将JPEG图像放在HTML5画布中。这足以创建对直播的感知。
问题:
这很少压缩视频。实际上它不压缩视频。它只通过格式化为JPEG来减小帧的大小。
FPS很低,而且流的质量也不好。
目前不是主要观点,但UDP并不是一种流媒体视频的安全方式。
服务器正忙于从UDP中挑选图像。需要线程服务器设计。
备选方案:
这适用于Raspberry PI吗?
是否有任何Media Player可以嵌入HTML / Javascript来处理 像VLC那样的网络流呢?
这些是否适用于此案例?如果是的话,我应该如何使用它们?
有没有其他方法可以在网页上显示直播流?
视频中传输层协议的最佳做法是什么? 流媒体?
答案 0 :(得分:2)
我会尝试回答你列出的许多问题"问题"我可以:
FPS很低,而且流的质量也不是那么好。
由于您使用的是Flask,因此您可以使用功能强大的url_for
关键字将流式帧直接显示在img标记中。以下是如何实现这一点:
在网页上,将<img src="{{url_for('video_feed')}}"
添加到您希望对您的Feed进行流式传输的位置
在后端,执行以下操作:
def gen(camera):
frame = camera.read()
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
@app.route('/video_feed')
def video_feed():
return Response(gen(), mimetype='multipart/x-mixed-replace; boundary=frame')
现在,img标签将显示端点video_feed
上存在的图像,该图像是multipart类型。因此,在您的情况下,它会不断要求更新的部件(更新的框架)
我发现这种方法非常快!
致谢:Miguel Grinberg's blog post
现在不是主要观点,但UDP并不是一种流媒体视频的安全方式。
大多数视频流设备不对其流式传输的视频进行加密,因为这样做的计算成本很高。因此,虽然您可能通过HTTPS连接到设备上的嵌入式Web服务器,并且您可能必须登录设备来控制它,但所有安全性仅限于“控制平面”。视频本身几乎肯定会以未加密的方式传输。如果它符合开放标准,则可能通过RTP / RTSP或HTTP Live Streaming(HLS)发送。
来源:Thoughts on Streaming Videos Securely
服务器正忙于从UDP中挑选图像。需要线程服务器设计。
使用上述方法,即使在流式传输视频时,我也能够与服务器进行交互。使用Flask开发Web服务器,您可以将threaded=True
添加到app.run()
电话,或--with-threads
(如果您使用Flask CLI)。
您还可以将 Gunicorn 与 gevent 或 eventlet 结合使用,以进一步控制您的主题。
答案 1 :(得分:0)
您可以使用FFmpeg将视频流复制到mp4容器中的H.264,然后可以直接在HTML5视频元素中使用。