3

我正在尝试使用http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl文件控制 PTZ 摄像机。

我可以毫无问题地使用 GotoPreset 函数,但 ContinuousMove 函数会引发 ProtocolException。

指南的第 77 页显示了如何使用 ConinuousMove 函数的示例。

遵循本指南为我提供了以下代码:

        OnvifMediaClient.Profile[] profs = this.mediaClient.GetProfiles();
        OnvifMediaClient.Profile profile = mediaClient.GetProfile(profs[0].token);

        OnvifPTZ.PTZConfigurationOptions options = PtzClient.GetConfigurationOptions(profile.token);

        OnvifPTZ.PTZSpeed velocity = new OnvifPTZ.PTZSpeed();

        velocity.PanTilt = new OnvifPTZ.Vector2D();
        velocity.Zoom = new OnvifPTZ.Vector1D();

        velocity.PanTilt.x = options.Spaces.ContinuousPanTiltVelocitySpace[0].XRange.Max;
        velocity.PanTilt.y = options.Spaces.ContinuousPanTiltVelocitySpace[0].YRange.Max;
        velocity.PanTilt.space = options.Spaces.ContinuousPanTiltVelocitySpace[0].URI;
        velocity.Zoom.x = options.Spaces.ContinuousZoomVelocitySpace[0].XRange.Max;
        velocity.Zoom.space = options.Spaces.ContinuousZoomVelocitySpace[0].URI;

        PtzClient.ContinuousMove(profile.token, velocity, "1000");

        Thread.Sleep(2000);

        PtzClient.Stop(profile.token, true, true);

但与指南中的代码存在一些差异,例如实际的 ContinuousMove 函数在我的代码中需要 3 个参数,而不是指南中的 2 个。额外的参数是一个超时,所以我认为这不会有太大的不同,但也许其他一些不同的东西会导致我的代码失败。

我读了这个问题的答案,那个人说 PTZ 摄像机不支持 ver20。但是,当我添加对 wsdl 的服务引用并将 ver20 更改为 ver10 时,我收到一条消息,指出添加 wsdl 失败,因为它包含无法解析的链接。此外,当我在我的网络浏览器中粘贴 ver10 url ( http://www.onvif.org/onvif/ver10/ptz/wsdl/ptz.wsdl ) 时,它会显示 xml 而不是 wsdl。

如果我还没有使用正确的 wsdl 文件,或者什么可以解决我当前设置中的行为,我该如何使用它?

4

1 回答 1

2

我找到了解决方案。

原来我误解了 PtzClient.ContunuousMove 中的超时参数。在之前的 wsdl 版本 (ver10) 中,您必须在每次想要停止当前 PTZ 操作时调用 Stop 函数。在 wsdl 的第 20 版中,PTZ 函数(除非调用了 Stop 函数)将持续与 timeout 参数中指定的时间一样长。我以为这是响应超时或其他原因,但事实并非如此。

现在调用 ContinuousMove 如下所示:

PtzClient.ContinuousMove(profile.token, velocity, "PT1S");

其中字符串中的数字代表 PTZ 操作应持续的秒数。

希望它可以帮助某人。

于 2015-02-09T09:03:31.937 回答