[英]How to execute ContinuousMove with python zeep for onvif camera?
[英]python ONVIF Rotate Video Source on a Camera
我正在尝试通过 Python ONVIF 旋转所有 ONVIF 配置文件的视频源。 我正在使用 Python 3.8.1 和onvif_zeep
库:这是该库的链接
阅读ONVIF 主页上的文档后,我不清楚如何执行此操作。
我使用以下代码:
from onvif import ONVIFCamera
mycam = ONVIFCamera(Cam_ip,80,Onvif_User,Onvif_User_Pass) # the connection is done ok
media = mycam.create_media_service() # Media Service is ok
#Get The video source configurations
configurations_list = media.GetVideoSourceConfigurations() # Ok I get the Video Source configuration I wanted to select on id 0
video_source_configuration = configurations_list[0]
好的,现在我将视频源存储在video_source_configuration
中。 如果我打印它,我可以正确获取信息:
{
'Name': 'SOURCE_VIDEO',
'UseCount': 5,
'SourceToken': '0',
'Bounds': {
'x': 0,
'y': 0,
'width': 1820,
'height': 720
},
'_value_1': None,
'Extension': None,
'token': '0',
'_attr_1': {
}
}
即使我修改例如宽度或高度,我也可以毫无问题地执行此操作
video_source_configuration.width = 640
video_source_configuration.height = 420
request = media.create_type('SetVideoSourceConfiguration')
request.Configuration = video_source_configuration
request.ForcePersistence = True
media.SetVideoSourceConfiguration(request)
但我不知道如何修改Video_Source_Configuration
以将其旋转 90 或 270 度。 我已阅读 function media.GetVideoSourceConfigurationOptios()
并得到以下回复:
{
'BoundsRange': {
'XRange': {
'Min': 0,
'Max': 1280
},
'YRange': {
'Min': 0,
'Max': 720
},
'WidthRange': {
'Min': 0,
'Max': 1280
},
'HeightRange': {
'Min': 0,
'Max': 720
}
},
'VideoSourceTokensAvailable': [
'0'
],
'Extension': {
'_value_1': [
<Element {http://www.onvif.org/ver10/schema}Rotate at 0x243b6f4d2c0>
],
'Rotate': None,
'Extension': None
},
'_attr_1': None
}
我想我需要修改 Extension 字段和 Rotate 属性,但是阅读文档我不知道该怎么做。
我做了更多的测试。
首先,我尝试使用 python 2.7 和python-onvif 库。 但没有成功。
首先我发现了不同之处,当我收到 SetVideoSourceConfiguration 的请求时,我得到了以下结果:
>>> request = media.create_type('SetVideoSourceConfiguration')
>>> request
(SetVideoSourceConfiguration){
Configuration =
(VideoSourceConfiguration){
Name = None
UseCount = None
_token = ""
SourceToken = None
Bounds =
(IntRectangle){
_x = ""
_y = ""
_width = ""
_height = ""
}
Extension =
(VideoSourceConfigurationExtension){
Rotate =
(Rotate){
Mode =
(RotateMode){
value = None
}
Degree = None
Extension = <empty>
}
Extension = <empty>
}
}
ForcePersistence = None
}
阅读本文,我尝试做以下事情:
获取当前视频源配置:
vidsource = media.GetVideoSourceConfigurations()[0] vidsource (VideoSourceConfiguration){ _token = "0" Name = "VIDEO_SOURCE" UseCount = 5 SourceToken = "0" Bounds = (IntRectangle){ _y = 0 _width = 1280 _x = 0 _height =第720章
将其所有值复制到 request.Configuration。
request.Configuration.Name = vidsource.Name request.Configuration.UseCount = vidsource.UseCount request.Configuration._token = vidsource._token request.Configuration.Bounds = vidsource.Bounds
然后更改请求轮换模式:
request2.Configuration.Extension.Rotate.Mode.value='ON'
但是,如果我尝试发送请求,则会收到错误请求错误。
media.SetVideoSourceConfiguration(request) Traceback(最近一次调用最后一次):文件“”,第 1 行,在文件“C:\Python27\lib\site-packages\onvif\client.py”中,第 32 行,在包装中引发 ONVIFError( err) onvif.exceptions.ONVIFError: Unknown error: (400, u'Bad Request')
我尝试重复相同的步骤,但在不修改request.Configuration.Extension.Rotate.Mode.value
的情况下发送信息,只有 Degrees 字段,然后设备接受旋转,但它不起作用。
request.Configuration.Extension.Rotate.Mode.value=无 request.Configuration.Extension.Rotate.Degree = 90 media.SetVideoSourceConfiguration(request)
现在,当我获得视频源配置时,会出现旋转字段:
>>> media.GetVideoSourceConfigurations()
[(VideoSourceConfiguration){
_token = "0"
Name = "VIDEOSOURCE"
UseCount = 5
SourceToken = "0"
Bounds =
(IntRectangle){
_y = 0
_width = 1280
_x = 0
_height = 720
}
Extension[] =
(Extension){
Rotate[] =
(Rotate){
Mode[] =
"OFF",
},
},
}]
但是旋转模式始终处于“关闭”状态,我无法更改它。
最后我用 python 2.7 和python-onvif库解决了它
要选择“旋转”模式,您应该使用 sux 库中的 class 文本。
因此,以下代码运行良好,并且相机正确旋转了所有 ONVIF 流:
from onvif import ONVIFCamera
from suds.sax.text import Text
mycam = ONVIFCamera(Cam_ip,80,Onvif_User,Onvif_User_Pass)
media = mycam.create_media_service()
#Get The video source configurations
configurations_list = media.GetVideoSourceConfigurations()
video_source_configuration = configurations_list[0]
request = media.create_type('SetVideoSourceConfiguration')
request.Configuration.Name = video_source_configuration.Name
request.Configuration.UseCount = video_source_configuration.UseCount request.Configuration._token = video_source_configuration._token
request.Configuration.Bounds = video_source_configuration.Bounds
request.Configuration.SourceTokens = video_source_configuration.SourceTokens
#Now we perform a rotation of all ONVIF streams 90 Degrees.
request.Configuration.Extension.Rotate.Mode.value=Text(u'ON')
request.Configuration.Extension.Rotate.Degree = 90
#Add persistence to store the configuration in non volatile Memory
request.ForcePersistence = True
media.SetVideoSourceConfiguration(request)
它有效,但对于 python 2,对于 python 3,我目前还没有找到解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.