海康威视、大华、宇视rtsp实时读取网络摄像头 您所在的位置:网站首页 大华摄像头需要什么软件打开看画面 海康威视、大华、宇视rtsp实时读取网络摄像头

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

2024-07-13 15:23| 来源: 网络整理| 查看: 265

目录

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的特点包括:

实时性:RTSP适用于需要实时传输的场景,如直播、视频会议等。灵活性:RTSP支持多种传输协议,包括RTP、RTCP、TCP和UDP等,可以根据需要选择合适的协议。控制性:RTSP可以控制媒体数据的播放和管理,能够进行播放、暂停、停止、跳转等操作。扩展性: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:[email protected]: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 //互斥访问 #include //是否打开视频 bool captureOpen = false; //读取的每张图像 Mat image; VideoCapture capture; //网络链接地址 String url = "rtsp://admin:[email protected]/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; }



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有