欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vue中使用webVideoCtrl播放海康插件

程序员文章站 2022-07-06 09:39:20
...

    最近公司有个监控视频的项目要用到webVideoCtrl插件来播放视频,研究了两天终于搞定。只需要传IP、用户名、密码、端口号即可播放,插件可在网上搜索下载。

     新建文件夹来存放webVideoCtrl插件,然后在index.html中引进,如图:

vue中使用webVideoCtrl播放海康插件vue中使用webVideoCtrl播放海康插件

这样就把所需的插件引进去了,我们可以愉快的写代码了。注意要安装WebComponents.exe。

贴出完整代码,子组件

<template>
    <div class="video-player">
        <div id="divPlugin" class="divPlugin"></div>
        <!-- <div id="divPlugin" class="divPlugin" ref="divPlugin" v-if="plugin">
        </div> -->
        <!-- <div class="down" v-else>
            <a href="http://jbfsys.oss-cn-beijing.aliyuncs.com/download/VideoWebPlugin-1564128302790.exe">下载</a>
        </div> -->
    </div>
</template>
<script>
export default {
name: 'videoPlayer',
props: {
        //从父组件传来的数据,IP、用户名、密码、端口号
        companyVideoData:{
            type:Object
    },
    //分屏
    videoType:Number
},
    data(){
        return {
            plugin:true ,
            iWidth: "100%",
            iHeight: "100%",
            webVideo: {},
            iStreamType: 1,
            iProtocol: 1,
            bZeroChannel: false,
            xmlDocData:{},
            g_iWndIndex:0, //可以不用设置这个变量,有窗口参数的接口中,不用传值,开发包会默认使用当前选择窗口
            videoNum:''
        };
  },
  created(){
  },
  mounted(){
    this.videoInitPlugin();
  },
  destroyed(){
       
  },
  methods: {
    videoInitPlugin(){
        var iRet = WebVideoCtrl.I_CheckPluginInstall();
        if (iRet === -1) {
          alert("您还未安装过插件,请安装WebComponentsKit.exe插件!");
          return;
        }
        this.initPlugin()
    },
    //插件初始化
    initPlugin () {
        var that = this;
        WebVideoCtrl.I_InitPlugin(this.iWidth, this.iHeight, {
          bWndFull: true,//是否支持单窗口双击全屏,默I_CheckPluginInstall
          iWndowType: 2,
          bDebugMode:true,
          cbSelWnd: function (xmlDoc) {
		    },
        });
        WebVideoCtrl.I_InsertOBJECTPlugin("divPlugin");
        // 检查插件是否最新
        // if (-1 == WebVideoCtrl.I_CheckPluginVersion()) {
        //     alert("检测到新的插件版本,请双击WebComponents.exe插件,进行升级!");
        //     // return;
        // }
        this.clickLogin(this.companyVideoData)
      },
    clickLogin(data) {
        var that = this;
        WebVideoCtrl.I_Login(data.IP, 1, data.Port, data.Username, data.Password, {
            success: function (xmlDoc) {
                console.log("开始预览");//不能删除
                that.getChannelInfo();
            },
            error: function () {
                console.log("login error");
            }
        });
    }, 
    //获取通道
    getChannelInfo(){
        var that = this;
        // 模拟通道
        WebVideoCtrl.I_GetAnalogChannelInfo(this.szIP, {
            async: false,
            success: function (xmlDoc) {
                var oChannels = $(xmlDoc).find("VideoInputChannel");
                nAnalogChannel = oChannels.length;
                // console.log("获取模拟通道成功!")
            },
            error: function () {
                // console.log("获取模拟通道失败!"+WebVideoCtrl.I_GetLastError())
            }
        });
        // 数字通道
        WebVideoCtrl.I_GetDigitalChannelInfo(that.companyVideoData.IP, {
            async: false,
            success: function (xmlDoc) {
                var oChannels = $(xmlDoc).find("InputProxyChannelStatus");
                that.initPlay()
                that.$emit('func',oChannels)//获取数字通道传给父组件
            },
            error: function () {
                WebVideoCtrl.I_GetLastError()
                // console.log("获取数字通道失败!"+WebVideoCtrl.I_GetLastError())
            }
        });
        // 零通道
        WebVideoCtrl.I_GetZeroChannelInfo(this.szIP, {
            async: false,
            success: function (xmlDoc) {
                var oChannels = $(xmlDoc).find("ZeroVideoChannel");
            },
            error: function () {
                // console.log("获取零通道失败!"+WebVideoCtrl.I_GetLastError())
            }
        });
    },
    //初始化视频,为了让用户进来就可以看到视频播放
    initPlay(){
        let szIP = this.companyVideoData.IP;//ip地址
        var	iStreamType = 1;
        //循环16次是因为插件分屏最大为4x4(可以根据情况而定)
        for(let i = 0;i<16;i++){
            var iChannelID = parseInt(i+1, 10);
            WebVideoCtrl.I_StartRealPlay(szIP, {
                iStreamType: iStreamType,
                iChannelID: iChannelID,
                iWndIndex:i
            });
        }
    },
    // 点击查看具体哪个监控
    startRealPlay(oChannels) {
        let that = this;
        let szIP = this.companyVideoData.IP;//ip地址
        let iChannelID = oChannels;//播放通道号
        var	iStreamType = 1;
        var oWndInfo = WebVideoCtrl.I_GetWindowStatus(that.g_iWndIndex);
        if (oWndInfo != null) {// 已经在播放了,先停止
            WebVideoCtrl.I_Stop();
        }
        WebVideoCtrl.I_StartRealPlay(szIP, {
            iStreamType: iStreamType,
            iChannelID: iChannelID,
        });
    },
  },
  //因为项目中需求,总公司要查看所有子公司的监控,所以做了个监听来切换查看各个子公司的监控
  watch:{
    companyVideoData:{  
        handler(val,oldval) {
                if(oldval){
                    for(let i = 0;i<16;i++){
                        WebVideoCtrl.I_Stop(i);//停止正在播放的页面
                    }
                    this.$emit('func',"")
                    WebVideoCtrl.I_Logout(oldval.IP)
                    this.clickLogin(this.companyVideoData)
                }
            },  
                immediate:true,//关键
                deep:true
        },
    videoType:{  
        handler(val,oldval) {
                if(oldval){
                    WebVideoCtrl.I_ChangeWndNum(this.videoType);//分屏
                    this.initPlay()
                }
            },  
                immediate:true,//关键
                deep:true
        }
    }
};
</script>
<style  scoped>
.video-player{
    width: 100%;
    height: 100%;
}
.divPlugin{
        width: 100%;
        height: 100%;
        color:red;
        /* display: flex; */
        justify-content: center;
        align-items: center;
        font-size: 18px;
    }
 .down{
        width: 100%;
        height: 100%;
        color:red;
        display: flex;
        justify-content: center;
        align-items: center;
        font-size: 18px;
       
    }
   .down a{
        color:red;
    }    
</style>

父组件部分代码如下:

接收子组件传来的数据

func(data){//取得监控视频的数据
            var nAnalogChannel = 0;
            var nn = [];
            if(data){
                $.each(data, function (i) {
                    var id = parseInt($(this).find("id").eq(0).text(), 10),
                        name = $(this).find("name").eq(0).text(),
                        online = $(this).find("online").eq(0).text();
                    if ("false" == online) {// 过滤禁用的数字通道
                        return true;
                    }
                    if ("" == name) {
                        name = "IPCamera " + ((id - nAnalogChannel) <= 9 ? "0" + (id - nAnalogChannel) : (id - nAnalogChannel));
                    }
                    for(let i = 0;i<1;i++){
                        var obj = {
                            id:id,
                            name:name
                        };
                        nn.push(obj)
                    }
                });
            }
            this.listVideo = nn;//这是列表,id就是监控的通道号,传给子组件就可播放
        },

代码我没怎么优化,希望大佬可以指点指点哪些地方可以改进。写的不好还请见谅,欢迎一起交流,共同进步。

相关标签: vue 监控视频