赞
踩
目录
RTSP(Real-Time Streaming Protocol)是一种用于实时流媒体传输的网络协议。它被设计用于在客户端和服务器之间传输音频和视频数据。RTSP可以控制和管理多媒体数据的传输,包括播放、暂停、快进、倒退等操作。
RTSP采用客户端-服务器模型,客户端发送请求给服务器,并通过TCP或UDP建立连接进行数据传输。客户端通常是支持流媒体的播放器或应用程序,服务器则提供媒体数据的存储和传输。
RTSP的特点包括:
RTSP流媒体的工作方式是,客户端发送RTSP请求到服务器,请求包括要播放的媒体资源的URL和相关参数。服务器收到请求后,根据请求进行验证,然后返回响应,包括媒体资源的描述信息和传输方式等。客户端根据响应信息进行连接建立,并发送RTP流请求进行实时数据传输。服务器将音视频数据通过RTP协议传输给客户端,客户端接收数据并进行解码、播放等操作。
"""
海康相机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'
如何获取这些参数
登录你的设备查看
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)
rtsp://{用户名}:{密码}@{ip}:{port}/video1/2/3,
1)video1/2/3表示主码流,子码流,三码流(可以不用)
2)其他一样
下一篇将介绍如何解决这个问题
- 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()
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
-
- //并行
- #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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。