opencv 十九 python下实现多线程间rtsp直播流的复用

在多线程拉流的任务场景中,有时需要将一个rtsp拉取多次,每重新打开一次rtsp视频流就要多消耗一次带宽,为此基于类的静态对象实现rtsp视频流的复用。

1、实现代码

import threading
import cv2,time
#接收摄影机串流影像,采用多线程的方式,采用锁的方式进行实现
class VideoCaptureBase:def __init__(self, URL):self.URL = URLself.lifetime=1self.isstop = Falseself.lock = threading.RLock()self.data=(None,None)# 摄影机连接。self.capture = cv2.VideoCapture(self.URL, cv2.CAP_FFMPEG, [cv2.CAP_PROP_HW_ACCELERATION, cv2.VIDEO_ACCELERATION_ANY])threading.Thread(target=self.readframe, daemon=True, args=()).start()print('VideoCapture started!  %s'%self.URL)def release(self):# 记得要设计停止无限循环的开关。self.lifetime-=1if self.lifetime==0:self.isstop = Trueprint('VideoCapture stopped!   %s'%self.URL)else:print('VideoCapture   self.lifetime=%s'%self.lifetime)def read(self):self.lock.acquire()d=self.dataself.lock.release()return d#进行实时数据读取def readframe(self):while (not self.isstop):ok, frame = self.capture.read()   if ok:self.lock.acquire()self.data=(ok, frame)self.lock.release()else:time.sleep(0.2)self.capture = cv2.VideoCapture(self.URL) #掉线重连self.capture.release()class VideoCapture:CapList=[]def __init__(self, URL):self.URL=URLinlist=Falseprint(self.URL,'CapList.length:=====>',len(VideoCapture.CapList))for i in range(len(VideoCapture.CapList)):cap=VideoCapture.CapList[i]print(i,cap.URL,self.URL,cap.URL==self.URL)if cap.URL==self.URL:cap.lifetime+=1 # 存活计数器+1inlist=Trueprint('use exit rtsp stream!!!!')if not inlist:cap=VideoCaptureBase(self.URL)VideoCapture.CapList.append(cap)print('CapList.length:=====>',len(VideoCapture.CapList),self.URL)def read(self):for cap in VideoCapture.CapList:if cap.URL==self.URL:return cap.read()def release(self):for cap in VideoCapture.CapList:if cap.URL==self.URL:cap.release() # 存活计数器-1,当计数器为0时断开流if __name__ == '__main__':path="rtmp://rtmp.rtc.qq.com/pull/19"cap = VideoCapture(path)time.sleep(5)cap2 = VideoCapture(path)time.sleep(5)cap3 = VideoCapture(path)cap2.release()time.sleep(3)cap3.release()while True:ok, frame = cap.read()if cv2.waitKey(1) & 0xFF == ord('q'):breakif not ok:continuecv2.imshow("cam", frame)cap.release()cv2.destroyAllWindows()

3、使用说明

使用代码如下所示,与cv2.VideoCapture是一模一样的用法,具备0缓存,自动断线重连的特点;同时在多线程同时打开一个rtsp流地址的情况下,可以只打开一次rtsp视频流。
代码运行时的输入如下所示
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/575864.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前后端分离开发【Yapi平台】【Swagger注解自动生成接口文档平台】

前后端分离开发 介绍开发流程Yapi(api接口文档编写平台)介绍 Swagger使用方式1). 导入knife4j的maven坐标2). 导入knife4j相关配置类3). 设置静态资源映射4). 在LoginCheckFilter中设置不需要处理的请求路径 查看接口文档常用注解注解介绍 当前项目中&am…

MATLAB:优化与规划问题

一、线性规划 % 线性规划(Linear programming, 简称LP) fcoff -[75 120 90 105]; % 目标函数系数向量 A [9 4 7 54 5 6 105 10 8 53 8 9 77 6 4 8]; % 约束不等式系数矩阵 b [3600 2900 3000 2800 2200]; % 约束不等式右端向量 Aeq []; % 约束等式系…

docker:在ubuntu中运行docker容器

前言 1 本笔记本电脑运行的ubuntu20.04系统 2 docker运行在ubuntu20.04系统 3 docker镜像使用的是ubuntu18.04,这样拉的 docker pull ubuntu:18.04 4 docker容器中运行的是ubuntu18.04的系统,嗯就是严谨 5 这纯粹是学习笔记,实际上没啥价值。…

【spring】AbstractApplicationContext 的refresh() 方法学习

上一篇我们一起学习了【spring】FileSystemXmlApplicationContext 类学习 AbstractApplicationContext 的refresh() 方法介绍 AbstractApplicationContext的refresh()方法仍然是整个Spring应用程序上下文初始化的核心流程入口。大体上的刷新生命周期依然保持一致。 refresh(…

每日一练:LeeCode-48、旋转图像【二维数组+行列交换】

给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出…

Java认识泛型类

一、包装类 认识泛型类之前先来认识一下包装类 1、基本数据类型和对应的包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。 除了 Integer 和 Character&#xff0…

学点Java_Day12_JDBC

1 JDBC 面向接口编程 在JDBC里面Java这个公司只是提供了一套接口Connection、Statement、ResultSet,每个数据库厂商实现了这套接口,例如MySql公司实现了:MySql驱动程序里面实现了这套接口,Java程序员只要调用实现了这些方法就可以…

自动化测试 —— Pytest fixture及conftest详解

前言 fixture是在测试函数运行前后,由pytest执行的外壳函数。fixture中的代码可以定制,满足多变的测试需求,包括定义传入测试中的数据集、配置测试前系统的初始状态、为批量测试提供数据源等等。fixture是pytest的精髓所在,类似u…

智能设备控制概念及方式详解

设备控制 随着物联网设备的普及,如何让用户或者企业安全、灵活地控制和管理设备变得更加重要。因此,便有了设备控制、群组管理、智能场景、多控关联、定时任务等概念。本文主要讲解移动端应用涉及的物联网设备控制相关概念及方式方法。 在以往简单的应…

快速上手Spring Cloud 十五:与人工智能的智慧交融

快速上手Spring Cloud 一:Spring Cloud 简介 快速上手Spring Cloud 二:核心组件解析 快速上手Spring Cloud 三:API网关深入探索与实战应用 快速上手Spring Cloud 四:微服务治理与安全 快速上手Spring Cloud 五:Spring …

专题:一个自制代码生成器(嵌入式脚本语言)之应用实例

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 专题:一个自制代码…

HTTP

HTTP 概念:HyperTextTransferProtocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则 HTTP协议特点: 1.基于TCP协议:面向连接,安全 2.基于请求-响应模型的:一次请求对应一次响应 …