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

2023-10-14 23:12

本文主要是介绍海康威视、大华、宇视rtsp实时读取网络摄像头,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

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'):breakelse:print('Failed to read frame')breakcap.release()
cv2.destroyAllWindows()

2.2 ffmpeg打开视频流

pip install ffmpeg-python
import ffmpeg
import numpy as np
import cv2camera = '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 += 1if cnt_empty > 10:breakcnt_empty = 0frame = np.frombuffer(in_bytes, dtype=np.uint8).reshape(height, width, 3)# to process framecv2.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 functionmtx.unlock();return;}
}int main()
{//读图thread t1(captureThread);t1.join();//已经读图captureOpen = true;//并行处理thread t2(processingThread, image);t2.join();return 0;
}

这篇关于海康威视、大华、宇视rtsp实时读取网络摄像头的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/213782

相关文章

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

Python使用openpyxl读取Excel的操作详解

《Python使用openpyxl读取Excel的操作详解》本文介绍了使用Python的openpyxl库进行Excel文件的创建、读写、数据操作、工作簿与工作表管理,包括创建工作簿、加载工作簿、操作... 目录1 概述1.1 图示1.2 安装第三方库2 工作簿 workbook2.1 创建:Workboo