一些背景信息:
我目前正在使用Visual Studio 2017和ONVIF .wsdl(OnvifMedia10和OnvifPTZService)制作一个c#Windows窗体应用程序。
我对目标摄像机具有管理员权限。
我从我创建的mediaClient中获得了一个配置文件:
var mediaEndPointAddress = new EndpointAddress($"http://{cameraAddress}/onvif/media");
var mediaEncoding = new TextMessageEncodingBindingElement
{
MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None)
};
var mediaBinding = new HttpTransportBindingElement
{
AuthenticationScheme = AuthenticationSchemes.Digest
};
var mediaCustomBinding = new CustomBinding(mediaEncoding, mediaBinding);
var mediaPasswordDigestBehavior = new PasswordDigestBehavior(userName, password);
mediaClient = new MediaClient(mediaCustomBinding, mediaEndPointAddress);
mediaClient.Endpoint.EndpointBehaviors.Add(mediaPasswordDigestBehavior);
var profs = mediaClient.GetProfiles();
profile = mediaClient.GetProfile(profs[0].token);
PasswordDigestBehavior
是我在此link上找到的一些代码的一部分。
我使用相同的方法来获取ptzClient及其配置:
...
var ptzEndpointAddress = new EndpointAddress($"http://{cameraAddress}/onvif/ptz");
ptzClient = new PTZClient(commonCustomBinding, ptzEndpointAddress);
ptzClient.Endpoint.EndpointBehaviors.Add(commonPasswordDigestBehavior);
var configs = ptzClient.GetConfigurations();
options = ptzClient.GetConfigurationOptions(configs[0].token);
然后我创建了一个PTZSpeed
变量来保持我希望相机移动的方式:
velocity = new OnvifPTZService.PTZSpeed();
velocity.PanTilt = new OnvifPTZService.Vector2D();
velocity.Zoom = new OnvifPTZService.Vector1D();
我的问题:
当我要旋转目标相机时,我使用某种PanLeft()
函数:
public void PanLeft()
{
if(Initialised && CanPanTilt)
{
velocity.PanTilt.x = options.Spaces.ContinuousPanTiltVelocitySpace[0].XRange.Min;
velocity.PanTilt.y = 0;
ptzClient.ContinuousMoveAsync(profile.token, velocity, "PT5S");
}
}
要停止相机,我将velocity.PanTilt.x
和velocity.PanTilt.y
改回零,然后再发送另一个异步移动请求。
几次移动/停止后,我与相机的连接不断丢失...
我想知道是否是因为我同时发出太多异步请求之类的东西...
起初,我认为问题出在我的网络上,因为我是通过wifi连接到摄像机的,但是我尝试通过以太网电缆直接连接它,但并没有改变...
我想知道我的操作方式是否正常,是否有更好的方法可以使我的应用程序不中断并接收标题错误(违反协议等)...
我还使用OnvifDeviceManager应用程序来指导自己完成该项目的开发过程,以了解我可以做和不能做的事情,但是似乎该应用程序在经过几次操作后便崩溃了/失去了与相机的连接的ptz动作...
答案 0 :(得分:0)
我认为问题在于,同时发送/接收的移动请求太多...
但是,我刚刚发现有一个ptzClient.Stop(profile.token, true, false)
函数可以完全满足我的需求...
如果第一个布尔值为true,则停止给定的ptzClient平移/倾斜,如果第二个布尔值为true,则停止缩放。
使用此命令时,我的应用程序的使用寿命似乎更长。
问题仍然存在,但是不常见!