大华监控

[TOC]

一、为什么重构?

  • 原调用方法过于复杂,使用者需要花时间阅读代码、关注插件内部实现,所以需要重构,让使用者无需关心内部逻辑,轻松实现我们所支持的视频相关业务。

二、设计构思

将 <u>videoPlayer.js</u>(与C++服务进行交互的方法库) 和 <u>DHPlayer.vue</u>打成一个DHPlayer.js,非Vue环境下也可使用。两种引用方式如下:

原生h5下——引入后可直接使用VideoPlayer对象:(Vue下也可如此引用,全局vue对象会自动注册DHPlayer组件)

    <script src="/static/DHPlayer.js"></script>

Vue下:

    import DHPlayer from 'static/DHPlayer.js'
    Vue.use(DHPlayer)
  • videoPlayer.js

基本功能:

1、窗口初始化:websocket尝试连接服务,包含成功回调与失败回调
- 连接规则:目前是对localhost:8000-8004端口进行遍历连接,如果全都不通就请求打开DHPlayer服务,无论点击打开还是取消(<font color="red">web无法捕获</font>),在此过程中都会进行重连,直到连通或1分钟以后自动删除重连定时器。
- 成功回调:触发成功回调,并创建窗口(根据是否需要创建窗口参数,默认需要创建)
- 失败回调:连续1分钟无法连接,触发失败回调。
- 注:如果创建多个视频窗口,将会在同一个websocket连接中进行通信,该websocket连接将会作为全局对象绑定到windows上。

2、创建/销毁窗口、窗口显示/隐藏、窗口滚动

> 这些基本功能都会独立的方法,可直接使用,但是一般使用场景(如下)都在内部进行封装。
  • 监听页面刷新、销毁事件,通知服务销毁窗口。
  • 监听页面显隐事件(切换浏览器页签、最小化浏览器等会触发该事件),通知服务显隐窗口。
  • 监听浏览器窗口的放大缩小、滚动事件,会重新获取传入挂载窗口dom节点的位置,通知服务调整窗口位置。

3、录像回放、实时预览

  • 可通过在初始化的时候传定义好的type类型,内部根据type来调用发送对应的消息。

4、每个功能都会提供对应的回调方法

传参params:

为了使用的方便,决定在初始化的时候可以直接传入所有的参数,使用方法如下:

var oVideoControl = new VideoPlayer({
       videoId: 'DHVideoPlayer',
       createWindow: true,
       connectSuccess: function () {
           console.log('ws初始化成功')
       },
       connectClose: function () {
           oVideoControl = null
       },
       creatSuccess(e) {
           console.log(e) //窗口创建成功
       }
   })

传参API

参数名 类型 必传 作用 默认值
videoId String 用户定义的 video 容器的 id 属性值
createWindow Boolean 是否需要初始化创建窗口 true
windowType Number 窗口类型:0-普通预览,1-普通回放(含分屏、不含时间轴),2-预览(不含分屏),3-录像回放(不含分屏、含时间轴)
mount Boolean 挂载方式(true:挂载为浏览器子窗口;false:独立窗口) true
chooseWindow Number 服务支持的选择窗口功能,不知道什么应用场景,先加上
num Number 子窗口数量,可选值:1、4、9、16 1
showBar Boolean 是否显示下方控制栏。 true: 显示, false:隐藏 true
shieldClass Array 遮挡的元素类名数组
windowParams Array 窗口的对象数组 []
> path String 视频url
> snum Number 子窗口编号(从0开始)
> type Number 1-实时视频,2-录像回放
> startTime Number 当前播放的录像开始时间的时间戳
> endTime Number 当前播放的录像结束
> redirect Boolean 是否重定向
> records Array 传值具体需参考大华播放控件开发手册
> 其他传值 -- -- 传值具体需参考大华播放控件开发手册
callback -------- -- 回调方法对象(e: 统一返回ws响应消息体;若没有触发回调,可能是插件不支持该功能)
connectSuccess function(e) websocket初始化连接成功回调
connectError function(e) websocket初始化连接失败后的回调
creatSuccess function(e) 创建窗口成功回调
creatError function(e) 创建窗口失败回调
destroySuccess function(e) 销毁成功回调
destroyError function(e) 销毁失败回调
playbackSuccess function(e) 录像回放成功
playbackError function(e) 录像回放失败(返回值没有 snum,所以不知道哪个失败,需要c++服务加上)
realTimeSuccess function(e) 实时预览成功
realTimeError function(e) 实时预览失败(返回值没有 snum,多窗口所以不知道哪个失败,需要c++服务加上)
chooseWindowSuccess function(e) 选择窗口成功
chooseWindowError function(e) 选择窗口失败
showWindowSuccess function(e) 显示窗口成功
showWindowError function(e) 显示窗口失败
hideWindowSuccess function(e) 隐藏窗口成功
hideWindowError function(e) 隐藏窗口失败

VideoPlayer对象内置属性

