大华摄像机视频正常云台控制半分钟后失效排查记录

场景

       现场后台流媒体服务器通过大华SDK取流和控制云台,视频流正常,云台控制在流媒体启动半分钟之内操作正常,半分钟之后控制失败。

排查过程

1)怀疑是大华SDK版本跟现场设备不匹配

进入这个误区是之前,遇到云台无法控制的情况,通过更新官网最新的SDK,解决问题,并且只是重新链接了新的LIB文件,并没有替换掉现场的动态库DLL文件,解决问题。与此不同的是之前是根本无法控制云台。

2)添加SDK云台控制API的调用情况,查看错误码,没有相关的错误信息,并且发现在半分钟之后,无法收到任何的控制指令。排查是否是大华SDK调用阻塞导致的问题,能够正常返回,说明也不是阻塞的问题

3)排查流媒体内部程序,云台控制指令的流向。流媒体的设计思路是启动一个线程等待客户端发送指令,其中调用C11的std::this_thread::sleep_for函数进行一段时间的休眠,发现半分钟之后休眠函数进入了阻塞模式,无法进行循环,采用Windows的原生态函数Sleep没有这个问题。这个时候考虑到是否是操作系统的版本问题,这个是2016版本的Windows Server DataCenter。怀疑是在该系统上执行该函数,兼容性有问题。在公司的虚拟机中安装测试,没有任何的问题,无法重现。

4)幸好,可以远程,通过观察服务器的时间,发现服务器的时间存在跳变的问题。设置中启动了自动设置时间,但是没有设置NTP同步时间服务器。每半分钟会进行跳变,回到过去的某一个时间点,没有什么规律。

5)最终通过取消自动设置时间解决问题

总结

1)不管是boost还是C11的休眠函数都存在相对睡眠时间的问题,针对的是系统的当前时间,Sleep就没有这个问题,Sleep函数不会根据系统的时间,猜测是根据程序的启动时间开始算

2)能够正常控制半分钟说明SDK没有兼容性问题。因为流媒体需要授权的缘故,其实部署一套在其他的电脑上,就可以过滤掉这个兼容性问题

猜你喜欢

转载自blog.51cto.com/fengyuzaitu/2631753