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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

1 RTSP介绍

1.海康 

 1.2 大华

1.3 宇视

2.实时读取

2.1 cv2.VideoCapture打开视频流

2.2 ffmpeg打开视频流

2.3 c++


1 RTSP介绍

RTSPReal-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
1video1/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;
}

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6