近期在做用Django显示摄像头实时画面的需求,本文就大致聊一聊最近搜集到的相关资料。

基本上原理就是有一个中转服务器(比如Nginx),FFMPEGD推流,html拉流。那Django干啥?控制页面拉流。或者说python干啥?拉流。

还有一些是用opencv做推流的,但那些基本是在做视觉处理的或者画面处理的时候才用的,跟我的情况不符,我的情况是:延迟做到最低、最低...

我的环境:海康威视摄像头,Django后端做

一些关键内容:RTMP 、RTSP、hls 、FFMPEG 、nginx-rtmp服务器

目前总结了4种实现方案供参考

实现方案之:NGINX + FFMEPG

​ 方案多,网上教程一大堆

​ 延迟较高

延迟情况:

​ 5、6秒。延迟优化原理参考下方链接

基本原理:

​ FFMEPG把RTSP格式的视频流推到NGINX,NGINX再进行流的处理、转换。nginx做RTMP服务端

​ 参考链接:视频流多分辨率的处理https://www.jibing57.com/2020/08/01/advanced-configure-of-nginx-rtmp/

实现方案之:NGINX + FFMEPG + opencv

​ 能对画面做一些处理

​ 单用opencv处理时延迟基本在1、2秒内

​ 用管道传输流,不容易实现。

延迟情况:

​ 因报错问题,无结果

基本原理:

​ opencv读取摄像头,处理后用FFMPEG推流到Nginx服务器。django的html拉流。nginx做RTMP服务端

参考链接:

​ CSDN一大堆

实现方案之:opencv +Django

​ 实现过程简单

​ 无法关闭

延迟情况:

​ 在1,2秒内

基本原理:

​ opencv获取每一帧,然后通过流的HTTP流的方式传到前端。

参考链接:

https://www.coder.work/article/2084211

实现方案之:jsmpeg + FFMEPG + http中继

​ 不需要RTMP服务器(Nginx),解析靠js插件,RTSP流还是通过FFMEPG推,推到websocket频道

​ Django貌似无法做中继,暂时只能用ginrtsp做中继。可以尝试用opencv在django内部推到ws频道

延迟情况:

​ 1,2秒

基本原理:

​ 不做RTSP转RTMP,通过ws将流发布,前端通过jsmpeg解析。

参考链接:

​ JSMPEG: https://github.com/phoboslab/jsmpeg

​ http中继: https://github.com/wanghaoxi3000/gin-rtsp