背景
视频监控软件以往一直使用各相机厂家的SDK操作相机,包括预览、云台等操作。厂家的不同、相机型号不同、相机版本不断更新、生产环境(Windows、麒麟)等因素,不断变更的情况下软件为了做各种适配性适应,其中包含的SDK实在太多了,维护起来很困难,而且有的甚至还冲突不能兼容,所以视频监控做web端趋势明显,预览可以通过流媒体转码来做,云台控制可以使用onvif。
介绍
onvif本身就是做这个事的,现在各厂家的相机基本都支持onvif协议,即使不带云台的相机也支持onvif协议。
我们在网页中预览的工作已经完成,现在就开始做云台控制,网页中操作云台区域,通过http发送到onvif服务中,使用Java调用onvif指令完成操作。
项目
https://gitee.com/premeditate/OnvifServer.git
主要的是/lib里面的jar包,提供了onvif的一些列操作
jar包下载地址:https://github.com/milg0/onvif-java-lib
项目中提供了网页中所需的服务,你可能只能运行起来,连上相机也不能用,因为这里有关于流媒体服务的接口,其它接口都是可用的,使用本地相机做测试是可以的,可以参考/test里面的测试代码。
onvif工作流程就是根据相机的基本信息创建onvif设备对象,这个对象可以获取到相机的设备信息、视频流信息(RTSP地址)、视频参数等,还有onvif连接相机的token、云台控制对象等,在这里我们需要的就是云台控制对象,拿到这个对象调用指定函数就可以控制云台。
在测试中发现,创建onvif对象耗时1.8s,获取token耗时0.8s,获取云台控制对象0.2s,调用控制函数80s,在整个操作过程中可以看到大部分时间都是在初始化对象上面,会让用户感觉到卡,操作过一会才有反应。所以在项目中我们在程序启动时根据相机信息就将这些操作对象创建出来存储在内存中(测试发现这些对象只要初始化出来,使用中即使相机断电离线,再次上电还是可以接着用的),api中拿到这些对象直接用,这样基本就是用户一操作就用响应,速度还是很快的。但是这样有一个弊端,程序启动就读取配置文件,在程序运行中修改了配置文件是不能立即生效的,需要重启程序才行。
服务api都在MonitorController.java中,提供了云台相关的几个接口。