网页上的实时视频编码和流媒体

时间:2016-03-08 23:56:57

标签: python video ffmpeg video-streaming http-live-streaming

我正在尝试在网页上显示实时网络摄像头视频流,并且我有一份工作草案。但是,我对表现并不满意,并寻找更好的方式来完成这项工作。

我有一个连接到Raspberry PI的网络摄像头和一个简单的python-Flask服务器的Web服务器。使用OpenCV捕获网络摄像头图像并格式化为JPEG。之后,这些JPEG将被发送到服务器的一个UDP端口。到目前为止我所做的就像是自制的MJPEG(运动jpeg)流式传输。

在服务器端,我有一个简单的python脚本,它连续读取UDP端口并将JPEG图像放在HTML5画布中。这足以创建对直播的感知。

问题:

  • 这很少压缩视频。实际上它不压缩视频。它只通过格式化为JPEG来减小帧的大小。

  • FPS很低,而且流的质量也不好。

  • 目前不是主要观点,但UDP并不是一种流媒体视频的安全方式。

  • 服务器正忙于从UDP中挑选图像。需要线程服务器设计。

备选方案:

  • 我之前使用过FFMPEG来转换视频格式,也可以预先录制视频。我想,有可能使用ffmpeg或avconv进行编码(比如H.264)和流媒体WebCam直播视频。 (编码)
  

这适用于Raspberry PI吗?

  • VLC能够播放在网络上流式传输的实时视频。 (流)
  

是否有任何Media Player可以嵌入HTML / Javascript来处理   像VLC那样的网络流呢?

  • 我读过有关HLS(HTTP直播)和MPEG-DASH的内容。
  

这些是否适用于此案例?如果是的话,我应该如何使用它们?

     

有没有其他方法可以在网页上显示直播流?

  • RTSP是一种安全协议。
  

视频中传输层协议的最佳做法是什么?   流媒体?

2 个答案:

答案 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视频元素中使用。