海康威视、大华、宇视rtsp实时读取网络摄像头

news2024/11/26 20:30:33

目录

1 RTSP介绍

1.海康 

 1.2 大华

1.3 宇视

2.实时读取

2.1 cv2.VideoCapture打开视频流

2.2 ffmpeg打开视频流

2.3 c++


1 RTSP介绍

RTSP(Real-Time Streaming Protocol)是一种用于实时流媒体传输的网络协议。它被设计用于在客户端和服务器之间传输音频和视频数据。RTSP可以控制和管理多媒体数据的传输,包括播放、暂停、快进、倒退等操作。

RTSP采用客户端-服务器模型,客户端发送请求给服务器,并通过TCP或UDP建立连接进行数据传输。客户端通常是支持流媒体的播放器或应用程序,服务器则提供媒体数据的存储和传输。

RTSP的特点包括:

  1. 实时性:RTSP适用于需要实时传输的场景,如直播、视频会议等。
  2. 灵活性:RTSP支持多种传输协议,包括RTP、RTCP、TCP和UDP等,可以根据需要选择合适的协议。
  3. 控制性:RTSP可以控制媒体数据的播放和管理,能够进行播放、暂停、停止、跳转等操作。
  4. 扩展性:RTSP可以扩展到支持高级功能,如实时广播、多播、安全认证等。

RTSP流媒体的工作方式是,客户端发送RTSP请求到服务器,请求包括要播放的媒体资源的URL和相关参数。服务器收到请求后,根据请求进行验证,然后返回响应,包括媒体资源的描述信息和传输方式等。客户端根据响应信息进行连接建立,并发送RTP流请求进行实时数据传输。服务器将音视频数据通过RTP协议传输给客户端,客户端接收数据并进行解码、播放等操作。

1.海康 

"""
海康相机rtsp格式:rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
        username: 用户名。例如admin。
        password: 密码。例如12345。
        ip: 为设备IP。例如 192.0.0.64。
        port: 端口号默认为554,若为默认可不填写。
        codec:有h264、MPEG-4、mpeg4这几种。
        channel: 通道号,起始为1。例如通道1,则为ch1。
        subtype: 码流类型,主码流为main,辅码流为sub。
"""

示例
rtsp_url = 'rtsp://admin:DING09503@192.168.1.85:554/h264/ch1/main/av_stream'

 如何获取这些参数

登录你的设备查看

 1.2 大华

rtsp://[username]:[password]@[ip]:[port]/cam/realmonitor?[channel=1]&[subtype=1] 
1) username、password、ip、port 同上
2) channel  通道号,起始为1,例如通道2,则为 channel=2
3) subtype  码流类型,主码流为0(即 subtype=0),辅码流为1(即 subtype=1)

1.3 宇视

rtsp://{用户名}:{密码}@{ip}:{port}/video1/2/3,
1)video1/2/3表示主码流,子码流,三码流(可以不用)
2)其他一样 

RTSP流读取有个致命的问题就是延迟高,如果你用AI算法来处理这个实时视频流速度会更慢,本人实测,一个基于yolov5开发小demo的实时推理延迟高达7秒。

下一篇将介绍如何解决这个问题

2.实时读取

2.1 cv2.VideoCapture打开视频流

rtsp_url = 'rtsp://10.0.58.253:9090/dss/monitor/param?cameraid=1003517%2418&substream=1'
cap = cv2.VideoCapture(rtsp_url)
 
while True:
    ret, frame = cap.read()
    if ret:
        cv2.imshow('frame', frame)
        key = cv2.waitKey(1)
        if key == ord('s'):
            print('img_shape:', frame.shape)
        elif key == ord('q'):
            break
    else:
        print('Failed to read frame')
        break
 
cap.release()
cv2.destroyAllWindows()

2.2 ffmpeg打开视频流

pip install ffmpeg-python
import ffmpeg
import numpy as np
import cv2
 
camera = 'rtsp://10.0.58.253:9090/dss/monitor/param?cameraid=1003411%2417&substream=1'
 
probe = ffmpeg.probe(camera)
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'])
 
