当前位置:   article > 正文

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

rtsp协议的摄像头

目录

1 RTSP介绍

1.海康 

 1.2 大华

1.3 宇视

2.实时读取

2.1 cv2.VideoCapture打开视频流

2.2 ffmpeg打开视频流

2.3 c++


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打开视频流

  1. rtsp_url = 'rtsp://10.0.58.253:9090/dss/monitor/param?cameraid=1003517%2418&substream=1'
  2. cap = cv2.VideoCapture(rtsp_url)
  3. while True:
  4. ret, frame = cap.read()
  5. if ret:
  6. cv2.imshow('frame', frame)
  7. key = cv2.waitKey(1)
  8. if key == ord('s'):
  9. print('img_shape:', frame.shape)
  10. elif key == ord('q'):
  11. break
  12. else:
  13. print('Failed to read frame')
  14. break
  15. cap.release()
  16. cv2.destroyAllWindows()

2.2 ffmpeg打开视频流

pip install ffmpeg-python
  1. import ffmpeg
  2. import numpy as np
  3. import cv2
  4. camera = 'rtsp://10.0.58.253:9090/dss/monitor/param?cameraid=1003411%2417&substream=1'
  5. probe = ffmpeg.probe(camera)
  6. video_stream = next((stream for stream in probe['streams'] if stream['codec_type'] == 'video'), None)
  7. width = int(video_stream['width'])
  8. height = int(video_stream['height'])
  9. out = (
  10. ffmpeg
  11. .input(camera, rtsp_transport='tcp')
  12. .output('pipe:', format='rawvideo', pix_fmt='bgr24', loglevel="quiet", r=25)
  13. .run_async(pipe_stdout=True)
  14. )
  15. cnt_empty = 0
  16. while True:
  17. in_bytes = out.stdout.read(height * width * 3)
  18. if not in_bytes:
  19. cnt_empty += 1
  20. if cnt_empty > 10:
  21. break
  22. cnt_empty = 0
  23. frame = np.frombuffer(in_bytes, dtype=np.uint8).reshape(height, width, 3)
  24. # to process frame
  25. cv2.imshow('test', frame)
  26. if cv2.waitKey(1) & 0xFF == ord('q'):
  27. break

2.3 c++

  1. //并行
  2. #include <thread>
  3. //互斥访问
  4. #include <mutex>
  5. //是否打开视频
  6. bool captureOpen = false;
  7. //读取的每张图像
  8. Mat image;
  9. VideoCapture capture;
  10. //网络链接地址
  11. String url = "rtsp://admin:123456@114.114.114.114/ch1-s1?tcp";
  12. //加锁器
  13. mutex mtx;
  14. //是否读图成功
  15. bool imgready = false;
  16. /**
  17. * @brief 读图
  18. *
  19. * @return Mat
  20. */
  21. Mat captureThread()
  22. {
  23. if (captureOpen == false || image.empty())
  24. {
  25. //打开图像
  26. capture.open(url);
  27. }
  28. while (1)
  29. {
  30. //加锁
  31. mtx.lock();
  32. capture >> image;
  33. //读图成功
  34. imgready = true;
  35. //解锁
  36. mtx.unlock();
  37. return image;
  38. }
  39. }
  40. /**
  41. * @brief 处理函数
  42. *
  43. * @param image 输入图像
  44. */
  45. void processingThread(Mat image)
  46. {
  47. //如果读图成功
  48. if (imgready)
  49. {
  50. //如果图像为空
  51. if (image.empty())
  52. {
  53. return;
  54. }
  55. mtx.lock();
  56. //你的处理函数
  57. //your function
  58. mtx.unlock();
  59. return;
  60. }
  61. }
  62. int main()
  63. {
  64. //读图
  65. thread t1(captureThread);
  66. t1.join();
  67. //已经读图
  68. captureOpen = true;
  69. //并行处理
  70. thread t2(processingThread, image);
  71. t2.join();
  72. return 0;
  73. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/186441
推荐阅读
相关标签
  

闽ICP备14008679号