![](/img/trans.png)
[英]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.