当前位置: 首页 > news >正文

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视频流。
代码运行时的输入如下所示
在这里插入图片描述

相关文章:

  • Games104 听后笔记
  • 利用python搭建临时文件传输服务
  • 《自动机理论、语言和计算导论》阅读笔记:p5-p27
  • Microsoft Word 快捷键 (keyboard shortcut - hotkey)
  • C# 高级文件操作与异步编程探索(初步)
  • 计算机组成原理 — 指令系统
  • AI颠覆,倒计时
  • Wagtail-基于Python Django的内容管理系统CMS实现公网访问
  • iOS客户端自动化UI自动化airtest+appium从0到1搭建macos+脚本设计demo演示+全网最全最详细保姆级有步骤有图
  • dockers compose up 报no configuration file provided: not found
  • 【Bug-ModuleNotFoundError: No module named ‘models‘】
  • Android Databinding 使用教程
  • SQLite数据库文件损坏的可能几种情况(一)
  • 指针数组的有趣程序【C语言】
  • EasyExcel Converter实现java对象和excel单元格转换
  • [译]Python中的类属性与实例属性的区别
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Facebook AccountKit 接入的坑点
  • FastReport在线报表设计器工作原理
  • HTTP中的ETag在移动客户端的应用
  • Kibana配置logstash,报表一体化
  • PermissionScope Swift4 兼容问题
  • Theano - 导数
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Vue实战(四)登录/注册页的实现
  • 给github项目添加CI badge
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 判断客户端类型,Android,iOS,PC
  • 深入浏览器事件循环的本质
  • 使用API自动生成工具优化前端工作流
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 一些css基础学习笔记
  • mysql面试题分组并合并列
  • 通过调用文摘列表API获取文摘
  • ​HTTP与HTTPS:网络通信的安全卫士
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #laravel 通过手动安装依赖PHPExcel#
  • #每天一道面试题# 什么是MySQL的回表查询
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (13):Silverlight 2 数据与通信之WebRequest
  • (4)STL算法之比较
  • (JS基础)String 类型
  • (二)JAVA使用POI操作excel
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)EOS中账户、钱包和密钥的关系
  • (转载)从 Java 代码到 Java 堆
  • .Family_物联网
  • .gitattributes 文件
  • .NET Core引入性能分析引导优化
  • .net6 webapi log4net完整配置使用流程
  • @media screen 针对不同移动设备
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [20181219]script使用小技巧.txt