参考:https://blog.csdn.net/u014303844/article/details/80394101
1 背景
在做图像处理任务时,一个很常见的需求就是读取网络相机rtsp码流做识别,可以抽帧检测,也可以一帧一帧检测,识别完毕后,再将处理过的图片串成视频流,在客户端进行显示。可在网页端显示的比较成熟的方案是rtmp流,因此,我们的方案是用opencv读取摄像头rtsp码流,图像处理之后,串成rtmp码流,在客户端显示
操作环境:Ubuntu 16.04 + python3
2 Nginx服务器搭建
因为要将处理过的图片串成rtmp码流,因此,需要搭建一个rtmp服务器,常用的方案是Nginx服务器。
安装依赖
sudo apt-get update sudo apt-get install openssl libssl-dev sudo apt-get install libpcre3 libpcre3-dev
编译源码
在工作空间下,新建一个nginx文件夹,用来存放需要下载nginx和nginx-rtmp-module两个安装包源码
nginx下载链接,这里我下载了1.8.1版本的源码,解压文件,生成nginx-1.8.1文件夹
在nginx目录下,下载nginx-rtmp-module
git clone https://github.com/arut/nginx-rtmp-module.git
然后编译安装nginx,cd进nginx的目录
cd nginx-1.8.1 ./configure --add-module=../nginx-rtmp-module make make install
经过上述默认配置安装后,nginx目录如下
nginx安装目录 /usr/local/nginx nginx配置目录 /usr/local/nginx/conf/nginx.conf nginx运行目录 /usr/local/nginx/sbin/nginx --options
测试nginx
进入安装目录/usr/local/nginx,运行以下命令
./sbin/nginx
在浏览器中输入localhost:8080(或者服务器的IP),看到如下画面,表示安装成功
配置rtmp
编辑/usr/local/nginx/conf/nginx.conf文件
#/usr/local/nginx/conf/nginx.conf
#注明:请勿直接覆盖原来的conf文件,这只是部分有关直播的内容
#配置RTMP,这个配置格式在github的readme上有详细说明
#/usr/local/nginx/conf/nginx.conf #注明:请勿直接覆盖原来的conf文件,这只是部分有关直播的内容 #配置RTMP,这个配置格式在github的readme上有详细说明 rtmp { server { listen 1935; #服务端口--默认 chunk_size 4096; #数据传输块的大小--默认 #设置直播的application名称是 mylive application mylive{ live on; #live on表示开启直播模式 } } } #请在http里面找到server http{ ...# 这里有一些其他的配置 server { listen 8080; server_name localhost; location / { root html; index index.html index.htm; } location /pop/video { alias /var/video; } location /info { rtmp_stat all; rtmp_stat_stylesheet stat.xsl; } location /stat.xsl { root html; } } }
配置完之后,需要重启nginx
sudo /usr/local/nginx/sbin/nginx -s reload
然后在浏览器中输入localhost:8080/info可看到如下画面
至此,完成了rtmp-nginx服务器的全部配置
3 推流代码
import cv2 import subprocess rtsp = "rtsp://admin:a12345678@10.10.8.101:554/h264/ch1/main/av_stream" rtmp = 'rtmp://localhost:1935/mylive/test' # 读取视频并获取属性 cap = cv2.VideoCapture(rtsp) size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))) sizeStr = str(size[0]) + 'x' + str(size[1]) command = ['ffmpeg', '-y', '-an', '-f', 'rawvideo', '-vcodec','rawvideo', '-pix_fmt', 'bgr24', '-s', sizeStr, '-r', '25', '-i', '-', '-c:v', 'libx264', '-pix_fmt', 'yuv420p', '-preset', 'ultrafast', '-f', 'flv', rtmp] pipe = subprocess.Popen(command , shell=False , stdin=subprocess.PIPE ) while cap.isOpened(): success,frame = cap.read() if success: ''' 对frame进行识别处理 ''' if cv2.waitKey(1) & 0xFF == ord('q'): break pipe.stdin.write(frame.tostring()) cap.release() pipe.terminate()
4 测试代码
运行上述代码,然后在nginx服务器上可查看推流情况
然后用VLC等客户端软件可查看推流视频
但实际测试中发现延时比较大,大概有8s的样子,还需做进一步优化
==================20191223更新====================
上述过程对图片推流rtmp的流程进行简单的总结,但还有一些细节性的问题没有解决,比如延时比较大、nginx.conf的配置方法等。
关于nginx的配置文件,直接参考官方说明
关于延时问题:我们处理图片时,一般处理速度跟不上原流速度,因此,如果在单线程里处理完图片再推流,会导致rtmp视频越来越大的延时,解决这个问题的方法就是将视频读取与处理放在两个线程里,照片处理后推流,然后再从视频流中取最新的帧处理,这样就会有效解决延时大的问题。
具体实现可参考:
读取多个(海康\大华)网络摄像头的视频流 (使用opencv-python),解决实时读取延迟问题
python利用ffmpeg进行rtmp推流直播
TX2之多线程读取视频及深度学习推理
相关推荐
opencv可通过rtmp/rtsp获取视频流人脸识别与并截图,JAVA版本
FFmpeg编解码 音视频 RTMP RTSP opencv 直播 推流 初学者实用
cap = cv2.VideoCapture(rtsp://admin:12345@192.168.1.64/main/Channels/1) print (cap.isOpened()) while cap.isOpened(): success,frame = cap.read() cv2.imshow(frame,frame) cv2.waitKey(1) 获取回
用opencv处理RTSP视频流,其中视频流的采集用libvlc库 VLC播放函数封装成一个类,可以直接使用
VS2013,代码齐全,rtsp采集网络摄像机以后向流媒体服务器推流,vlc拉流。
opencv拉流yolov5推理-deepsort追踪-rtmp ffmpeg推流 人车流统计计数
C# OpenCvSharp 读取rtsp流.rar 完整Demo,可直接运行 博客地址: https://blog.csdn.net/lw112190/article/details/132169630
输入源:opencv摄像头采集,或者本地视频以及网络摄像头 输出:推流到nginx+rtmp服务器
C# OpenCvSharp读取rtsp流录制mp4.rar C# OpenCvSharp读取rtsp流录制mp4 截图 完整Demo,可直接运行 博客地址: https://blog.csdn.net/lw112190/article/details/132203744
减少openCv打开rtsp摄像头延时问题
推流到rtmp,使用opencv摄像头输入,FFMPEG编码,推流到nginx-RTMP服务器,形成直播系统,opencv处理图像很强,可以方便加入各种特效。
只要要用c#写个rtmp播放器,苦苦找不到资源,c#播放 RTMP,RTSP流媒体等源代码,特此分享,希望能帮助大家
这是一个VS2017工程,可以直接编译运行。实现了利用OpenCV来实时播放RTSP视频流,并能过够截取图片保存为文件。为了不影响RTSP视频流的获取与播放,图片的保存在另一个线程里实现。
opencv 将rtsp流 转成MP4,浏览器可直接播放
几何操作,图像处理,直方图,阈值分割,边缘检测,轮廓检测,霍夫变换,角点检测
FFMPEG/OpenCV实现RTSP码流解码显示的程序V2.0(可工程应用) 解压密码:ezhchai 使用说明 1.采用FFMPEG实现解码,利用OpenCV进行显示,海康威视摄像机10小时稳定测试,可工程应用,同时提供Debug和Release版本; 2....
OpenCV+C++图像处理设计-遥感图像配准系统源码
VS2008编译,opencv2.4.1打开rtsp视频流并显示视频,里面包含opencv的lib、dll以及头文件,包含了完整的工程。可以编译,也可以直接运行编译好的exe
OpenCV图像流带有OpenCV图像的rtmp和rtsp视频流(python) rtmp:将opencv图像垫推到rtmp服务器rtsp:使用opencv图像垫启动rtsp服务器