簡體   English   中英

python ONVIF 在攝像機上旋轉視頻源

[英]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
 }

閱讀本文,我嘗試做以下事情:

  1. 獲取當前視頻源配置:

    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章

  2. 將其所有值復制到 request.Configuration。

    request.Configuration.Name = vidsource.Name request.Configuration.UseCount = vidsource.UseCount request.Configuration._token = vidsource._token request.Configuration.Bounds = vidsource.Bounds

  3. 然后更改請求輪換模式:

    request2.Configuration.Extension.Rotate.Mode.value='ON'

  4. 但是,如果我嘗試發送請求,則會收到錯誤請求錯誤。

    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')

  5. 我嘗試重復相同的步驟,但在不修改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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM