摄像头视频流
简介
在工作中遇到了云台控制和视频接入的相关需求,此处针对相关内容进行了初步的整理。
读取视频流
可以通过如下方式读取摄像头的 RTSP 协议视频信号,需要注意的是登录摄像头的配置网站明确端口和认证方式。
OpenCV
使用如下命令安装依赖:
1
| pip install opencv-python
|
使用如下代码即可读取视频流:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| import cv2
rtsp_url = "rtsp://<username>:<password>@<ip_address>:<port>/Streaming/Channels/<channel>"
cap = cv2.VideoCapture(rtsp_url)
if not cap.isOpened(): print("无法打开RTSP流") exit()
while True: ret, frame = cap.read() if not ret: print("无法接收帧 (流结束?). 退出.") break cv2.imshow('Frame', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break
cap.release() cv2.destroyAllWindows()
|
控制云台
可以通过如下方式控制云台,需要注意的是登录摄像头的配置网站明确端口和认证方式。
基本的控制逻辑是采用 ONVIF 协议,在海康威视摄像头上需要摄像机启用集成协议,具体文档如下:
摄像机开启ONVIF协议
简单说就是:
- 开启开放型网络视频接口
- 认证方式为 digest/wsse 或 Digest&ws-username token
- 创建独立用户
onviz-zeep
使用如下命令安装相关依赖库:
1 2
| pip install zeep pip install onvif_zeep
|
然后使用如下代码即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| import time
from onvif import ONVIFCamera
ip_address = 'xxx.xxx.xxx.xxx' port = 80 username = 'xxx' password = 'xxx'
mycam = ONVIFCamera(ip_address, port, username, password)
ptz = mycam.create_ptz_service()
media = mycam.create_media_service()
media_profile = media.GetProfiles()[0]
request = ptz.create_type('GetConfigurationOptions') request.ConfigurationToken = media_profile.PTZConfiguration.token ptz_configuration_options = ptz.GetConfigurationOptions(request) request = ptz.create_type('ContinuousMove') request.ProfileToken = media_profile.token
ptz.Stop({'ProfileToken': media_profile.token})
request.Velocity = { 'PanTilt': { 'x': 0.5, 'y': 0 } }
ptz.ContinuousMove(request)
time.sleep(1)
ptz.Stop({'ProfileToken': media_profile.token})
|