繁体   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