Onvif PTZControl 问题

Onvif PTZControl troubles

我正在使用 ONVIF 协议来控制网络摄像机。目前卡在不同相机的变焦控制上。我正在使用 PTZBinding wsdl [https://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl],尝试了 ContinuousMove 和 RelativeMove 函数,但它似乎在不同的相机上以不同的方式工作。

ContinuousMove 函数采用速度和超时,RelativeMove 函数采用矢量和速度。

我。例如,第一个摄像头与 ContinousMove 完美配合,但与 RelativeMove 配合使用时,它始终应用 maximum/minimus 缩放,第二个摄像头则相反。 没有尝试 AbsoluteMove,因为我找不到获取当前缩放值的方法。 找不到通用的方法来控制多个相机的变焦,请求您的帮助。

任何建议都会有帮助,如果需要我会提供源代码。

通过使用 GetStatus 获取当前缩放值,然后使用 AbsoluteMove 进行控制,解决了这个问题。有源码:

public void StartZoom (Direction direction)
    {
      if (zoomEnabled_)
      {
        var ptzStatus_ = ptzClient_.GetStatus(profile_.token);
        moveVector_.PanTilt = ptzStatus_.Position.PanTilt;
        moveVector_.Zoom = ptzStatus_.Position.Zoom;

        var zoomSpace = options_.Spaces.AbsoluteZoomPositionSpace;
        var minZoom = zoomSpace[0].XRange.Min;
        var maxZoom = zoomSpace[0].XRange.Max;

        moveVelocity_.Zoom.x = 0;

        if (direction.HasFlag(Direction.ZoomIn))
        {
          if (ptzStatus_.Position.Zoom.x + 1 / 20F <= maxZoom)
          {
            moveVelocity_.Zoom.x = velocityZoomIn_;
            moveVector_.Zoom.x += 1 / 20F;
          }
          else
          {
            moveVector_.Zoom.x = maxZoom;
          }

        }
        else if (direction.HasFlag(Direction.ZoomOut))
        {
          if (ptzStatus_.Position.Zoom.x - 1 / 20F >= minZoom)
          {
            moveVelocity_.Zoom.x = velocityZoomOut_;
            moveVector_.Zoom.x -= 1 / 20F;
          }
          else
          {
            moveVector_.Zoom.x = minZoom;
          }
        }

        ptzClient_.AbsoluteMove(profile_.token, moveVector_, moveVelocity_);
      }
    }