out = (
    ffmpeg
        .input(camera, rtsp_transport='tcp')
        .output('pipe:', format='rawvideo', pix_fmt='bgr24', loglevel="quiet", r=25)
        .run_async(pipe_stdout=True)
)
cnt_empty = 0
while True:
    in_bytes = out.stdout.read(height * width * 3)
    if not in_bytes:
        cnt_empty += 1
        if cnt_empty > 10:
            break
    cnt_empty = 0
    frame = np.frombuffer(in_bytes, dtype=np.uint8).reshape(height, width, 3)
    # to process frame
    cv2.imshow('test', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

2.3 c++

 
//并行
#include <thread>
//互斥访问
#include <mutex>
 
 
//是否打开视频
bool captureOpen = false;
//读取的每张图像
Mat image;
VideoCapture capture;
 
//网络链接地址
String url = "rtsp://admin:123456@114.114.114.114/ch1-s1?tcp";
 
//加锁器
mutex mtx;
//是否读图成功
bool imgready = false;
 
/**
 * @brief 读图
 * 
 * @return Mat 
 */
Mat captureThread()
{
	if (captureOpen == false || image.empty())
	{
		//打开图像
		capture.open(url);
	}
	while (1)
	{
		//加锁
		mtx.lock();
 
		capture >> image;
		//读图成功
		imgready = true;
 
		//解锁
		mtx.unlock();
 
		return image;
	}
}
 
/**
 * @brief 处理函数
 * 
 * @param image 输入图像
 */
void processingThread(Mat image)
{
	//如果读图成功
	if (imgready)
	{
		//如果图像为空
		if (image.empty())
		{
			return;
		}
		mtx.lock();
		//你的处理函数
        //your function
		mtx.unlock();
		return;
	}
}
 
 
int main()
{
	//读图
	thread t1(captureThread);
	t1.join();
	//已经读图
	captureOpen = true;
	//并行处理
	thread t2(processingThread, image);
	t2.join();
 
	return 0;
}

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

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

相关文章

双指针--浅试

在做题中发现一件很奇怪的事情&#xff1a; 我看到了题目描述&#xff0c;心中有了一个解题的思路&#xff0c;然后尝试解题&#xff0c;看题解的时候发现“双指针法”我很熟悉但是又感觉不太懂。 把题解代码看了以后却与我的代码大差不差&#xff0c;才恍然大悟&#xff0c;原…

非类型模板参数+模板的特化

目录 一、非类型模板参数 二、模板的特化 &#xff08;一&#xff09;函数模板特化 &#xff08;二&#xff09;类模板举例 1. 全特化 2. 偏特化 一、非类型模板参数 模板参数分类&#xff1a;类型形参与非类型形参。类型形参即&#xff1a;出现在模板参数列表中&#x…

String、StringBuilder、StringBuffer区别

String、StringBuilder、StringBuffer区别 面试官&#xff1a;请你谈谈String、StringBuilder、StringBuffer区别 作为经典Java八股&#xff0c;是面试必考的热门点。 下面让我们一起来看一下他们的区别吧&#xff01; 主要是测试他们的效率和应用场景&#xff0c;具体语法不在…

苍穹外卖(六) redis缓存解决数据库压力

二节 直接用代码操作redis缓存 三, 四节 间接使用Spring Cache 注解完成redis缓存操作 可直接看三,四节 需要帮助理解注释 回去看第二节 一.问题说明 二. 实现思路 通过Redis来缓存菜品数据, 减少数据库查询操作 Redis简介 Redis是一个基于内存的key-value结构数据库。Redi…

2. vue-sy-admin: 基于vue3+TypeScript的自定义指令(directives)的封装及示例

自定义指令directives在项目特别是后台管理类的项目中使用的尤其多(个人经验)&#xff0c;每个人编写的自定义指令也各不相同&#xff0c;一个人的时候还没啥感觉&#xff0c;在多人合作的项目中统一编码规范就变得很有必要了&#xff0c;这样看着舒服的同时也更方便后期维护。…

【PyTorchTensorBoard实战】GPU与CPU的计算速度对比(附代码)

0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解&#xff0c;但是内容可能存在不准确的地方。如果发现文中错误&#xff0c;希望批评指正&#xff0c;共同进步。 本文基于PyTorch通过tensor点积所需要的时…

【VSCode】Windows环境下,VSCode 搭建 cmake 编译环境(VSCode 插件配置)

目录 一、下载编译器 1、下载 Windows GCC 2、选择编译器路径 二、下载插件 三、配置 cmake generator 四、编译工程 一、下载编译器 1、下载 Windows GCC 这里是在Windows环境下&#xff0c;所以下载的是 Windows 环境使用的 gcc 编译器。 下载地址: MinGW-w64 - for…

【数据库系统概论】第九章关系查询处理何查询优化

9.1查询处理 一&#xff1a;查询处理步骤 关系数据库管理系统查询处理可以分为4个阶段&#xff1a; 查询分析查询检查查询优化查询执行 &#xff08;1&#xff09;查询分析 任务&#xff1a;对查询语句进行扫描&#xff0c;分析词法、语法是否符合SQL语法规则 如果没有语…

[MySQL]存储引擎、索引、SQL优化

文章目录 1. 存储引擎1.1 MySQL体系结构1.2 存储引擎简述1.3 存储引擎的特点1.3.1 innoDB1.3.2 MyISAM1.3.3 Memory1.3.4 存储引擎的选择 2. Linux下的MySQL3. 索引3.1 索引概述3.2 索引结构3.3 索引分类3.4 索引语法3.5 索引性能分析3.6 索引的使用3.6.1 索引失效3.6.2 索引使…

【LeetCode刷题(数据结构)】:给定一个链表 每个节点包含一个额外增加的随机指针 该指针可以指向链表中的任何节点或空节点 要求返回这个链表的深度拷贝

给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节点的 next…

深入探索BP神经网络【简单原理、实际应用和Python示例】

人工神经网络&#xff08;Artificial Neural Networks&#xff09;是一种受到生物神经网络启发的机器学习模型&#xff0c;它的应用范围广泛&#xff0c;包括图像识别、语音识别、自然语言处理等领域。其中&#xff0c;BP神经网络&#xff08;Backpropagation Neural Network&a…

学习笔记-MongoDB(复制集,分片集集群搭建)

复制集群搭建 基本介绍 什么是复制集&#xff1f; 复制集是由一组拥有相同数据集的MongoDB实例做组成的集群。 复制集是一个集群&#xff0c;它是2台及2台以上的服务器组成&#xff0c;以及复制集成员包括Primary主节点&#xff0c;Secondary从节点和投票节点。 复制集提供了…

花2个月时间学习,面华为测开岗要30k,面试官竟说:你不是在搞笑。。。

背景介绍 计算机专业&#xff0c;代码能力一般&#xff0c;之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发&#xff0c;第二份实习由于大三暑假回国的时间比较短&#xff08;小于两个月&#xff09;&#xff0c;于是找的实习是…

通用考勤后台管理系统

考勤后台系统&#xff0c;包括待办事项、人员管理、任务中心、任务详情、我的任务、客户管理、考勤功能几大功能&#xff0c;本后台系统以考勤打卡为主要功能&#xff0c;采用分屏布局的方式&#xff0c;简洁大方&#xff0c;使用方便

mysqlbinlog 日用记录

我是同步覆盖了两张表&#xff0c;现在想用日志恢复。 先说结论&#xff0c;没有恢复&#xff0c;因为我的日志不完整&#xff0c;设置了定时清理。 如果你truncate了表或者数据库&#xff0c;如果没有完整的日志是恢复不了数据的。 第一、mysqlbinlog 可能没开启 第二、开…

C++入门 第一篇(C++关键字, 命名空间,C++输入输出)

目录 1. C关键字 2. 命名空间 2.1 命名空间定义 2.2命名空间的使用 命名空间的使用有三种方式&#xff1a; 1.加命名空间名称及作用域限定符 2.使用using将命名空间中某个成员引入 3.使用using namespace 命名空间名称 引入 3. C输入&输出 4.缺省函数 4.1 缺省参…

微信开发者工具下载

一、微信开发者工具下载官网 微信开发者工具下载地址与更新日志 | 微信开放文档 (qq.com) 二、微信开发者工具界面 下载安装好后&#xff0c;软件图标如下图所示。 运行软件如下图所示&#xff0c;这时候就需要使用你的管理员账号扫码登录。 登陆后的界面&#xff0c;如下图…

为知笔记一个日记模板

<!DOCTYPE HTML><html><head> <meta http-equiv"Content-Type" content"text/html; charsetunicode"> <title>日记&#xff1a;</title><style id"wiz_custom_css">html, .wiz-editor-body {font-siz…

Lua调用C#类

先创建一个Main脚本作为主入口&#xff0c;挂载到摄像机上 public class Main : MonoBehaviour {// Start is called before the first frame updatevoid Start(){LuaMgr.GetInstance().Init();LuaMgr.GetInstance().DoLuaFile("Main");}// Update is called once p…

Stm32_标准库_11_ADC_光敏热敏传感器_测数值

在测量光敏传感器数值得基础上手动将通道改成热敏传感器通道即可 由于温度传感器的测量范围是-20 ~ 105摄氏度&#xff0c;所以输出温度得考虑带上符号这就需要在原有输出光照强度代码的基础上新添加几个函数 函数1&#xff1a; uint16_t AD_Getvailue(uint8_t ADC_Channel){…