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

参考链接:

一、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了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244330.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python fact函数_第5天:Python 函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段,所以我经常说函数是程序员规模化使用的基础。函数能提高应用的模块性,和代码的重复利用率。在程序设计中,常将一些常用的功能模块编写成函…

linux编写日志接口so,linux下动态链接问题(.so文件的编写与调用) .

.o 就相当于windows里的obj文件.a 是好多个.o合在一起,用于静态连接.so 是shared object,用于动态连接的,和dll差不多sotest.c#includeint test(int a){printf("#########:%d\n",a);return a;}//test.c#include int test(int a);int main(int argc,char argv[]){int …

python获取包下的所有对象_Python访问COM对象的comtypes包简介

Python访问COM对象的comtypes包简介虽然pywin32包中包含的派遣高级客户端支持基于COM接口,它是无法访问COM 对象,除非他们在C 封装代码自定义COM接口。在Python中是无法直接访问COM对象接口,需要借助专门访问的COM包:comtypes&am…

linux tmux 详细教程,Linux下的神器介绍之Tmux分屏器

前言我们为什么需要分屏器呢?对于这个问题,我想大家肯定都有自己的看法。主流的观点是这样的,对于生活在Linux下的人(开发人员、运维人员、普通爱好者)都不可避免的使用终端模拟器(比如,gnome-terminal)去执行一些命令或者脚本。但…

laravel created_at 时间戳_使用 HTTP 测试测试 Laravel 中间件

文章转发自专业的Laravel开发者社区,原始链接:https://learnku.com/laravel/t/34002在本文中,我将展示一个使用 HTTP 测试中间件的实例。HTTP 级测试更能适应变化,可读性更强。在最近与 Adam Wathan 和 Taylor Otwell 合拍的《全栈…

linux 内核主线,为AM335x移植Linux内核主线代码(41)Ethernet结论篇

一口老血喷到屏幕上!请自动略过之前的第36~40小节_!!!https://www.tuicool.com/articles/UvmuEv我的电路板存在的问题是:由于布线(杜邦线)导致的干扰,只能通信在10Mbps,而不能通信在…

动物识别专家系统python_Python有哪些作用?

Python是什么呢?Python是一种全栈的开发语言,如果能学好Python,前端、后端、测试、大数据分析、爬虫等这些工作你都能胜任。那Python有哪些作用呢?Python主要有以下四大主要应用:网络爬虫网站开发人工智能自动化运维接…

linux 命令下删除字符,【Linux基础】tr命令替换和删除字符

cat t.txtabcdacat t.txt |tr abc xyzxyzdxcat t.txtabcda备注:凡是在t.txt文件中出现的"a"字母,都替换成"x"字母,"b"字母替换为"y"字母,"c"字母替换为"z"字母。而不…

python ssh登陆模块_使用python的Paramiko模块登陆SSH

paramiko是用Python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。python的paramiko模块可以方便的实现ssh登录,并执行命令。1. paramiko模块安装1.1安装pycrypto库pycrypto库安装方法python setu…

linux mint图标大小,Cinnamon:LinuxMint 15桌面设置小技巧

touchwiz自身也在做不断的革新,例如7屏分页,桌面切换3d效果,增强型的下拉菜单设置等。win10多桌面最多可以支持7个桌面开启,而且win10切换多桌面是有快捷键的,可以帮助用户迅速切换或创建以及关闭多桌面。切换方法一&a…

操作系统源代码_国产操作系统“之光”?Windows XP绝密源代码泄露,BT种子已在网上疯传...

微软的Windows操作系统是目前使用人数最多、覆盖最广的桌面操作系统,从安全角度来看,其系统源代码对于公众而言可以说是绝密。不过......现在......,黑客在4Chan平台上以BT种子文件的形式在线泄漏了多个旧Windows版本的源代码,包括…

linux设置多语言环境,怎么为Linux系统配置多语言环境?

这篇文章主要讲述了怎么为Linux系统配置多语言环境的基本方法,其中还包括编码的修改方法,我们就拿用户使用最多的Ubuntu和CentOS这两个为例子吧。需要的朋友可以参考下。修改 /etc/sysconfig/i18n 文件,如LANG“en_US.UTF-8”,xwi…

轴承新旧型号对照表_精密机床主轴轴承,高端轴承进口清关报关流程

精密机床的主轴对轴承精度的要求非常高,我国目前在这一技术上仍然处于一片空白,那么高精度的轴承要怎么进口呢?高精度轴承进口这块其他国家管控得比较严格,高精度轴承的进口又会遇到哪些问题呢?在我们的生活中轴承几乎…

linux禁止切换到root,linux禁止普通用户切换至root用户的实例讲解

在上正文之前,我想先将一些基础的linux用户以及用户组的相关命令:1、添加用户useradd [-g group] [-d user_home_directory] [-p “your password”] Username-g 表示设置新增用户所属用户组-d 表示设置新增用户的主目录-p 表示设置新增用户的登录密码还…

python中new方法详解及_Python中new方法的详解

new_ 方法是什么?__new__方法其实就是创建对象的方法new()方法是在类准备将自身实例化时调用。一个类可以有多个位置参数和多个命名参数,而在实例化开始之后,在调用 init()方法之前,Python首先调用new()方法:def new(c…

linux 子域dns,linux下搭建DNS子域及相关授权详解

linux下搭建DNS子域及相关授权详解forward功能是本地无法解析的域名,转发给指定DNS服务器forward only; 所有无法解析的域名,都转发给指定DNS服务器,必须有解析结果forward first;无法解析的域名,转发给指定DNS服务器,…

python堆排序求topn_Java堆排序,取得前TopN个数

import java.util.Random;/*** Created with IntelliJ IDEA.* User: pengfei.hpf* Date: 14-4-29* Time: 上午11:45* To change this template use File | Settings | File Templates.*/public class HeapSortUtil {/*** 用堆排序方法 找出前N个最大的数* originalArray 原始数…

开机自启动程序关闭方法_电脑非常卡,总有软件偷偷自启动?学会这1招,永久关闭它们!...

小编有一个朋友,前段子发微信问我,说他的电脑非常卡,重装电脑后,会好转许多,非常流畅,但是过了几天又卡了。我问了他的电脑配置,首先电脑的配置是绝对ok。当前一流水平,后来我远程操…

linux c socket编程详解,Linux c 网络socket编程

#include int main(){int sockfd,new_fd;struct sockaddr_in my_addr;struct sockaddr_in their_addr;int sin_size;//建立TCP套接口if((sockfd socket(AF_INET,SOCK_STrEAM,0))-1){perror("socket");exit(1);}//初始化结构体,并绑定2323端口my_addr.sin…

python饮料购买_Python实现的一个自动售饮料程序代码分享

写这个程序的时候,我已学习Python将近有一百个小时,在CSDN上看到有人求助使用Python如何写一个自动售饮料的程序,我一想,试试写一个实用的售货程序。当然,只是实现基本功能,欢迎高手指点,新手学…