【流媒体】 通过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

测量延时

测量延时方法

  1. 将网络摄像头对准手机计时器
  2. 把手机靠近播放视频的电脑屏幕
  3. 同时拍摄手机与电脑屏幕显示的计时器,可计算毫秒级延时 。

具体如下面的图片所示。

利用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交互,能为后续开发图像算法做一个前端。

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

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

相关文章

2024-07-15 Unity插件 Odin Inspector3 —— Button Attributes

文章目录 1 说明2 Button 特性2.1 Button2.2 ButtonGroup2.3 EnumPaging2.4 EnumToggleButtons2.5 InlineButton2.6 ResponsiveButtonGroup 1 说明 ​ 本章介绍 Odin Inspector 插件中有关 Button 特性的使用方法。 2 Button 特性 2.1 Button 依据方法,在 Inspec…

QT控件篇三

一、微调框 微调框(QSpinBox)是一个常用的Qt控件,允许用户通过增加或减少值来输入数字。分为两种, 整型-QSpinBox 浮点 QDoubleSpinBoxQSpinBox(微调框)的 setSingleStep 函数可以用来设置每次调整的步长(…

【人工智能】人工智能与传统美工结合,AI美工的详细解析。

AI美工是一个结合了人工智能技术与美工设计的岗位,它利用AI工具和技术来辅助或完成美工设计的各项工作。以下是对AI美工的详细解析: 一、定义与职责 AI美工是指能够熟练使用AI工具和技术,如Midjourney、StableDiffusion等AIGC(人…

QT 没有与参数列表匹配的函数模板qMin”实例参数类型为:(<error-type>,quint16)

quint16 numberOfEntries qMin (ui–>readSize->currentText (). toUShort (), quint16 (10 - startAddress)) ;template<class T> constexpr const T &qMin(const T &a, const T &b)quint16 numberOfEntries qM联机搜索return QModbusDataUnit (tab…

Spring Boot与Apache Pulsar的集成

Spring Boot与Apache Pulsar的集成 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 一、引言 Apache Pulsar作为一款高性能、持久化的分布式消息系统&#xf…

2024安全行业大模型技术应用态势发展报告

以上是资料简介和目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff1a;https://t.zsxq.com/dH9bu

qt 队列和线程

1.qt 队列应用 概要 这里采用定周期检查任务的方式来处理队列&#xff0c;虽然没有分线程&#xff0c;但和大部分队列任务的处理方式相同&#xff0c;因为队列最主要的价值就是对任务的排队&#xff0c;所以这种方式是一种很常用的场景。 开始 Qt 队列应用通常涉及到在 Qt …

Python爬虫入门篇学习记录

免责声明 本文的爬虫知识仅用于合法和合理的数据收集&#xff0c;使用者需遵守相关法律法规及目标网站的爬取规则&#xff0c;尊重数据隐私&#xff0c;合理设置访问频率&#xff0c;不得用于非法目的或侵犯他人权益。因使用网络爬虫产生的任何法律纠纷或损失&#xff0c;由使用…

计算机网络之网络互连

1.什么是网络互连 1.1网络互连的目的 将两个或者两个以上具有独立自治能力的计算机网络连接起来&#xff0c;实现数据流通&#xff0c;扩大资源共享范围&#xff0c;或者容纳更多用户。 网络互连包括&#xff1a; 同构网络、异构网络的互连&#xff0c; 局域网与局域网&…

【Linux】多线程_5

文章目录 九、多线程6. 条件变量7. 生产者消费者模型 未完待续 九、多线程 6. 条件变量 在多线程编程中&#xff0c;一个或多个线程可能需要等待某个条件的发生&#xff0c;然后才能继续执行&#xff0c;而不是一直忙等。这种等待通常会占用CPU资源。条件变量提供了一种机制&…

【Java 的四大引用详解】

首先分别介绍一下这几种引用 强引用&#xff1a; 只要能通过GC ROOT根对象引用链找到就不会被垃圾回收器回收&#xff0c;当所有的GC Root都不通过强引用引用该对象时&#xff0c;才能被垃圾回收器回收。 软引用&#xff08;SoftReference&#xff09;&#xff1a; 当只有软引…

从汇编层看64位程序运行——栈上变量的rbp表达

在《从汇编层看64位程序运行——参数传递的底层实现》中&#xff0c;我们看到了栈帧中的变量是分为两种&#xff1a; 局部非静态变量。调用超过6个参数的函数时&#xff0c;从第7个参数开始的入参。 比如下面的代码 void foo10(int a, int b, int c, int d, int e, int f, i…

数仓工具—Hive基础之临时表及示例

Hive基础之临时表及示例 临时表是应用程序自动管理在大型或复杂查询执行期间生成的中间数据的一种便捷方式。Hive 0.14 及更高版本支持临时表。可以在用户会话中像使用普通表一样多次使用它们。在本文中,我们将介绍 Apache Hive 临时表,以及如何创建和使用限制的示例。 Hiv…

Python实现简单的ui界面设计(小白入门)

引言&#xff1a; 当我们书写一个python程序时&#xff0c;我们在控制台输入信息时&#xff0c;往往多有不便&#xff0c;并且为了更加美观且直观的方式输入控制命令&#xff0c;我们常常设计一个ui界面&#xff0c;这样就能方便执行相关功能。如计算器、日历等界面。 正文&a…

水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集)

水表数字识别2&#xff1a;Pytorch DBNet实现水表数字检测(含训练代码和数据集) 目录 水表数字识别2&#xff1a;Pytorch DBNet实现水表数字检测(含训练代码和数据集) 1.前言 2. 水表数字识别的方法 3. 水表数字识别数据集 4. 水表数字分割模型训练 &#xff08;1&#x…

qt 销毁一个窗口的逻辑都有啥

在 Qt 中&#xff0c;销毁一个窗口通常涉及几个关键步骤。这些步骤确保窗口资源被正确释放&#xff0c;避免内存泄漏和其他潜在问题。以下是销毁一个 Qt 窗口时通常需要考虑的逻辑&#xff1a; 关闭窗口&#xff1a; 用户可以通过点击窗口的关闭按钮&#xff08;通常是右上角的…

hnust 1802: 二叉树遍历2

hnust 1802: 二叉树遍历2 题目描述 二叉树的前序、中序、后序遍历的定义&#xff1a; 前序遍历&#xff1a;对任一子树&#xff0c;先访问跟&#xff0c;然后遍历其左子树&#xff0c;最后遍历其右子树&#xff1b; 中序遍历&#xff1a;对任一子树&#xff0c;先遍历其左子树…

JavaSE 面向对象程序设计进阶 IO 压缩流 解压缩流

目录 解压缩流 压缩流 解压缩流 压缩包 压缩包里面的每一个文件在java中都是一个ZipEntry对象 把每一个ZipEntry按照层级拷贝到另一个文件夹当中 import java.io.*; import java.util.Date; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream;public cl…

c#与欧姆龙PLC通信——如何更改PLC的IP地址

前言 我们有时候需要改变欧姆龙Plc的ip地址,下图有两种更改方式,一种是已知之前Plc设置的Ip地址,还有一种是之前不知道Pl的Ip地址是多少,下面分别做介绍。 1、已知PLC的IP地址的情况下更改地址 假设已知PLC的Ip地址,比如本文中PLC的IP为192.168.1.2,我首先将电脑的IP地…

17:低功耗篇(PWR)---HAL库

一:PWR 1:简历 PWR&#xff08;Power Control&#xff09;电源控制 PWR负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能 可编程电压监测器&#xff08;PVD&#xff09;可以监控VDD电源电压&#xff0c;当VDD下降到PVD阀值以下或上升到…