vue项目对接海康威视监控视频

海康视频WEB插件下载

在 public 文件夹内的index.html 移入以下js

<script type="text/javascript" src="js/jquery-1.12.4.min.js"></script>
<script type="text/javascript" src="js/jsencrypt.min.js"></script>
<script type="text/javascript" src="js/web-control_1.2.5.min.js"></script>

<template>
    <div class="app-container" id="videoPlayerBox" ref="videoPlayerBox">
        <el-row :gutter="10" style="margin-bottom: 20px">
            <el-col :span="1.5">
                <el-input clearable v-model.trim="queryParams.cameraName" placeholder="请输入监控名称" size="small" maxlength="50" @keyup.enter.native="previewVideo" />
            </el-col>
            <el-col :span="1.5">
                <el-button icon="el-icon-search" size="small" type="primary" @click="getCodeList">查询</el-button>
            </el-col>
            <el-col :span="1.5">
                <el-button :disabled="isPlay" icon="el-icon-switch-button" plain size="small" type="primary"
                           @click="previewVideo" :class="isPlay == false ? 'el_btn_primary' : ''">开始预览
                </el-button>
            </el-col>
            <el-col :span="1.5">
                <el-button :disabled="!isPlay" :class="!isPlay == true?'':'el_btn_danger'"
                           icon="el-icon-circle-close" plain size="small" type="danger"
                           @click="handleClose">停止预览
                </el-button>
            </el-col>
        </el-row>
        <div id="playBox" v-html="oWebControl === null ? playText : ''"></div>
    </div>
</template>

<script>
import {getCameraIndexCodeList} from '@/api/operation/securitySurveillance'

