onvif 海康相机控制
时间: 2025-06-20 14:14:33 浏览: 25
### 使用 ONVIF 协议控制海康威视 IP 相机
ONVIF 是一种开放标准,用于网络视频产品的全球互操作性。它定义了一组通用接口,允许不同厂商生产的设备之间进行通信。要通过 ONVIF 控制海康威视的 IP 相机,可以按照以下方式实现。
#### 安装必要的库
为了简化开发过程并快速集成 ONVIF 功能,推荐使用 Python 的 `onvif` 库以及其依赖项 `zeep` 来完成交互[^2]。可以通过以下命令安装这些工具:
```bash
pip3 install --upgrade onvif_zeep zeep
```
#### 建立连接
建立与目标摄像机的连接需要提供基本参数,例如地址、端口、用户名和密码。以下是创建客户端实例的一个简单示例代码片段:
```python
from onvif import ONVIFCamera
camera_ip = '192.168.1.64' # 替换为目标相机的实际IP地址
port = 80 # 默认HTTP端口号通常是80
username = 'admin' # 用户名
password = 'your_password' # 密码
mycam = ONVIFCamera(camera_ip, port, username, password)
print(f"Connected to camera at {camera_ip}")
```
此部分代码初始化了一个名为 `mycam` 的对象,该对象代表了与指定 IP 地址上的摄像机之间的会话。
#### 获取服务列表
一旦建立了连接,下一步是从摄像机检索可用的服务列表。这通常包括媒体服务(Media Service)、PTZ 控制(PTZ Control),以及其他高级特性如事件订阅等。
```python
media_service = mycam.create_media_service()
ptz_service = mycam.create_ptz_service()
print("Available services:", media_service.GetProfiles())
```
上述脚本展示了如何访问两个主要的服务——媒体配置文件管理和 PTZ 操作管理。
#### 截图功能
如果希望从远程位置捕获实时图像,则可通过调用 MediaService 提供的方法来获取当前活动流 URI 并下载帧数据。
```python
profiles = media_service.GetProfiles()
token = profiles[0]._token
# 请求拉取点 (PullPoint Subscription) 或 RTSP 流 URL
uri = media_service.GetSnapshotUri({'ProfileToken': token})
print('Snapshot URI:', uri)
import requests
response = requests.get(uri.Uri, auth=(username, password))
with open('snapshot.jpg', 'wb') as f:
f.write(response.content)
```
这段程序说明了怎样利用 GetSnapshotUri 方法获得即时照片链接,并保存至本地磁盘作为 JPEG 文件。
#### 移动到预置位/设置新预置位
对于支持云台转动的型号来说,还可以借助于 PTZ 接口执行诸如定位调整之类的动作。
```python
request_move = ptz_service.create_type('AbsoluteMove')
request_move.ProfileToken = token
# 设置绝对坐标值
request_move.Position.PanTilt.x = 0.5
request_move.Position.PanTilt.y = 0.5
request_move.Speed.PanTilt.x = 0.5
request_move.Speed.PanTilt.y = 0.5
ret = ptz_service.AbsoluteMove(request_move)
print(ret)
```
这里演示的是让摄像头向右上方平移一半距离的操作逻辑。
尽管理论上遵循 ONVIF 标准应该能够跨品牌兼容大多数现代监控产品线中的组件,但在实际部署过程中可能会遇到某些特定限制条件或者固件版本差异带来的挑战[^1]^。
阅读全文
相关推荐



