参数名 类型(option: 具体参照大华播放控件开发手册) 作用
windowState string 视频大窗口状态(wsPending-websocket正在连接,wsFail-websocket连接失败, wsSuccess-websocket连接成功, createPending-正在创建窗口, createFail-窗口创建失败, createSuccess-窗口创建成功)
getWindowState Function(callback) 获取所有小窗口的状态,callback返回ws返回值
getVersion Function(callback) 获取DHPlayer服务版本,callback返回ws返回值
create Function(option, callback) 创建视频窗口
chooseWindow Function(option, callback) 选择视频窗口
realmonitor Function(option, callback) 播放实时视频
playback Function(option, callback) 播放录像回放
resizePage Function(option, callback) 重置窗口位置、大小
showControlBar Function(show) 显示下方控制栏, show: true-显示,false-隐藏
hide Function(callback) 隐藏窗口
show Function(callback) 显示窗口
WindowShield Function(option: {shieldClass: ['视频被遮挡的dom节点class']}, callback) 视频被遮挡处理
destroy Function(callback) 销毁窗口
  • DHPlayer.vue

基于 videoPlayer.js封装的的VUE组件,包含 <u>DOM节点</u> 和 <u>基础方法</u>(目前包含初始化窗口后播放视频),以及获取token、对视频路径进行token拼接等业务处理。

包含业务

  1. 判断本地视频插件是否安装(websocket连接1分钟后还未连接成功,提示安装插件)
  2. 比较本地插件与线上的版本,如果本地插件版本低于线上插件,提示更新(在websocket连接成功后拿到版本号,再调brm的获取插件信息的接口获取版本号进行比较)【该提示基于ICC框架实现,下载地址为服务器上固定路径,UI基于ant-design-vue,第三方可自行进行修改。】
  3. websocket连接成功以后,创建窗口,子窗口数量根据通道个数或者rtsp地址数量进行计算,1(length = 1)、4(1 < length <= 4)、9(4 < length <= 9)、 16(9 < length <= 16)
  4. 窗口创建成功以后,
    • 如果有rtsp路径传入(pathList),根据type去调用对应的录像回放/实时预览方法加载视频;
    • 如果没有路径,需要传入videoPlayList/realTimeList,根据type并通过传入的streamType(不传按照路数判断,超过4路自动默认辅码流,不超过默认是主码流)、channelId 获取对应的视频流地址,如果流地址端口为9090端口时,需要重定向(redirect=true),不需要加 token,其他端口均不需要重定向,从获取rtsp接口中拿到token并拼上。然后再根据type去调用对应的方法加载视频。

调用方法

<template>
    <DHPlayer :type="1" :windowType="0" :realTimeList="realTimeList"/>
</template>
<script>
    import DHPlayer from 'DHPlayer'
    export default {
        data() {
            return {
                realTimeList: [
                    {streamType: 1, channelId: '111$120'},
                    {streamType: 2, channelId: '111$121'}
                ]
            }
        }
    }
</script>

传参

参数名 类型 必传 作用 默认值
videoId String dom节点ID
type Number 1-实时视频,2-录像回放
num Number 子窗口个数 1
connectTime Number 尝试连接事件,默认60s,一定时间连接断开,并弹出下载插件提示 60
outContent Object 当前窗口所处可视窗口的位置,比如iframe外部距离浏览器的位置 {}
videoPlayList Array 包含多个录像回放对象 []
> ssId String SS服务ID
> endTime String 结束时间(时间戳:单位秒)
> startTime String 开始时间(时间戳:单位秒)
> fileName String 录像文件信息
> diskId String 磁盘ID
> recordSource Number 录像来源:1=全部,2=设备,3=中心
> recordType Number 录像类型:0=全部,1=手动录像,2=报警录像,3=动态监测,4=视频丢失,5=视频遮挡,6=定时录像,7=全天候录像,8=文件录像转换
> channelId String 通道编码
> playbackMode Number 回放模式:0=普通回放,1=实时回放
> streamId String 码流处理
> 一些其他参数(待收集) String wiki无
realTimeList Array 包含多个实时预览对象 []
> streamType Number 码流类型:1=主码流, 2=辅码流 不传按照路数判断,超过4路自动默认辅码流,不超过默认是主码流
> channelId String 通道编码
> dataType Number 视频类型:1=视频, 2=音频, 3=音视频 1
pathList Array 录像回放/实时视频路径列表(实时视频-string数组['rtsp://xx/'];录像回放-对象数组[{path:'rtsp://xx/'}],录像回放传参如下)
> path String 视频路径
> endTime String 录像回放结束时间
> startTime String 录像回放结束时间
> recordType String 录像文件类型 0 所有,1 手动录像,2 报警录像,3 动态检测,4 视频丢失,5 视频遮挡,6 定时录像,7 全天候录像,8 文件录像转换,9 普通录像,11 智能录像,25 卡号录像,10 报警开始(匹配协议栈里的定义 10~300 -m -f -c 等特殊报警),1000 智能 报 警 结 束 ( 匹 配 协 议 栈 里 的 定 义300~1000 智能报警)
> recordName String 录像文件名
> fileLength String 单位为 kb
windowType Number 窗口类型:0-普通预览,1-普通回放(含分屏、不含时间轴),2-预览(不含分屏),3-录像回放(不含分屏、含时间轴)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容