export default {
    name: 'videoPlayer',
    data() {
        return {
            imgUrl:require('@/assets/videoImg/none.png'),
            oWebControl: null,
            pubKey: '', // 公钥
            appkey: '',
            secret: '',
            ip: '',
            port: '443',
            width: 1000,//播放器宽
            height: 600,
            playHeight: 500,//播放器高
            layout: '3x3',//视窗
            left: '',
            top: '',
            buttonIDs: '0,16,256,257,258,259,260,512,513,514,515,516,517,768,769',
            toolBarButtonIDs:'2049,2050,4097,4098,4099,4100',//
            initCount: 0,
            playMode: 0, // 0 预览 1回放
            playText: '启动中。。。',
            cameraIndexCode: '', // 监控点编号
            wndId: 1,//窗口编号
            codeList:[],
            // 查询参数
            queryParams: {
                pageNo: 1,
                pageSize: 9,
                cameraName: null,
            },
            isPlay: true,//是否在播放
        }
    },
    methods: {
        handleClose() {
            if (this.oWebControl) {
                this.oWebControl.JS_RequestInterface({
                    funcName: "stopAllPreview"
                });
                this.isPlay = false;
            }
        },
        // 推送消息
        cbIntegrationCallBack(oData) {
            console.log(oData, '推送消息');
        },
        // RSA加密
        setEncrypt(value) {
            /* eslint-disable */
            let encrypt = new JSEncrypt();
            encrypt.setPublicKey(this.pubKey);
            return encrypt.encrypt(value);
        },
        initPlugin(callback) {
            /* eslint-disable */
            let that = this;
            this.oWebControl = new WebControl({
                szPluginContainer: "playBox",                       // 指定容器id
                iServicePortStart: 15900,                           // 指定起止端口号,建议使用该值
                iServicePortEnd: 15909,
                szClassId: "23BF3B0A-2C56-4D97-9C03-0CB103AA8F11",  // 用于IE10使用ActiveX的clsid
                cbConnectSuccess: function () {                     // 创建WebControl实例成功
                    that.oWebControl.JS_StartService("window", {      // WebControl实例创建成功后需要启动服务
                        dllPath: "./VideoPluginConnect.dll"             // 值"./VideoPluginConnect.dll"写死
                    }).then(function () {                             // 启动插件服务成功
                        that.oWebControl.JS_SetWindowControlCallback({  // 设置消息回调
                            cbIntegrationCallBack: that.cbIntegrationCallBack
                        });

                        that.oWebControl.JS_CreateWnd("playBox", that.width, that.playHeight).then(function () { // JS_CreateWnd创建视频播放窗口,宽高可设定
                            that.init(callback);  // 创建播放实例成功后初始化
                        });
                    }, function () { // 启动插件服务失败
                    });
                },
                cbConnectError: function () { // 创建WebControl实例失败
                    that.oWebControl = null;
                    that.playText = '插件未启动,正在尝试启动,请稍候...';
                    WebControl.JS_WakeUp("VideoWebPlugin://"); // 程序未启动时执行error函数,采用wakeup来启动程序
                    that.initCount++;
                    if (that.initCount < 3) {
                        setTimeout(function () {
                            that.initPlugin();
                        }, 3000)
                    } else {
                        that.playText = '<img src="'+that.imgUrl+'" alt="" style="margin-left: 50%;transform: translate(-50%,0);margin-top: 120px;"><p style="text-align: center;color: #A20808;font-size: 18px;">插件启动失败,请检查插件是否安装!</p><a target="_blank" style="display: inline-block;width: 100%;color: #215aab;text-align:center;text-decoration: underline;font-size: 20px" href="http://xx.com/webcontrol.exe">下载地址(软件大小:62.7MB)</a>';
                    }
                },
                cbConnectClose: function (bNormalClose) {
                    // 异常断开:bNormalClose = false
                    // JS_Disconnect正常断开:bNormalClose = true
                    console.log("cbConnectClose");
                    that.oWebControl = null;
                }
            });
        },
        // 获取公钥
        getPubKey(callback) {
            this.oWebControl.JS_RequestInterface({
                funcName: "getRSAPubKey",
                argument: JSON.stringify({
                    keyLength: 1024
                })
            }).then((oData) => {
                if (oData.responseMsg.data) {
                    this.pubKey = oData.responseMsg.data;
                    callback()
                }
            })
        },
        init(callback) {
            let that = this;
            this.getPubKey(() => {
                //  请自行修改以下变量值
                let appkey = this.appkey;                    // 综合安防管理平台提供的appkey,必填
                let secret = that.setEncrypt(this.secret);   // 综合安防管理平台提供的secret,必填
                let ip = this.ip;                            // 综合安防管理平台IP地址,必填
                let playMode = this.playMode;                // 初始播放模式:0-预览,1-回放
                let port = 443;                              // 综合安防管理平台端口,若启用HTTPS协议,默认443
                let snapDir = "D:\\SnapDir";                 // 抓图存储路径
                let videoDir = "D:\\VideoDir";               // 紧急录像或录像剪辑存储路径
                let layout = this.layout;                    // playMode指定模式的布局
                let enableHTTPS = 1;                         // 是否启用HTTPS协议与综合安防管理平台交互,是为1,否为0
                let encryptedFields = 'secret';	             // 加密字段,默认加密领域为secret
                let showToolbar = 1;                         // 是否显示工具栏,0-不显示,非0-显示
                let showSmart = 0;                           // 是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示
                let buttonIDs = this.buttonIDs;              // 自定义工具条按钮
                let toolBarButtonIDs = this.toolBarButtonIDs;// 自定义工具栏
                // /// 请自行修改以上变量值
                that.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,                      // 自定义工具条按钮
                        toolBarButtonIDs: toolBarButtonIDs,        // 自定义工具条按钮
                    })
                }).then((oData) => {
                    that.oWebControl.JS_Resize(that.width, that.playHeight);  // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
                    if (callback) {
                        callback();
                    }
                });
            });
        },
        previewVideo() {
            // let cameraIndexCode = this.cameraIndexCode;      // 获取输入的监控点编号值,必填
            let streamMode = 0;                              // 主子码流标识:0-主码流,1-子码流
            let transMode = 0;                               // 传输协议:0-UDP,1-TCP
            let gpuMode = 0;                                 // 是否启用GPU硬解,0-不启用,1-启用
            let wndId = 0;                          // 播放窗口序号(在2x2以上布局下可指定播放窗口)
            let startList = [];
            this.codeList.forEach((item, index) => {
                wndId = index + 1;
                let obj = {};
                obj.cameraIndexCode = item.cameraIndexCode.trim();// 监控点编号
                obj.streamMode = streamMode;// 主子码流标识
                obj.transMode = transMode;// 传输协议
                obj.gpuMode = gpuMode;// 是否开启GPU硬解
                obj.wndId = wndId;// 可指定播放窗口
                startList.push(obj);
            })
            this.oWebControl.JS_RequestInterface({
                funcName: "startMultiPreviewByCameraIndexCode",//多个
                // funcName: "startPreview",//单个
                argument: JSON.stringify({"list": startList})
            })
            this.isPlay = true;
        },
        // 设置窗口裁剪,当因滚动条滚动导致窗口需要被遮住的情况下需要JS_CuttingPartWindow部分窗口
        setWndCover() {
            let iWidth = $(window).width();
            let iHeight = $(window).height();
            let oDivRect = $("#playBox").get(0).getBoundingClientRect();
            let iCoverLeft = (oDivRect.left < 0) ? Math.abs(oDivRect.left) : 0;
            let iCoverTop = (oDivRect.top < 0) ? Math.abs(oDivRect.top) : 0;
            let iCoverRight = (oDivRect.right - iWidth > 0) ? Math.round(oDivRect.right - iWidth) : 0;
            let iCoverBottom = (oDivRect.bottom - iHeight > 0) ? Math.round(oDivRect.bottom - iHeight) : 0;

            iCoverLeft = (iCoverLeft > this.width) ? this.width : iCoverLeft;
            iCoverTop = (iCoverTop > this.playHeight) ? this.playHeight : iCoverTop;
            iCoverRight = (iCoverRight > this.width) ? this.width : iCoverRight;
            iCoverBottom = (iCoverBottom > this.playHeight) ? this.playHeight : iCoverBottom;

            this.oWebControl.JS_RepairPartWindow(0, 0, (this.width + 1), this.playHeight);    // 多1个像素点防止还原后边界缺失一个像素条
            if (iCoverLeft != 0) {
                this.oWebControl.JS_CuttingPartWindow(0, 0, iCoverLeft, this.playHeight);
            }
            if (iCoverTop != 0) {
                this.oWebControl.JS_CuttingPartWindow(0, 0, (this.width + 1), iCoverTop);    // 多剪掉一个像素条,防止出现剪掉一部分窗口后出现一个像素条
            }
            if (iCoverRight != 0) {
                this.oWebControl.JS_CuttingPartWindow(this.width - iCoverRight, 0, iCoverRight, this.playHeight);
            }
            if (iCoverBottom != 0) {
                this.oWebControl.JS_CuttingPartWindow(0, this.playHeight - iCoverBottom, this.width, iCoverBottom);
            }
        },
        //关闭视频窗口
        closeWindow() {
            if (this.oWebControl != null) {
                this.oWebControl.JS_HideWnd(); // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
                this.oWebControl.JS_Disconnect().then(
                    () => {
                        // 断开与插件服务连接成功
                    },
                    () => {
                        // 断开与插件服务连接失败
                    }
                );
            }
        },
        //获取code
        getCodeList() {
            getCameraIndexCodeList(this.queryParams).then(res => {
                this.codeList = res.data.data.list;
                this.initPlugin(() => {
                    this.previewVideo();
                });
            })
        }
    },
    mounted() {
        this.getCodeList();
        // 设置播放器宽高
        this.width = this.$refs.videoPlayerBox.offsetWidth;
        this.playHeight = this.$refs.videoPlayerBox.offsetHeight;

        // this.initPlugin(() => {
        //     this.previewVideo();
        // });
        // 监听resize事件,使插件窗口尺寸跟随DIV窗口变化
        $(window).resize(() => {
            if (this.oWebControl != null) {
                this.oWebControl.JS_Resize(this.width, this.playHeight);
                this.setWndCover();
            }
        });

        // 监听滚动条scroll事件,使插件窗口跟随浏览器滚动而移动
        $(window).scroll(() => {
            if (this.oWebControl != null) {
                this.oWebControl.JS_Resize(this.width, this.playHeight);
                this.setWndCover();
            }
        });
        // 标签关闭
        $(window).unload(() => {
            if (this.oWebControl != null) {
                this.oWebControl.JS_HideWnd();   // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
                this.oWebControl.JS_Disconnect().then(
                    () => {  // 断开与插件服务连接成功
                    },
                    () => {  // 断开与插件服务连接失败
                    }
                );
            }
        });
    },
    beforeDestroy() {
        this.closeWindow();//关闭插件
    }
}
</script>

<style lang="scss" scoped>
.app-container {
    height: 80vh;
    width: 79vw;
}
</style>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值