opencv读取rtsp图像处理后推流rtmp

博客介绍了在图像处理任务中,将处理后的图片串成rtmp码流在客户端显示的方案。详细说明了在Ubuntu 16.04 + python3环境下搭建Nginx服务器的步骤,包括安装依赖、编译源码、测试和配置rtmp。还给出推流和测试代码,针对延时大问题提出解决办法,并推荐了一个流媒体开源项目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考: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
sudo apt-get install zlib1g-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
sudo 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上有详细说明

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服务器的全部配置

===============20201204更新====================

楼下很多同学反映打不开这个info页面,原因是nginx没找到stat.xsl文件,你需要在 location /stat.xsl 中指定 root 路径,即你的 stat.xsl 文件的路径

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之多线程读取视频及深度学习推理

 ==================20201215更新====================

了解到一个更好的流媒体开源项目,是中国人写的,项目地址 https://github.com/ossrs/srs,有兴趣的可以尝试下

评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宗而研之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值