Python利用VideoCapture和FFmpeg读取多个rtsp流性能的比较

最近一个项目,要用python读取30个海康摄像头的rtsp流,一开始直接用cv2.VideoCapture(video_path),结果运行一段时间后发现读出来的frame经常出现花屏的现象。所以通过两种方式对程序进行了修改。

1、我先是通过cap.set(cv2.CAP_PROP_BUFFERSIZE, 3)设置缓冲区大小可能有助于减少丢帧现象。代码如下:

import cv2  # 导入 OpenCV 库,用于处理计算机视觉和视频流相关的功能。# 设置 RTSP 视频流的路径(用户名、密码、IP 地址和视频流的 URL)。
video_path = 'rtsp://admin:123456@192.168.3.101/Streaming/Channels/1'# 使用 cv2.VideoCapture 打开 RTSP 视频流,cap 是一个视频捕获对象。
cap = cv2.VideoCapture(video_path)# 设置视频流缓冲区的大小,减少延迟,CAP_PROP_BUFFERSIZE 设置为 3 表示缓冲区大小为 3 帧。
cap.set(cv2.CAP_PROP_BUFFERSIZE, 3)# 检查视频流是否成功打开并且继续读取帧。cap.isOpened() 返回 True 表示视频流打开成功。
while cap.isOpened():# 读取视频流中的一帧。返回值 success 表示读取是否成功,frame 为读取到的图像帧。success, frame = cap.read()# 如果成功读取到帧,则显示该帧。if success:# 使用 OpenCV 显示读取到的视频帧,"SHOW" 为窗口名称,frame 为图像数据。cv2.imshow("SHOW", frame)# 等待 1 毫秒,检测按键。如果按下 'q' 键,则退出循环。if cv2.waitKey(1) & 0xFF == ord("q"):break  # 按下 'q' 键退出循环,关闭视频流。

2、然后我又尝试用FFmpeg直接处理RTSP流。

首先要安装ffmpeg,执行命令:

pip install ffmpeg-python

python代码如下:

import ffmpeg  # 导入 ffmpeg 库,用于处理视频流(如 RTSP 流)。
import numpy as np  # 导入 NumPy 库,用于处理数据(如视频帧的数组操作)。
import cv2  # 导入 OpenCV 库,用于处理计算机视觉相关的功能(如显示视频)。# 设置摄像头的 RTSP 流地址(用户名、密码、IP 地址和视频流的 URL)。
camera = 'rtsp://admin:123456@192.168.3.101/Streaming/Channels/1'# 使用 ffmpeg.probe 函数探测摄像头的视频流信息,返回一个包含流信息的字典。
probe = ffmpeg.probe(camera)# 从探测结果中找到视频流(选择 codec_type 为 'video' 的流)。
video_stream = next((stream for stream in probe['streams'] if stream['codec_type'] == 'video'), None)# 获取视频流的宽度和高度,并将其转换为整数类型。
width = int(video_stream['width'])
height = int(video_stream['height'])# 使用 ffmpeg 创建一个异步运行的命令,将视频流传输到管道中,并指定格式、像素格式、帧率等。
out = (ffmpeg.input(camera, rtsp_transport='tcp')  # 设置输入源为摄像头 RTSP 流,并指定使用 TCP 协议。.output('pipe:', format='rawvideo', pix_fmt='bgr24', loglevel="quiet", r=25)  # 输出到管道,指定原始视频格式,像素格式为 BGR24,帧率为 25 帧每秒。.run_async(pipe_stdout=True)  # 异步运行 ffmpeg,并将标准输出连接到管道。
)# 初始化空帧计数器,检测视频流是否断开。
cnt_empty = 0# 无限循环,持续读取视频流并处理每一帧。
while True:# 从管道读取一帧数据,每帧的大小为 height * width * 3(3 为每个像素的 RGB 通道)。in_bytes = out.stdout.read(height * width * 3)# 如果没有读取到数据(即视频流结束或出现错误),则增加空帧计数器。if not in_bytes:cnt_empty += 1# 如果连续 10 次没有数据,则认为视频流已结束,跳出循环。if cnt_empty > 10:break# 如果有数据,重置空帧计数器。cnt_empty = 0# 将读取到的字节数据转换为 NumPy 数组,并重新塑形为图像帧(height, width, 3 表示高、宽、RGB 三通道)。frame = np.frombuffer(in_bytes, dtype=np.uint8).reshape(height, width, 3)# 使用 OpenCV 显示视频帧(此时 frame 是图像数据)。cv2.imshow('test', frame)# 等待按键,如果按下 'q' 键则退出循环。if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放资源(在程序退出时关闭 OpenCV 的窗口等资源)。
cv2.destroyAllWindows()

