参考链接:

一、python3控制基于onvif的安防摄像头

使用的是tp-link安防摄像头

安装

在Python3中,是安装pip install onvif-zeep实现控制

二、实现

已经保证了摄像头具有的以下的能力,所以不再对设备是否具有能力进行判断。

实现获取设备、控制设备、获取摄像头视频内容进行分析

需要更改的地方,就是填写自己摄像头的用户名和密码

onvif的默认账户和密码是admin和9999,不写(空字符串)也能运行。。。

class PlcVisionSDK:

def __init__(self, kwargs_dict):

self.name = ' admin' # 自己设备的名称

self.password = '9999 ' # 自己设备的密码

self.mul_ip = "239.255.255.250"

self.mul_port = 3702

self.kwargs_dict = kwargs_dict

def zeep_pythonvalue(self, xmlvalue):

return xmlvalue

1、发现设备

使用udp组播,获取摄像头的IP和PORT

def discovery_dev(self):

local_ip = self.kwargs_dict['local_ip']

xml_str = """

uuid:a8098c1a-f86e-11da-bd1a-00112444be1e'

urn:schemas-xmlsoap-org:ws:2005:04:discovery

http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe

dn:NetworkVideoTransmitter

"""

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255)

s.bind((local_ip, self.mul_port))

s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP,

socket.inet_aton(self.mul_ip) + socket.inet_aton(local_ip))

s.setblocking(False)

s.sendto(xml_str.encode(), (self.mul_ip, self.mul_port))

while True:

data, address = s.recvfrom(65535)

content = data.decode()

a = re.search(re.compile(r"(.*?)", re.S), str(content))

if a:

b = a.group()

ip, port = b.split('/')[2].split(':')[0: 2]

return str(ip), port

2、绝对移动

对应的方法是 AbsoluteMove

根据获得的IP和PORT,进行绝对移动的控制。

def move(self):

# 需要的参数

plc_ip = self.kwargs_dict['plc_ip']

plc_port = int(self.kwargs_dict['plc_port'])

pan = self.kwargs_dict['pan'] if self.kwargs_dict.get('pan') else 0

tilt = self.kwargs_dict['tilt'] if self.kwargs_dict.get('tilt') else 0

zoom = self.kwargs_dict['zoom'] if self.kwargs_dict.get('zoom') else 0

pan_speed = self.kwargs_dict['pan_speed'] if self.kwargs_dict.get('pan_speed') else 1

tilt_speed = self.kwargs_dict['tilt_speed'] if self.kwargs_dict.get('tilt_speed') else 1

zoom_speed = self.kwargs_dict['zoom_speed'] if self.kwargs_dict.get('zoom_speed') else 1

mycam = ONVIFCamera(plc_ip, plc_port, self.name, self.password)

media = mycam.create_media_service()

ptz = mycam.create_ptz_service()

zeep.xsd.simple.AnySimpleType.pythonvalue = self.zeep_pythonvalue

media_profile = media.GetProfiles()[0]

request = ptz.create_type('GetConfigurationOptions')

request.ConfigurationToken = media_profile.PTZConfiguration.token

request = ptz.create_type('AbsoluteMove')

request.ProfileToken = media_profile.token

ptz.Stop({'ProfileToken': media_profile.token})

if request.Position is None:

request.Position = ptz.GetStatus({'ProfileToken': media_profile.token}).Position

if request.Speed is None:

request.Speed = ptz.GetStatus({'ProfileToken': media_profile.token}).Position

request.Position.PanTilt.x = pan

request.Speed.PanTilt.x = pan_speed

request.Position.PanTilt.y = tilt

request.Speed.PanTilt.y = tilt_speed

request.Position.Zoom = zoom

request.Speed.Zoom = zoom_speed

ptz.AbsoluteMove(request)

return 'finish'

3、相对移动

对应的方法是 RelativeMove

根据获得的IP和PORT,进行相对移动的控制。

def relative_move(self):

# 需要的参数

plc_ip = self.kwargs_dict['plc_ip']

plc_port = int(self.kwargs_dict['plc_port'])

re_pan = self.kwargs_dict['re_pan'] if self.kwargs_dict.get('re_pan') else 0

re_tilt = self.kwargs_dict['re_tilt'] if self.kwargs_dict.get('re_tilt') else 0

re_zoom = self.kwargs_dict['re_zoom'] if self.kwargs_dict.get('re_zoom') else 0

mycam = ONVIFCamera(plc_ip, plc_port, self.name, self.password)

media = mycam.create_media_service()

ptz = mycam.create_ptz_service()

zeep.xsd.simple.AnySimpleType.pythonvalue = self.zeep_pythonvalue

media_profile = media.GetProfiles()[0]

profile_token = media_profile.token

relative_move = ptz.create_type('RelativeMove')

relative_move.ProfileToken = profile_token

if relative_move.Translation is None:

relative_move.Translation = ptz.GetStatus({'ProfileToken': profile_token}).Position

if relative_move.Speed is None:

relative_move.Speed = ptz.GetStatus({'ProfileToken': profile_token}).Position

relative_move.Translation.PanTilt.x = re_pan

relative_move.Translation.PanTilt.y = re_tilt

relative_move.Translation.Zoom = re_zoom

try:

ptz.RelativeMove(relative_move)

except Exception as e:

return '已经无法再移动了'

return 'finish'

4、发现rtsp地址

对应的方法是 GetStreamUri

def get_rtsp(self):

plc_ip = self.kwargs_dict['plc_ip']

plc_port = int(self.kwargs_dict['plc_port'])

mycam = ONVIFCamera(plc_ip, plc_port, self.name, self.password)

