关于摄像头推流拉流的一些内容

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