如何使用ONVIF PTZ WSDL

4
我正在尝试使用http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl文件控制PTZ摄像机。
我可以无问题地使用GotoPreset函数,但是ContinuousMove函数会抛出ProtocolException异常。 this指南的第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个。额外的参数是超时,所以我认为这不会有太大的影响,但可能还有其他不同之处导致我的代码失败。
我阅读了this问题的答案,在其中该人说PTZ摄像机不支持ver20。但是当我将服务引用添加到wsdl中,并将ver20更改为ver10时,我收到一条消息,告诉我添加wsdl失败,因为它包含无法解析的链接。此外,当我将ver10 url(http://www.onvif.org/onvif/ver10/ptz/wsdl/ptz.wsdl)粘贴到我的Web浏览器中时,它显示一个xml,而不是wsdl。
如果我还没有使用正确的wsdl文件,我应该如何使用它,或者什么可以解决我当前设置的行为?
1个回答

4
我发现了解决方案。
事实证明,我误解了PtzClient.ContinuousMove中的超时参数。在先前的wsdl版本(ver10)中,每当您想要停止当前PTZ操作时,必须调用Stop函数。在wsdl ver20中,除非调用Stop函数,否则PTZ功能(除非指定超时参数)将持续一段时间。我以为它是响应超时或其他什么,但并不是。
现在调用ContinuousMove看起来像这样:
PtzClient.ContinuousMove(profile.token, velocity, "PT1S");

字符串中的数字表示 PTZ 动作持续的秒数。

希望对某些人有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接