3、结论:
由于时间关系,我没用数据详细比较。直观感觉,只接入一两个摄像头,两种方式没什么区别,但是当摄像头很多并且分辨率和帧率都比较高时,FFmpeg延迟相对更低,性能表现好一些。下面这个表是网上找的,仅供参考。
 

特性cv2.VideoCapture (FFmpeg via OpenCV)FFmpeg (命令行或库调用)
简便性高,简洁的 API,直接使用 cv2.VideoCapture较低,需手动设置 FFmpeg 参数
性能依赖于 FFmpeg,适合一般应用,但可能有延迟通常更高效,低延迟,优化过的解码器
灵活性灵活性较低,只能使用 OpenCV 提供的功能高,可以精细控制流媒体传输、解码等
适用场景普通的视频捕获和播放,实时性要求不高需要低延迟、高性能和灵活控制的场景
库依赖基6于 FFmpeg,但封装在 OpenCV 中直接使用 FFmpeg

效率:FFmpeg 直接处理 RTSP 视频流的效率通常更高,尤其是在高帧率、低延迟的要求下,FFmpeg 的解码性能通常更好。
简便性:如果你只是想简化代码并快速实现功能,cv2.VideoCapture 会更方便。但它依赖于 OpenCV 和 FFmpeg 的封装,可能无法像直接使用 FFmpeg 那样精细调整解码行为。
建议:如果你的应用对实时性、低延迟和高性能有较高要求,尤其是在需要处理高帧率视频流的情况下,直接使用 FFmpeg 会更好。如果你需要快速开发并且不在乎一些细节的优化,使用 cv2.VideoCapture 会是一个简单方便的选择。

芝加哥时间深夜2点,休息了,晚安。
 

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

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

相关文章

金蝶云星空k3cloud webapi报“java.lang.Class cannot be cast to java.lang.String”的错误

最近在对接金蝶云星空k3cloud webapi时,报一个莫名其妙的转换异常,具体如下: 同步部门异常! ERP接口登录异常:java.lang.Class cannot be cast to java.lang.String at com.jkwms.k3cloudSyn.service.basics.DeptK3CloudService.…

html的字符实体和颜色表示

在HTML中,颜色可以通过以下几种方式表示,以下是具体的示例: 1. 十六进制颜色代码 十六进制颜色代码以#开头,后面跟随6个字符,每两个字符分别表示红色、绿色和蓝色的强度。例如: • #FF0000:纯红…

老游戏回顾:G2

一个老的RPG游戏。 剧情有独到之处。 ------- 遥远的过去,古拉纳斯将希望之光给予人们,人类令希望之光不断扩大,将繁荣握在手中。 但是,暗之恶魔巴鲁玛将光从人类身上夺走。古拉纳斯为了守护人类与其展开了一场激战&#xff0c…

E4982A,keysight是德科技台式LCR表

是德科技keysightE4982A台式LCR表 是德KEYSIGHT的精密型LCR表E4982A,针对SMD电感器、EMI滤波器等无源元器件的制造测试展现出卓越性能,特别适用于1 MHz至3 GHz高频率范围内的阻抗测试。此外,E4982A还广泛应用于研发领域,凭借其强…

C++, STL容器 array:固定大小数组深度解析

文章目录 引言一、设计哲学与底层实现1.1 零抽象成本的封装1.2 性能特征二、内存优化实践2.1 缓存友好性对比2.2 内存碎片防护三、高级内存管理技巧3.1 精准内存对齐3.2 内存复用模式四、工程实践指南4.1 适用场景4.2 陷阱规避五、未来演进结语引言 在C++标准库中,std::array…

013-51单片机红外遥控器模拟控制空调,自动制冷制热定时开关

主要功能是通过红外遥控器模拟控制空调,可以实现根据环境温度制冷和制热,能够通过遥控器设定温度,可以定时开关空调。 1.硬件介绍 硬件是我自己设计的一个通用的51单片机开发平台,可以根据需要自行焊接模块,这是用立创…

(苍穹外卖)项目结构

苍穹外卖项目结构 后端工程基于 maven 进行项目构建,并且进行分模块开发。 1). 用 IDEA 打开初始工程,了解项目的整体结构: 对工程的每个模块作用说明: 序号名称说明1sky-take-outmaven父工程,统一管理依赖版本&…

车载以太网__传输层

车载以太网中,传输层和实际用的互联网相差无几。本篇文章对传输层中的IP进行介绍 目录 什么是IP? IP和MAC的关系 IP地址分类 私有IP NAT DHCP 为什么要防火墙穿透? 广播 本地广播 直接广播 本地广播VS直接广播 组播 …

