【流媒体】 通过ffmpeg硬解码拉流RTSP并播放
简介
目前RTSP拉流是网络摄像头获取图片数据常用的方法,但通过CPU软解码的方式不仅延时高且十分占用资源,本文提供了一种从网络摄像头RTSP硬解码的拉流的方法,并且提供python代码以便从网络摄像头获取图片进行后续算法处理。
下载ffmpeg
Ffmpeg下载链接。建议下载稳定版本。
图1
这里会出现三个版本:
- essentials:必要的组件,东西可能不全。
- full:全面的,里面的库文件比较全。
- shared:有动态链接库。
通过版本号命名的为稳定版,日期命名的为最新版。仅是使用的话essentials即可,Qt等调库需要选择shared。
图2
图3
复制如图所示的bin文件地址,设置环境变量。
右击此电脑打开属性
图4
图5
图6
图7
按照图4~7将复制的bin文件环境变量路径添加进去。
测试FFmpeg
运行命令
ffmpeg -version
显示以上信息则安装完成。
ffplay拉流显示
ffplay rtsp://XXXXXXX/stream
使用ffplay即可拉流成功,但是为软解码,拉流延时较高。
使用ffmpeg硬解码并保存视频
首先查看支持的硬件
ffmpeg -hwaccels
如果是nvidia的显卡并安装的对应驱动,也安装了cuda,则可以使用cuda跟h_264cuvid 解码器
查看可用的对应格式解码器
ffmpeg -codecs | findstr "h264"
红色框中为可用解码器。
利用硬件解码器的命令如下,以h264_cuvid为例:
ffmpeg -hwaccel cuda -vcodec h264_cuvid -i rtsp://admin:qwer1234@192.0.0.64/h264/ch1/main/av_stream output.mp4
-hwaccel 选择硬件模式
-vcodec 选择解码器
-i RTSP地址
output.mp4 保存成.mp4视频
note:硬解码器必须与硬件环境对应如:cuda 对应 h264_cuvid
测量延时
测量延时方法
- 将网络摄像头对准手机计时器
- 把手机靠近播放视频的电脑屏幕
- 同时拍摄手机与电脑屏幕显示的计时器,可计算毫秒级延时 。
具体如下面的图片所示。
利用ffplay拉流时延时
延时时间:7580 – 6130 = 1450ms
此时采用CPU软解,故延时较高。
利用ffmpeg硬解码拉流时延时
延时时间:3390 – 2680 = 710ms
可见硬解码降低了RTSP延时。
查看任务管理器的GPU界面栏
双击红色区域放大GPU显示
当Video Decode出现波动时代表调用了硬件解码器。
python调用ffmpeg转成opencv的mat格式并显示
首先安装ffmpeg-python、opencv-python、Numpy
pip install ffmpeg-pythonpip install opencv-pythonpip install numpy
此时还需要环境中安装了Cuda。
Cuda安装网络资源很多,在此不做赘述。
Code
import cv2
import ffmpeg
import numpy as np# RTSP 流地址
rtsp_url = "rtsp://admin:qwer1234@192.0.0.64/h264/ch1/main/av_stream"# 创建 FFmpeg 进程
probe = ffmpeg.probe(rtsp_url)
video_info = next(stream for stream in probe['streams'] if stream['codec_type'] == 'video')
width = video_info['width']
height = video_info['height']ffmpeg_cmd = (ffmpeg.input(rtsp_url, hwaccel='cuda', vcodec='h264_cuvid').output('pipe:', format='rawvideo',pix_fmt='bgr24').run_async(pipe_stdout=True)
)# 读取并显示视频帧
while True:in_bytes = ffmpeg_cmd.stdout.read(width * height * 3)if not in_bytes:breakframe = (np.frombuffer(in_bytes, np.uint8).reshape([height, width, 3]))cv2.imshow('RTSP Stream (GPU)', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakffmpeg_cmd.wait()
cv2.destroyAllWindows()
上述Code即可通过python调用ffmpeg并且能够与opencv交互,能为后续开发图像算法做一个前端。
相关文章:

【流媒体】 通过ffmpeg硬解码拉流RTSP并播放
简介 目前RTSP拉流是网络摄像头获取图片数据常用的方法,但通过CPU软解码的方式不仅延时高且十分占用资源,本文提供了一种从网络摄像头RTSP硬解码的拉流的方法,并且提供python代码以便从网络摄像头获取图片进行后续算法处理。 下载ffmpeg F…...

Go语言指针及不支持语法汇总
本文为Go语言中指针定义和示例及不支持语法汇总。 目录 指针 定义指针 关键字new定义 函数返回指针 空指针 Go不支持语法汇总 总结 指针 Go语言也有指针,结构体成员调用时,obj.name Go语言在使用指针时,会使用内容的垃圾回收机制&am…...

Why can‘t I access GPT-4 models via API, although GPT-3.5 models work?
题意:为什么我无法通过API访问GPT-4模型,尽管GPT-3.5模型可以工作? 问题背景: Im able to use the gpt-3.5-turbo-0301 model to access the ChatGPT API, but not any of the gpt-4 models. Here is the code I am using to tes…...

MATLAB中Simulink.SimulationData.Dataset用法
目录 语法 说明 示例 访问使用Dataset格式记录的数据 打开模型vdp 使用 Dataset 对象来组合模拟输入信号 Simulink.SimulationData.Dataset的功能是访问已记录的模拟数据或组合模拟输入数据。 语法 ds Simulink.SimulationData.Dataset ds Simulink.SimulationData.Da…...

Spring Security学习笔记(一)Spring Security架构原理
前言:本系列博客基于Spring Boot 2.6.x依赖的Spring Security5.6.x版本 Spring Security中文文档:https://springdoc.cn/spring-security/index.html 一、什么是Spring Security Spring Security是一个安全控制相关的java框架,它提供了一套全…...

nginx的access.log日志输出请求数
适用格式 #log_format main $remote_addr - $remote_user [$time_local] "$request" # $status $body_bytes_sent "$http_referer" # "$http_user_agent" "$http_x_forwarded_for"; 形如: 12…...

前端网站(三)-- 记事本【附源码】
开篇(请大家看完):此网站写给挚爱,后续页面还会慢慢更新,大家敬请期待~ ~ ~ 此前端框架,主要侧重于前端页面的视觉效果和交互体验。通过运用各种前端技术和创意,精心打造了一系列引人入胜的页面…...

java——Junit单元测试
测试分类 黑盒测试:不输入代码,给输入值,看程序能够给出期望的值。 白盒测试:写代码,关注程序具体执行流程。 JUnit单元测试 一个测试框架,供java开发人员编写单元测试。 是程序员测试,即白…...

Scala学习笔记17: Try与异常处理
目录 第十七章 Try与异常处理1- 异常的抛出和捕获1. 异常抛出2. 异常捕获 2- 函数式的错误处理1. Try 类型2. 使用 Try3. 处理 Try 结果4. Try 的常用方法5. Try 的优势总结 end 第十七章 Try与异常处理 1- 异常的抛出和捕获 Scala 的异常处理机制与 Java非常相似, 但也有一些…...

内网信息收集——MSF信息收集浏览器记录配置文件敏感信息
文章目录 一、配置文件敏感信息收集二、浏览器密码&记录三、MSF信息收集 域控:windows server 2008 域内机器:win7 攻击机:kali 就是红日靶场(一)的虚拟机。 一、配置文件敏感信息收集 使用searchall64.exe&#…...

C++ STL中的std::remove_if 的用法详解
在现代C++编程中,标准模板库(STL)提供了一系列功能强大的算法,这些算法极大地简化了日常的编程任务。其中,std::remove_if是一个非常实用的函数,它允许我们从容器中移除满足特定条件的所有元素。本文将深入探讨std::remove_if的使用方法,并通过一个具体的例子——基于St…...

基于AT89C51单片机的16×16点阵LED显示器字符滚动显示设计(含文档、源码与proteus仿真,以及系统详细介绍)
本篇文章论述的是基于AT89C51单片机的1616点阵LED显示器字符滚动显示设计的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。 目录 仿真效果图 仿真图 代码 系统论文 资源下载 设计的内容和要求 熟悉51系…...

Docker 日志丢失 - 解决方案
Docker 日志默认使用的是 journald 的方式. RateLimitBurst 是 journald 的一个参数,用于限制日志的速率。如果日志的生成速度超过这个限制,journald 可能会丢弃日志。你可以通过调整这个参数来避免日志被丢弃。 调整 RateLimitBurst 和 RateLimitInte…...

物联网环境下机器人隐私保护法律框架研究-隐私保护法律监管平台
1. 引言 物联网技术的发展推动了机器人在家庭、医疗、工业等领域的广泛应用。然而,这些智能设备在数据采集和处理过程中面临着巨大的隐私保护挑战。本设计方案旨在构建一个全面的隐私保护法律监管平台,确保物联网环境下机器人的隐私数据得到有效保护,并符合相关法律法规的要…...

设计模式-创建型模式之工厂方法模式
和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象。 工厂方法模式的主要角色: 抽象工厂(AbstractFactory):提供了创建产品的接…...

婚礼成本与筹备策略:一场梦幻婚礼的理性规划
婚礼成本与筹备策略:一场梦幻婚礼的理性规划 摘要 婚礼,作为人生中的重要仪式,承载着新人的爱情与梦想,同时也伴随着不菲的经济投入。本文旨在探讨婚礼所需的大致成本、影响成本的主要因素以及婚礼筹备过程中的关键注意事项&…...

前端a-tree遇到的问题
在使用a-tree时候,给虚拟滚动的高度,然后展开a-tree滑动一段距离 比如这样 随后你切换页面,在返回这个页面的时候 就会出现这样的bug 解决方法: onBeforeRouteLeave((to, from, next) > {// 可以在路由参数变化时执行的逻辑ke…...

SpringCloud教程 | 第十篇: 读取Nacos的配置
1、引入依赖 <dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-config-spring-boot-starter</artifactId><version>0.2.7</version></dependency> 2、在启动类加上 NacosPropertySource(dataId"nac…...

漏洞-Alibaba Nacos derby 远程代码执行漏洞
【漏洞详情】 漏洞描述:Alibaba Nacos derby 存在远程代码执行漏洞,由于Alibaba Nacos部分版本中derby数据库默认可以未授权访问,恶意攻击者利用此漏洞可以未授权执行SQL语句,从而远程加载恶意构造的jar包,最终导致任意…...

SpringBoot解决Apache Tomcat输入验证错误漏洞
Apache Tomcat是美国阿帕奇(Apache)基金会的一款轻量级Web应用服务器。该程序实现了对Servlet和JavaServer Page(JSP)的支持。 Apache Tomcat存在输入验证错误漏洞,该漏洞源于HTTP/2请求的输入验证不正确,会…...

echarts解决数据差异过大的问题
问题描述 使用echarts折线图和柱状图展示数据时,如果数据差异值较大,会导致显示图形差异过大,图表不美观。 如这一组数据[2000000, 200, 0.1, 20, 0, -10, -3000],渲染出来的效果如下图: 可以看到由于最大值和最小值差…...

Oracle 常用系统
常用系统包 查看系统包 SELECT * FROM all_objects WHERE object_type PACKAGE AND owner SYS AND object_name 包名称;AUTO_SERVER_PKG AUTO_SERVER_PKG 在Oracle数据库的上下文中,并不是一个标准的Oracle系统包或内置功能。然而,在参考文章中提到…...

WPS点击Zotero插入没有任何反应
wps个人版没有内置vba,因此即便一下插件安装上了(如Axmath,zotero),当点击插件的时候会出现“点不动”、“点击插件没反应的现象。至于islide一类的插件,干脆连装都装不上。 这就需要手动安装一下vba。 针…...

uniapp 实现上传文件的功能
上传单个文件 <script setup>const handleUploadClick () > {console.log("上传文件")uni.chooseImage({success: (chooseImageRes) > {const tempFilePaths chooseImageRes.tempFilePaths;console.log("用户选择的图片:", temp…...

apache Kylin系列介绍及配置
Apache Kylin是一个开源的分布式分析引擎,用于OLAP(联机分析处理)数据处理。它专门设计用于处理大规模的数据集,并提供快速的查询和分析能力。 apache Kylin架构: Apache Kylin是一个开源的分布式分析引擎,旨在提供高性能、低延迟的OLAP(联机分析处理)能力。下面是Ap…...

【Qt 初识】QPushButton 的详解以及 Qt 中的坐标
文章目录 1. Qt 中的信号槽机制 🍎2. 通过图形化界面的方式实现 🍎3. 通过纯代码的方式实现按钮版的HelloWorld 🍎4. 设置坐标 🍎 1. Qt 中的信号槽机制 🍎 》🐧 本质就是给按钮的点击操作,关联…...

道路运输企业管理人员安全考核试题(附答案)
1、【多选题】《道路旅客运输企业安全管理规范》规定,客运企业应当制定车辆动态监控操作规程。操作规程的内容包括( )。(ABCD) A、卫星定位装置、视频监控装置、动态监控平台设备的检修和维护要求 B、动态监控信息采集、分析、处理规范和流程 C、违法违规信息统…...

免费开源的工业物联网(IoT)解决方案
什么是 IoT? 物联网 (IoT) 是指由实体设备、车辆、电器和其他实体对象组成的网络,这些实体对象内嵌传感器、软件和网络连接,可以收集和共享数据。 IoT 设备(也称为“智能对象”)范围广泛,包括智能恒温器等…...

Android 底部导航栏实现
依赖库 implementation "androidx.viewpager2:viewpager2:1.0.0" fragment基类 /*** Fragment的基类** param <DB> data binding* param <VM> view model* author shizhiyin*/ public abstract class BaseFragment<DB extends ViewDataBinding, VM …...

ASP.NET Core----基础学习07----ViewStart ViewImports文件的使用
文章目录 1._ViewStart.cshtml的使用2.更换Layout文件3._ViewImports.cshtml文件的使用 1._ViewStart.cshtml的使用 step1: 在Views文件夹下面创建_ViewStart.cshtml文件 step2: 删掉视图文件中的Layout设置行 step3: 最终显示效果ÿ…...