最近项目中需要用到海康威视的摄像头进行实时视频、回放、预警等功能。现记录一下开发过程中遇到的问题。
先下载安装海康插件VideoWebPlugin.exe
在index.html内插入三个所需js文件(海康提供),并且三个文件必须放在static目录下,切勿放在src目录。
<!-- 海康威视isc插件 --> <script src="static/js/jquery-1.12.4.min.js"></script> <script src="static/js/jsWebControl-1.0.0.min.js"></script> <script src="static/js/jsencrypt.min.js"></script>我将视频模块单独做成一个组件,以后可以按需加入不同项目。(以实时为例,回放同理)
<template> <div id="playWnd" class="playWnd" style="left: 109px; top: 133px;"></div> </template> <script> import { getVideoPlatformId } from "@/api/video/realTimeVideo"; export default { data() { return { //声明公用变量 initCount: 0, //初始化参数 initparam: { appKey: "", secret: "", apiIp: "", apiPort: 443, layout: "2x2" //这里是来控制你一开始初始化之后的分屏的 }, //监控点编号 pointCode: "", pubKey: "", oWebControl: null, WebControl: null }; }, props: ["videoPlatformId", "indexCode"], created() { //调用电脑中的插件 this.WebControl = WebControl; }, watch: { indexCode: function(newVal, oldVal) { this.pointCode = newVal; this.startpreview(); } }, mounted() { //获取初始话所需的参数 this.getInitParam(); //页面加载时创建播放实例初始化 this.initPlugin(); // 监听resize事件,使插件窗口尺寸跟随DIV窗口变化 $(window).resize(() => { if (this.oWebControl != null) { this.oWebControl.JS_Resize(1000, 600); this.setWndCover(); } }); // 监听滚动条scroll事件,使插件窗口跟随浏览器滚动而移动 $(window).scroll(() => { if (this.oWebControl != null) { this.oWebControl.JS_Resize(1000, 600); this.setWndCover(); } }); }, beforeDestroy() { this.closeWindow();//关闭插件 }, methods: { //获取密钥 getInitParam() { if(window.localStorage.getItem("nowPreviewLayout")){ this.initparam.layout=window.localStorage.getItem("nowPreviewLayout") } getVideoPlatformId(this.videoPlatformId).then(res => { this.initparam.appKey = res.data.appkey; this.initparam.secret = res.data.secret; this.initparam.apiIp = res.data.platformPath.split(":")[0]; this.initparam.apiPort = res.data.platformPath.split(":")[1]; this.init(); }); }, //创建播放实例 initPlugin() { this.oWebControl = new WebControl({ szPluginContainer: "playWnd", // 指定容器id iServicePortStart: 15900, // 指定起止端口号,建议使用该值 iServicePortEnd: 15909, szClassId: "23BF3B0A-2C56-4D97-9C03-0CB103AA8F11", // 用于IE10使用ActiveX的clsid cbConnectSuccess: () => { // 创建WebControl实例成功 this.oWebControl .JS_StartService("window", { // WebControl实例创建成功后需要启动服务 dllPath: "./VideoPluginConnect.dll" // 值"./VideoPluginConnect.dll"写死 }) .then( () => { // 启动插件服务成功 this.oWebControl.JS_SetWindowControlCallback({ // 设置消息回调 cbIntegrationCallBack: this.cbIntegrationCallBack() // 封装的推送消息方法 }); this.oWebControl.JS_CreateWnd("playWnd", 1000, 600).then(() => { //JS_CreateWnd创建视频播放窗口,宽高可设定 this.getInitParam(); // 创建播放实例成功后初始化 }); }, function() { // 启动插件服务失败 } ); }, cbConnectError: () => { // 创建WebControl实例失败 this.oWebControl = null; this.WebControl.JS_WakeUp("VideoWebPlugin://"); // 程序未启动时执行error函数,采用wakeup来启动程序 this.initCount++; if (this.initCount < 3) { setTimeout(() => { this.initPlugin(); // 重新创建播放实例 }, 3000); } else { console.log("插件启动失败,请检查插件是否安装!"); } }, cbConnectClose: bNormalClose => { // 异常断开:bNormalClose = false // JS_Disconnect正常断开:bNormalClose = true this.oWebControl = null; } }); }, // 设置窗口控制回调 setCallbacks() { this.oWebControl.JS_SetWindowControlCallback({ cbIntegrationCallBack: this.cbIntegrationCallBack // 封装的推送消息方法 }); }, // 推送消息 cbIntegrationCallBack(oData) { //oData是封装的视频web插件回调信息的消息体 // console.log(JSON.stringify(oData.responseMsg)); //此处为视频web插件消息json报文字符串 }, //初始化 init() { this.getPubKey(() => { // 请自行修改以下变量值 var appkey = this.initparam.appKey; //综合安防管理平台提供的appkey,必填 var secret = this.setEncrypt(this.initparam.secret); //综合安防管理平台提供的secret,必填 var ip = this.initparam.apiIp; //综合安防管理平台IP地址,必填 var playMode = 0; //初始播放模式:0-预览,1-回放 var port = this.initparam.apiPort; //综合安防管理平台端口,若启用HTTPS协议,默认443 port = parseInt(port); var snapDir = "D:\\SnapDir"; //抓图存储路径 var videoDir = "D:\\VideoDir"; //紧急录像或录像剪辑存储路径 var layout = this.initparam.layout; //playMode指定模式的布局 var enableHTTPS = 1; //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1 var encryptedFields = "secret"; //加密字段,默认加密领域为secret var showToolbar = 1; //是否显示工具栏,0-不显示,非0-显示 var showSmart = 1; //是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示 var buttonIDs = "0,16,256,257,258,259,260,512,513,514,515,516,517,768,769"; //自定义工具条按钮 // 请自行修改以上变量值 this.oWebControl .JS_RequestInterface({ //通用请求响应接口 funcName: "init", // 功能标识 argument: JSON.stringify({ appkey: appkey, //API网关提供的appkey secret: secret, //API网关提供的secret ip: ip, //API网关IP地址 playMode: playMode, //播放模式(决定显示预览还是回放界面) port: port, //端口 snapDir: snapDir, //抓图存储路径 videoDir: videoDir, //紧急录像或录像剪辑存储路径 layout: layout, //布局 enableHTTPS: enableHTTPS, //是否启用HTTPS协议 encryptedFields: encryptedFields, //加密字段 showToolbar: showToolbar, //是否显示工具栏 showSmart: showSmart, //是否显示智能信息 buttonIDs: buttonIDs //自定义工具条按钮 }) }) .then(oData => { this.oWebControl.JS_Resize(1000, 600); // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题 this.startpreview(); //初始化后开启预览 }); }); }, //获取公钥 getPubKey(callback) { this.oWebControl .JS_RequestInterface({ //通用请求响应接口 funcName: "getRSAPubKey", // 功能标识 argument: JSON.stringify({ keyLength: 1024 // 秘钥长度,可选1024或2048 }) }) .then(oData => { if (oData.responseMsg.data) { // 当code为-1时无data字段 this.pubKey = oData.responseMsg.data; // 返回的数据,如RSA公钥 callback(); } }); }, //RSA加密 setEncrypt(value) { var encrypt = new JSEncrypt(); encrypt.setPublicKey(this.pubKey); return encrypt.encrypt(value); }, // 设置窗口裁剪,当因滚动条滚动导致窗口需要被遮住的情况下需要JS_CuttingPartWindow部分窗口 setWndCover() { var iWidth = $(window).width(); var iHeight = $(window).height(); var oDivRect = $("#playWnd") .get(0) .getBoundingClientRect(); var iCoverLeft = oDivRect.left < 0 ? Math.abs(oDivRect.left) : 0; var iCoverTop = oDivRect.top < 0 ? Math.abs(oDivRect.top) : 0; var iCoverRight = oDivRect.right - iWidth > 0 ? Math.round(oDivRect.right - iWidth) : 0; var iCoverBottom = oDivRect.bottom - iHeight > 0 ? Math.round(oDivRect.bottom - iHeight) : 0; iCoverLeft = iCoverLeft > 1000 ? 1000 : iCoverLeft; iCoverTop = iCoverTop > 600 ? 600 : iCoverTop; iCoverRight = iCoverRight > 1000 ? 1000 : iCoverRight; iCoverBottom = iCoverBottom > 600 ? 600 : iCoverBottom; this.oWebControl.JS_RepairPartWindow(0, 0, 1001, 600); // 多1个像素点防止还原后边界缺失一个像素条 if (iCoverLeft != 0) { this.oWebControl.JS_CuttingPartWindow(0, 0, iCoverLeft, 600); } if (iCoverTop != 0) { this.oWebControl.JS_CuttingPartWindow(0, 0, 1001, iCoverTop); // 多剪掉一个像素条,防止出现剪掉一部分窗口后出现一个像素条 } if (iCoverRight != 0) { this.oWebControl.JS_CuttingPartWindow( 1000 - iCoverRight, 0, iCoverRight, 600 ); } if (iCoverBottom != 0) { this.oWebControl.JS_CuttingPartWindow( 0, 600 - iCoverBottom, 1000, iCoverBottom ); } }, //视频“预览”功能 startpreview() { //切换视频后得到当前layout this.oWebControl.JS_RequestInterface({ funcName:"getLayout" }).then(res=>{ let nowPreviewLayout = (JSON.parse(res.responseMsg.data))["layout"] localStorage.setItem("nowPreviewLayout",nowPreviewLayout) }) let cameraIndexCode = this.pointCode; //获取输入的监控点编号值,必填 let streamMode = 0; //主子码流标识:0-主码流,1-子码流 let transMode = 1; //传输协议:0-UDP,1-TCP let gpuMode = 0; //是否启用GPU硬解,0-不启用,1-启用 let wndId = -1; //播放窗口序号(在2x2以上布局下可指定播放窗口) //去除cameraIndexCode内前后的空格 cameraIndexCode = cameraIndexCode.replace(/(^\s*)/g, ""); cameraIndexCode = cameraIndexCode.replace(/(\s*$)/g, ""); this.oWebControl.JS_RequestInterface({ funcName: "startPreview", argument: JSON.stringify({ cameraIndexCode: cameraIndexCode, //监控点编号 streamMode: streamMode, //主子码流标识 transMode: transMode, //传输协议 gpuMode: gpuMode, //是否开启GPU硬解 wndId: wndId //可指定播放窗口 }) }); }, //停止全部预览功能 stopAllPreview() { this.oWebControl.JS_RequestInterface({ funcName: "stopAllPreview" }); }, //关闭视频窗口 closeWindow() { if (this.oWebControl != null) { this.oWebControl.JS_HideWnd(); // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题 this.oWebControl.JS_Disconnect().then( () => { // 断开与插件服务连接成功 }, () => { // 断开与插件服务连接失败 } ); } } } }; </script>这样就可以看到摄像头画面了! 根据左侧生成的摄像头设备树,点击去获取设备code,生成相应的实时图像。