UE5 蓝图学习计划 - Day 12:存储与加载

在游戏开发中,存储(Save)与加载(Load) 系统至关重要,玩家需要能够保存游戏进度、角色状态、道具数据等信息,并在下次启动游戏时恢复它们。UE5 提供了 SaveGame 蓝图类,帮助开发者快速…

web-文件上传-CTFHub

前言 在众多的CTF平台当中,作者认为CTFHub对于初学者来说,是入门平台的不二之选。CTFHub通过自己独特的技能树模块,可以帮助初学者来快速入门。具体请看官方介绍:CTFHub。 作者更新了CTFHub系列,希望小伙伴们多多支持…

OpenAI 实战进阶教程 - 第四节: 结合 Web 服务:构建 Flask API 网关

目标 学习将 OpenAI 接入 Web 应用,构建交互式 API 网关理解 Flask 框架的基本用法实现 GPT 模型的 API 集成并返回结果 内容与实操 一、环境准备 安装必要依赖: 打开终端或命令行,执行以下命令安装 Flask 和 OpenAI SDK: pip i…

【Elasticsearch】nested聚合

在 Elasticsearch 中,嵌套聚合(nestedaggregation)的语法形式用于对嵌套字段(nestedfields)进行聚合操作。嵌套字段是 Elasticsearch 中的一种特殊字段类型,用于存储数组中的对象,这些对象需要独…

基于Qt的Ribbon界面框架

推荐一套基于Qt的Ribbon风格的界面框架,SARibbon。 Ribbon风格较传统的软件风格(菜单栏,工具栏)相比,具有直观性,高校性等优点,可以快速的找到所需工具,减少使用次数。微软的office…

【deepseek实战】绿色好用,不断网

前言 最佳deepseek火热网络,我也开发一款windows的电脑端,接入了deepseek,基本是复刻了网页端,还加入一些特色功能。 助力国内AI,发出自己的热量 说一下开发过程和内容的使用吧。 目录 一、介绍 二、具体工作 1.1、引…

C语言:函数栈帧的创建和销毁

目录 1.什么是函数栈帧2.理解函数栈帧能解决什么问题3.函数栈帧的创建和销毁的过程解析3.1 什么是栈3.2 认识相关寄存器和汇编指令3.3 解析函数栈帧的创建和销毁过程3.3.1 准备环境3.3.2 函数的调用堆栈3.3.3 转到反汇编3.3.4 函数栈帧的创建和销毁 1.什么是函数栈帧 在写C语言…

基于RTOS的STM32游戏机

1.游戏机的主要功能 所有游戏都来着B站JL单片机博主开源 这款游戏机具备存档与继续游戏功能,允许玩家在任何时候退出当前游戏并保存进度,以便日后随时并继续之前的冒险。不仅如此,游戏机还支持多任务处理,玩家可以在退出当前游戏…

ONLYOFFICE 文档 8.3 已发布:PDF 图章、合并形状、更多格式支持等

ONLYOFFICE 最新版本的在线编辑器已发布,包含约 30 项新功能和多个错误修复。阅读本文,了解所有更新内容。 关于 ONLYOFFICE 文档 ONLYOFFICE 是一个开源项目,专注于高级和安全的文档处理。坐拥全球超过 1500 万用户,ONLYOFFICE …

第二次连接k8s平台注意事项

第二次重新打开集群平台 1.三台机子要在VMware打开 2.MobaBXterm连接Session 3.三个机子docker重启 systemctl restart docker4.主节点进行平台链接 docker pull kubeoperator/kubepi-server[rootnode1 home]# docker pull kubeoperator/kubepi-server [rootnode1 home]# # 运…

通过多层混合MTL结构提升股票市场预测的准确性,R²最高为0.98

“Boosting the Accuracy of Stock Market Prediction via Multi-Layer Hybrid MTL Structure” 论文地址:https://arxiv.org/pdf/2501.09760 ​​​​​​​ 摘要 本研究引入了一种创新的多层次混合多任务学习架构,致力于提升股市预测的效能。此架构融…

结合深度学习、自然语言处理(NLP)与多准则决策的三阶段技术框架,旨在实现从消费者情感分析到个性化决策

针对电商个性化推荐场景的集成机器学习和稳健优化三阶段方案。 第一阶段:在线评论数据处理,利用深度学习和自然语言处理技术进行特征挖掘,进而进行消费者情感分析,得到消费者偏好 在第一阶段,我们主要关注如何通过深度学习和自然语…