参考: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之多线程读取视频及深度学习推理
相关推荐
压缩包中的TEST_RTMP文件可能包含了实现这一功能的示例代码,包括了从RTSP源读取、处理、并通过RTMP推流的完整流程。通过分析和学习这段代码,你可以更好地理解FFmpeg在处理流媒体时的内部工作原理,以及如何在实际...
本文将深入探讨如何从RTSP摄像头获取视频流,进行AI分析,然后将处理后的流推送到RTMP服务器。RTSP(Real-Time Streaming Protocol)是一种用于控制实时流媒体的协议,而RTMP(Real-Time Messaging Protocol)则是常...
综合以上,`opencv_rtsp_to_rtmp_class`项目为初学者提供了一个实践音视频处理、直播推流的好机会,涵盖了从数据采集、编码、传输到推流的关键技术,同时也展示了如何将这些技术封装和重构以构建高效、易用的代码。...
通过ffmpeg将OpenCV格式的帧数据推送到rtsp/rtmp/udp/udp广播视频流,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心下载使用~ 通过ffmpeg将OpenCV格式的帧数据推送到rtsp/rtmp/udp/udp广播...
项目实现了基于OpenCvSharp和WPF组件实现了摄像头或相机的读取,并在列表中显示出来并可以截图保存,还可以在画面中显示IP地址、绘制十字准星、ROI区域,还可对画面进行左右和上下的翻转,并且十字准星、ROI区域、...
OpenCV是一个强大的开源计算机视觉库,它被广泛用于图像处理和计算机视觉相关的任务。在本教程中,我们将探讨如何利用OpenCV的JAVA接口通过RTMP(Real-Time Messaging Protocol)和RTSP(Real-Time Streaming ...
在IT行业中,实时传输协议(RTSP)常用于视频流的传输,而OpenCV是一个强大的计算机视觉库,广泛应用于图像处理和视频分析。本项目利用OpenCV将RTSP流转换为MP4格式,使得视频可以在浏览器中直接播放,无需额外的...
本项目标题为“通过rtmp/rtsp,openCV进行人脸识别并截图,Java版本”,它结合了实时传输协议(RTMP)、实时流协议(RTSP)以及开源计算机视觉库OpenCV,用Java语言实现了一个简单的人脸识别和截图功能。下面将详细...
首先,OpenCV(开源计算机视觉库)是一个强大的工具,它提供了丰富的图像处理和计算机视觉功能,包括视频读取、图像分析、特征检测等。在本项目中,OpenCV用于从RTMP服务器拉取视频流,这是实时传输协议,常用于在线...
在构建实时流媒体系统时,"摄像头推流到rtmp"是一个常见的应用场景,尤其是在网络直播、在线教育或视频会议等领域。这个过程涉及到多个技术组件,包括摄像头数据获取、视频编码、流媒体协议以及服务器接收与分发。让...
在本项目中,Python用于读取、处理图像,并通过OpenCV的VideoWriter类将图像流推送到RTMP服务器,或者通过VideoCapture和VideoWriter类创建并运行RTSP服务器。 **关键代码点** 1. **读取和处理图像**:OpenCV的...
通过OpenCV框架,能够方便地拉取各种类型的视频数据流,如RTSP、RTMP等,并实时将视频数据传递给Qt界面进行显示。OpenCV底层使用了FFmpeg来完成视频处理,但我们无需过多关注底层细节,只需调用OpenCV提供的API即可...
2. RTMP服务器:Nginx搭建的RTMP服务器接收并处理推流。 3. 浏览器播放:利用Nginx的HLS模块或第三方JavaScript库在浏览器中实现播放。 4. OpenCV(Java版):可能用于摄像头预处理或流处理。 确保每个环节的正确...
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,提供了许多常用的图像处理功能。RTSP(Real Time Streaming Protocol)是一种网络控制协议,常用于控制音频和视频的流媒体...
在这个特定的项目中,“使用JavaCV开发的rtsp流转rtmp流并进行推流的流媒体服务”旨在实现从RTSP协议的视频流转换到RTMP协议的流,以便将视频数据推送到支持RTMP的流媒体服务器,如YouTube Live、Nginx RTMP模块或...
基于ffmpeg实现了解析rtsp视频为cv::Mat格式,此时可以对cv::Mat进行处理,然后再将cv::Mat数据推送到rtmp流媒体服务。处理、转码一条龙。另外,工程中关于OpenCV、ffmpeg的库和头文件的路径需要自己根据实际路径...
【rtsp2rtmp.zip】是一个包含JavaWeb推流技术的项目,主要目的是将RTSP视频流转换并封装成RTMP格式,然后推送到由Netty实现的RTMP服务器。这个压缩包中包含了多个文件,如`.gitignore`用于定义Git忽略的文件,`...
标题中的“采集并基于 rtsp 协议推流摄像头(麦克风)数据,并在 web 浏览器渲染”指的是一个项目,它涉及了实时流传输协议(RTSP)、摄像头和麦克风的数据采集以及在Web浏览器中展示这些实时流数据的技术。...
通过实时流协议 (RTSP) 使用 Yolo、OpenCV 和 Python 进行对象检测通过实时流协议 ( RTSP ) 使用 Yolo、OpenCV 和 Python 的深度学习进行对象检测识别出的对象按日期存储在每个类的文件夹中,以供进一步培训或人脸...
这篇文章主要介绍了python处理RSTP视频流过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python链接海康摄像头,并以弹出框的方式播放实时视频流, ...