media = mycam.create_media_service()

zeep.xsd.simple.AnySimpleType.pythonvalue = self.zeep_pythonvalue

media_profile = media.GetProfiles()

token = media_profile[0].token

# 实例化GetStreamUri对象

obj = media.create_type('GetStreamUri')

obj.StreamSetup = {'Stream': 'RTP-Unicast', 'Transport': {'Protocol': 'RTSP'}}

obj.ProfileToken = token

res_uri = media.GetStreamUri(obj)['Uri']

return res_uri

想要播放rtsp内容,进行分析的话,直接使用opencv就OK了。

onvif python 音视频_python3控制基于onvif的安防摄像头相关推荐

  1. python音视频开发_Python音视频开发:消除抖音短视频Logo的图形化工具实现

    一.引言 在<Python音视频开发:消除抖音短视频Logo和去电视台标的实现详解>节介绍了怎么通过Python+Moviepy+OpenCV实现消除视频Logo的四种方法,并提供了详细的 ...

  2. Python音视频开发:消除抖音短视频Logo和去电视台标

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 对于带Logo(如抖音Logo.电视台标)的视频,有三种方案进行Logo消除: 直接将对应区域用对应图像替换: 直接将对应区域模糊化: 通过变换将要 ...

  3. Python音视频开发:消除抖音短视频Logo的图形化工具实现

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<Python音视频开发:消除抖音短视频Logo和去电视台标的实现详解>节介绍了怎么通过Python+Moviepy+OpenCV实现 ...

  4. 通过GB28181实现对安防摄像头的直播回放控制

    介绍 目前在安防行业中,GB28181协议越来越被重视,也越来越通用,越来越稳定.各个安防设备厂家已经基本都支持GB28181协议,通过GB28181协议可以实现获取设备的视频视频.录像数据.云台控制 ...

  5. GB28181实现对安防摄像头的直播回放控制

    介绍 目前在安防行业中,GB28181协议越来越被重视,也越来越通用,越来越稳定.各个安防设备厂家已经基本都支持GB28181协议,通过GB28181协议可以实现获取设备的视频视频.录像数据.云台控制 ...

  6. 通过GB28181实现对安防摄像头的直播回放控制-更适合非固定网络环境业务

    介绍 目前在安防行业中,GB28181协议越来越被重视,也越来越通用,越来越稳定.各个安防设备厂家已经基本都支持GB28181协议,通过GB28181协议可以实现获取设备的视频视频.录像数据.云台控制 ...

  7. 腾讯音视频实验室:基于音视频细分场景的技术创新探索

    音视频通讯能力作为标配渗透到了各个行业,腾讯音视频实验室音频技术负责人郭亮在LiveVideoStackCon 2017上分享了腾讯音视频实验在流畅无卡顿.回声消除等音频前处理.网络部署与覆盖等各个技 ...

  8. Python音视频剪辑库MoviePy1.0.3中文教程导览及可执行工具下载

    ☞ ░ 前往老猿Python博文目录 ░ 一.简介 MoviePy是一个用于视频编辑的Python模块,可用于进行视频的基本操作(如剪切.拼接.标题插入).视频合成(也称非线性编辑).视频处理或创建高 ...

  9. 基于SkeyeVSS综合安防监控视频云平台实现智能视频监控系统解决方案

    智能视频监控系统 智能视频监控系统是指采用图像处理.模式识别和计算机视觉技术,通过在监控系统中增加智能视频分析模块,借助计算机强大的数据处理能力过滤掉视频画面无用的或干扰信息.自动识别不同物体,分析抽 ...

最新文章

  1. GPT-3数学不及格,愁坏伯克利团队,于是他们出了12500道数学作业
  2. BZOJ 1174: [Balkan2007]Toponyms
  3. Java线程池了解一下
  4. 第二章:2.5 卷积辅助求解方法
  5. Storm的acker确认机制
  6. Jquery中对常用控件赋值的方法
  7. JavaScript入门(part4)--简单数据类型
  8. Android逆向笔记-使用dnSpy修改C#的dll(安卓游戏中使用资源不减反加)
  9. 自然语言处理——词嵌入
  10. java进入dos_java启动dos命令收集笔记一
  11. 智慧交通前瞻:如何解决城市发展“心病”?
  12. Windows PC版微信内置浏览器调试
  13. 放大器设计-光电放大电路噪声分析-理论
  14. html 科赫雪花,CSS3 科赫雪花分形动画
  15. 达梦7数据库单机安装(命令行方式)
  16. 创建服务器定时运行程序
  17. 设计模式学习(十):Singleton
  18. 布尔代数中表达式的展开及因式分解的技巧
  19. 【技美百人计划】图形 4.4 抗锯齿概论
  20. EDA技术与应用上机任务 电子信息类 Quartus II或Quartus Prime D触发器、半减器、全减器、可加减控制的50进制加减计数器。

热门文章

  1. mysql数据库的安装和使用方法_Mysql数据库的安装和使用
  2. 水墨特效怎么做?两种方法快速搞定!大神都在用的超美视频画面效果
  3. Android 三大图片缓存原理、特性对比
  4. 天猫总裁靖捷详解新零售:传统商圈平均增长超50%
  5. 7个小学语文学习锦囊,让孩子取得好的成绩(转给家长)
  6. 【人工智能】深度学习、神经网络图
  7. C语言的goto语句,scanf的注意点以及好玩的指令
  8. 疫情过后第一次线下考试感想
  9. 文章:Mapping regulatory variants controlling gene expression in drought response and tolerance
  10. 网易Airtest跨平台的UI自动化测试框架