海康摄像头sdk,通用协议onvif接入笔记(一)

项目背景是java,前端angular按照java的尿性做设备驱动如果没有底层支持的话直播会是个入坑点。

直播的方案如果不去说主流直播行业,摄像头只是单独的功能点的话,基本上都是绕不开ffmpeg的,有window系统直接用ffmpeg.exe拼接命令推流的,有使用javacv的。鉴于服务是多平台部署,windows,linux多端运行的,还是考虑一下兼容性采用javacv方案。

sdk方式和onvif方式不同点在于云台控制和预置点操作一个调用SDK,一个是采用onvif通信协议,两者实现方式不尽相同,但是效果大同小异。

话不多说,开干!

去海康平台下载最新的sdk的实例,文档写的比较杂,但是还是能找到对应版本的实现的。

先解决sdk调用动态库的问题,我们先需要一个sdk的实例。

写一个SdkInstanceUtil的工具类来创建sdk的实例


构造方法私有


获取实例和销毁实例的方法

加载实例需要注意windows加载实例和linux加载实例有区别,我们的动态库放在配置文件中,


配置动态库

动态库配置完成后,增加一个LoadRsource的类将动态库加载,sdk文档中有对应的加载方式,这里就不多写了,这是第一个避坑点,多读文档没坏处。(我是踩了几次的,因为我们是docker部署的,那个酸爽。。。。)

还是介绍一下docker里面dockerfile的傻瓜配置方式,就是容器加载动态库,不用增加loadResouce这个操作。


dockerfile环境变量声明

接下来就是调用sdk提供的接口进行业务组装的过程。

首先我们是两套sdk,windows和linux版本的,也就是说我们会有两套sdk的接口代码,但是我们的业务可以只写一套撒,面向接口编程撒,

我们首先抽象出一套接口,建一个接口叫SdkProxyService,当当当当,粗线吧:


sdk接口

接下来需要实现一下具体平台对应的service


sdk对应实现

然后根据平台注入对应的service,


注入

接下来就是我们的业务接口了,再写一个接口,这个就是我们的业务组装,需要sdk中哪些业务组合起来构成我们自身的业务逻辑。

具体的实现应该是播放,云台和预置点操作等等:


业务接口

sdk的实时播放有提供回调的方式和不提供回调的方式,两者区别不大,基本上都有返回播放句柄的参数,但是问题在于sdk播放时给的流是ps码流,前端是无法直接播放的,关于ps码流抽流的操作比较复杂,我翻了一篇文档大概十几万字,看自闭了。

实时播放采用rtsp->javacv->rtmp容器,前端播放rtmp或者http地址。这里需要增加一个rtmp的容器。

推流引包:


依赖

真正的坑来了哈。

开始进坑,这个坑怎么说呢,rtsp协议是一种流媒体的协议,可以远程查看摄像头画面,但是问题是前端浏览器么有一款播放器可以播放rtsp的流,有童鞋就说了 ,我可以用vlc插件,vlc可以,但是chrome41以上就不支持了,ie是可以的,火狐也不行,有童鞋又说了我们可以用websocket中转帧,这就是另外的解决方案了,我们随后再讲,先讲javacv的拉流推流的操作。

采用h264转flv的方式直接转码推,talk is cheap,show me the code!


构建录制器


设置参数


返回参数
解码器

先把录制器和解码器构建完毕后放入线程开始推画面


推流线程

推流线程中有一个录制器的结束标识,这里的作用主要是用来结束线程,之前用的callable这里后来改掉了可以改成runnable,这里的直播采用的是多个用户看一个,也就是说一个摄像头只推一路,再来一个人就把redis里面的计数器+1,当最后一个人关掉视频时,将录制器里的结束输入流置为true,这时候线程就可以结束了。

dto.getGrabber().setCloseInputStream(true);

如果是多实例部署的话,需要注意访问实例是否是推流线程所在实例,我们这边采用的是kafka广播做的,当然这种方法比较懒省事,可以记录一下实例id去调对应实例的接口,多实例必然要用redis在记录当前设备推流的信息,避免多个实例同时推一个设备的现象,比较浪费资源。

sdk可能会出现临时文件限制的问题,这个百度一下即可解决,转码需要关注内存消耗情况。

再讲一下websocket代理转帧的方式,以上方案采用的方式大体流程如下:

rtsp->ffpmeg->rtmp->前端

其中rtmp是一个容器,websocket转帧的话采用的方式与这个方式大同小异前面两部分不变,不再使用rtmp容器而是将流推入websocket服务器,前端使用jsmpeg.js将websocket中的帧画面绘制在canvas中。

推流方式不变将转码的方式由flv变为mpeg1video(敲黑板),推流地址变为一个websocket服务器,前端不再使用vedio.js这种播放器啦。具体实现方式看各自项目需求。下篇讲onvif。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容