近期在做用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