海康视频插件对接过程中遇到的各种小问题

  1. 封装插件的两种方式       

a.单独创建一个文件,内部定义div 通过使用id 获取当前dom 然后在当前dom 的生命周期中创建插件窗口,定义插件的各个行为,初始化,销毁等其他操作,然后使用该插件时,引用该插件传入插件所需要的参数即可

b.可以在全局引入插件包后,创建一个js 文件,封装好 该插件的各个方法 然后暴露出去,其他页面文件可在自己的页面代码内创建div以及id 然后引入封装好的方法(接口)

a.方法封装

import React, {Component} from 'react';


class HkPlayer extends Component{
    constructor(props){
        super(props)
    }
    state = {
        oWebControl: null,
        pubKey: '', // 公钥
        appkey: '29613871',
        secret: '41EAYrloufvqEmuFjxkv',
        ip: '59.208.84.180',
        port: 1443,
        width: this.props.playWidth || 2364,
        height: this.props.playHeight || 1330, // 弹框高度
        playHeight: this.props.playHeight || 1330,
        layout: '1x1',
        left: '',
        top: '',
        buttonIDs: '0,16,256,515',
        initCount: 0,
        playMode: 0, // 0 预览 1回放
        playText: '启动中。。。',
        cameraIndexCode: this.props.monitorDeviceNo || '' // 监控点编号
    }
    componentDidMount() {
        this.setState({
            appkey: '29613871',
            secret: '41EAYrloufvqEmuFjxkv',
            ip: '59.208.84.180',
            port: 1443
        }, () => {
            this.initPlugin(() => {
                this.previewVideo();
                });
        })

        // if (this.props.hidden) {
        //     console.log(5555)
        //    this.oWebControl.JS_CuttingPartWindow(0, 0, that.state.width, that.state.height)
        // }
    
       
        
	// 监听resize事件,使插件窗口尺寸跟随DIV窗口变化
        $(window).resize(() => { 
        //  console.log('resize事件',this.state.oWebControl )
        if (this.state.oWebControl != null) {
            this.state.oWebControl.JS_Resize(this.state.width, this.state.height);
            this.setWndCover();
        }
        });
        
    
	
	// 监听滚动条scroll事件,使插件窗口跟随浏览器滚动而移动
        $(window).scroll(() => {
        if (this.state.oWebControl != null) {
            this.state.oWebControl.JS_Resize(this.state.width, this.state.height);
            this.setWndCover();
        }
    });
        
    $(window).unload(() => {
      if (this.oWebControl != null) {
        this.state.oWebControl.JS_HideWnd();   // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
        this.state.oWebControl.JS_Disconnect().then(
            () => {  // 断开与插件服务连接成功
            },
            () => {  // 断开与插件服务连接失败
            }
        );
      }
    });
   

    }


    // 标签关闭
    componentWillUnmount() {
        if (this.state.oWebControl != null){
			this.state.oWebControl.JS_HideWnd();   // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题 
            this.state.oWebControl.JS_Disconnect().then(function(){  // 断开与插件服务连接成功
			}, 
			function() {  // 断开与插件服务连接失败
			});
        }
    }


    // 推送消息
    cbIntegrationCallBack(oData, t) {
        
        console.log('返回值视频',oData.responseMsg, t );
        let mesgData = oData.responseMsg
        if (mesgData.type == 7 && mesgData?.msg?.cameraIndexCode) {
            console.log('视频放大播放',mesgData)
            // this.props.fullPlay(mesgData.cameraIndexCode)
        }
    }

    // RSA加密
     setEncrypt (value) {
        var encrypt = new JSEncrypt();
        encrypt.setPublicKey(this.state.pubKey);
        return encrypt.encrypt(value);
    }

     // 创建播放实例
    initPlugin(callback) {
        let that = this
       
         let oWebControl = new WebControl({
            szPluginContainer: this.props.htmlid,                       //指定容器id
            iServicePortStart: 15900,                           //指定起止端口号,建议使用该值
            iServicePortEnd: 15900,
            szClassId: "23BF3B0A-2C56-4D97-9C03-0CB103AA8F11",  // 用于IE10使用ActiveX的clsid
            cbConnectSuccess: function () {
                // setCallbacks();
                //实例创建成功后需要启动服务
                //  that.state.oWebControl.JS_StartService("window", {
                 oWebControl.JS_StartService("window", {
                    dllPath: "./VideoPluginConnect.dll"
                }).then(function () {
					//  that.state.oWebControl.JS_SetWindowControlCallback({   // 设置消息回调
					 oWebControl.JS_SetWindowControlCallback({   // 设置消息回调
						// cbIntegrationCallBack: cbIntegrationCallBack(onData,taht)
                         cbIntegrationCallBack: function (onData) {
                             console.log('ondata', onData,)
                                let mesgData = onData.responseMsg
                                if (mesgData.type == 7 && mesgData?.msg?.cameraIndexCode) {
                                    console.log('视频放大播放',mesgData)
                                    that.props.fullPlay(mesgData.msg.cameraIndexCode)
                                }
                        }
					});
                
                    //  that.state.oWebControl.JS_CreateWnd("playWnd", 1000, 600).then(function () {         //JS_CreateWnd创建视频播放窗口,宽高可设定
                     oWebControl.JS_CreateWnd(that.props.htmlid, that.state.width, that.state.height).then(function () {         //JS_CreateWnd创建视频播放窗口,宽高可设定
                         console.log("JS_CreateWnd success");
                         that.init(callback);                                 //创建播放实例成功后初始化
                        //  oWebControl.JS_CuttingPartWindow(0, 0, that.state.width, that.state.height)
                         
                    });
                }, function () {

                });
            },
            cbConnectError: function () {
                console.log("cbConnectError");
                that.state.oWebControl = null;
                $(`#${that.props.htmlid}`).html("插件未启动,正在尝试启动,请稍候...");
                WebControl.JS_WakeUp("VideoWebPlugin://");        //程序未启动时执行error函数,采用wakeup来启动程序
                that.setState({
                    initCount: that.state.initCount + 1
                }, () => {
                    if (that.state.initCount < 3) {
                    setTimeout(function () {
                        that.initPlugin();
                    }, 3000)
                } else {
                    $(`#${that.props.htmlid}`).html("插件启动失败,请检查插件是否安装!");
                }
                })
                
                
            },
            cbConnectClose: function (bNormalClose) {
                console.log("cbConnectClose", bNormalClose,);
                if (bNormalClose) {
                     that.setState({
                        oWebControl: null
                    }, () => {console.log('先关闭还是先滚动', that.state.oWebControl)})
                }   
				// $(`#${that.props.htmlid}`).html("插件未启动,正在尝试启动,请稍候...");
				// WebControl.JS_WakeUp("VideoWebPlugin://");
				//  that.setState({
                //     initCount:that.state.initCount + 1
                // }, () => {
                //     if (that.state.initCount < 3) {
                //     setTimeout(function () {
                //         that.initPlugin();
                //     }, 3000)
                // } else {
                //     $(`#${that.props.htmlid}`).html("插件启动失败,请检查插件是否安装!");
                // }
                // })
            }
         });
        
        this.setState({
            oWebControl
        },)
    }



   //视频预览功能
    previewVideo() {
         let cameraIndexCode = this.state.cameraIndexCode;
      let streamMode = 0;                                     // 主子码流标识:0-主码流,1-子码流
      let transMode = 0;                                      // 传输协议:0-UDP,1-TCP
      let gpuMode = 0;                                        // 是否启用GPU硬解,0-不启用,1-启用
      let wndId = 1;                                         // 播放窗口序号(在2x2以上布局下可指定播放窗口)
        // cameraIndexCode = cameraIndexCode?.replace(/(^\s*)/g, "");
        // cameraIndexCode = cameraIndexCode?.replace(/(\s*$)/g, "");

        this.state.oWebControl.JS_RequestInterface({
            funcName: "startPreview",
            argument: JSON.stringify({
                cameraIndexCode:cameraIndexCode,                //监控点编号
                streamMode: streamMode,                         //主子码流标识
                transMode: transMode,                           //传输协议
                gpuMode: gpuMode,                               //是否开启GPU硬解
                wndId:wndId                                     //可指定播放窗口
            })
        })

         this.props.getWeb( this.state.oWebControl)
        // this.state.oWebControl.JS_CuttingPartWindow(0, 0, this.state.width, this.state.height)

    }

   //停止全部预览
    stopPlayer() {
         oWebControl.JS_RequestInterface({
            funcName: "stopAllPreview"
        });
    }

   // 获取公钥
    getPubKey(callback) {
        this.state.oWebControl.JS_RequestInterface({
            funcName: "getRSAPubKey",
            argument: JSON.stringify({
                keyLength: 1024
            })
        }).then((oData) =>{
            console.log('公钥',oData);
            if (oData.responseMsg.data) {
                this.setState({
                    pubKey: oData.responseMsg.data
                })
                callback()
            }
        })
    }

     
    

    init(callback) {
        let that = this
         this.getPubKey(() => {
			// 请自行修改以下变量值	
            var appkey = "29613871";                           //综合安防管理平台提供的appkey,必填
            var secret = that.setEncrypt("41EAYrloufvqEmuFjxkv");   //综合安防管理平台提供的secret,必填
            var ip = "59.208.84.180";                           //综合安防管理平台IP地址,必填
            var playMode = 0;                                  //初始播放模式:0-预览,1-回放
            var port = 1443;                                    //综合安防管理平台端口,若启用HTTPS协议,默认443
            var snapDir = "D:\\SnapDir";                       //抓图存储路径
            var videoDir = "D:\\VideoDir";                     //紧急录像或录像剪辑存储路径
            var layout = "1x1";                                //playMode指定模式的布局
            var enableHTTPS = 1;                               //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
            var encryptedFields = 'secret';					   //加密字段,默认加密领域为secret
			var showToolbar =0;                               //是否显示工具栏,0-不显示,非0-显示
			var showSmart = 0;                                 //是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示
			var buttonIDs = "";  //自定义工具条按钮
			var reconnectTimes = 2;                            // 重连次数,回放异常情况下有效
             var reconnectTime = 4;
            var toolBarButtonIDs = '2049,4098,4099'                           // 每次重连的重连间隔 >= reconnectTime
			// 请自行修改以上变量值	
             
            //  let { appkey, ip,playMode,layout , buttonIDs } = this.state
            that.state.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,                     //自定义工具条按钮
					//reconnectTimes:reconnectTimes,            //重连次数
					//reconnectDuration:reconnectTime           //重连间隔
                })
            }).then(function (oData) {
				that.state.oWebControl.JS_Resize(that.state.width, that.state.height);  // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
                if (callback) {
                    callback();
                }
            });
        });
    }




	// 设置窗口裁剪,当因滚动条滚动导致窗口需要被遮住的情况下需要JS_CuttingPartWindow部分窗口
    setWndCover() {
        const { width, height } = this.state 
        
        var iWidth = $(window).width();
        var iHeight = $(window).height();
        let id = `#${this.props.htmlid}`
        var oDivRect = $(id).get(0)?.getBoundingClientRect();
        if (oDivRect?.left) {
            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 > width) ? width : iCoverLeft;
        iCoverTop = (iCoverTop > height) ? height : iCoverTop;
        iCoverRight = (iCoverRight > width) ? width : iCoverRight;
        iCoverBottom = (iCoverBottom > height) ? height : iCoverBottom;

		this.state.oWebControl.JS_RepairPartWindow(0, 0, width+ 1, height);   // 多1个像素点防止还原后边界缺失一个像素条
        if (iCoverLeft != 0) {
			this.state.oWebControl.JS_CuttingPartWindow(0, 0, iCoverLeft, height);
        }
        if (iCoverTop != 0) {
            this.state.oWebControl.JS_CuttingPartWindow(0, 0, width+ 1, iCoverTop);  // 多剪掉一个像素条,防止出现剪掉一部分窗口后出现一个像素条
        }
        if (iCoverRight != 0) {
            this.state.oWebControl.JS_CuttingPartWindow(width - iCoverRight, 0, iCoverRight, height);
        }
        if (iCoverBottom != 0) {
            this.state.oWebControl.JS_CuttingPartWindow(0, height - iCoverBottom, width, iCoverBottom);
        }
        }
        
    }
	
    // 渲染子节点
   
    render(){
        return (
           <div id={this.props.htmlid} style={{width: this.state.playWidth, height: this.state.playHeight}}></div>
        )
    }
    
}
    

export default HkPlayer;

使用方法:

import HkPlayer from '@/components/HkPlayer/hkPlayer'


//a 方法
<HkPlayer
  htmlid={ `${item.cameraCode}` }
  monitorDeviceNo={ item.cameraCode }
  playWidth={ index < numsType ? 915 : 440 }
  playHeight={ index < numsType ? 514 : 240 }
  hidden={ item.hoverFlag }
  getWeb={ (e) => this.getWebPlug(e, item, index, index < numsType ? 912 : 437, index < numsType ? 514 : 240) }
  fullPlay={ this.fullLagePlay }
/>

b.方法封装

//声明公用变量
let initCount = 0
let pubKey = ''
var oWebControl = null
let width = 1000
let height = 600
let cId = ''
let fullPlayCode = ''

// 创建播放实例
const initPlugin = (containerId, w, h, onSuccess, callback) => {
  cId = containerId
  width = w || 1000
  height = h || 6000
  oWebControl = new WebControl({
    szPluginContainer: containerId, // 指定容器id
    iServicePortStart: 15900, // 指定起止端口号,建议使用该值
    iServicePortEnd: 15909,
    szClassId: '23BF3B0A-2C56-4D97-9C03-0CB103AA8F11', // 用于IE10使用ActiveX的clsid
    cbConnectSuccess: () => {
      // 创建WebControl实例成功
      oWebControl?.JS_StartService('window', {
          // WebControl实例创建成功后需要启动服务
          dllPath: './VideoPluginConnect.dll' // 值"./VideoPluginConnect.dll"写死
        })
        .then(
          () => {
            // 启动插件服务成功
            oWebControl.JS_SetWindowControlCallback({
              // 设置消息回调
              cbIntegrationCallBack: (onData) => {
                console.log('onDataPlay', onData)
                 let mesgData = onData.responseMsg
                if (mesgData.type == 7 && mesgData?.msg?.cameraIndexCode) {
                  callback(mesgData?.msg?.cameraIndexCode)
                }
              } // 创建播放实例成功后消息回调函数
            })

            oWebControl.JS_CreateWnd(containerId, width, height).then(() => {
              //JS_CreateWnd创建视频播放窗口,宽高可设定
              // onSuccess() // 创建播放实例成功后初始化
              initForPreview({mplayMode: 1,containerId,width,height  })
            })
          },
          () => {
            // 启动插件服务失败
          }
        )
    },
    cbConnectError: () => {
      // 创建WebControl实例失败
      oWebControl = null
      WebControl.JS_WakeUp('VideoWebPlugin://') // 程序未启动时执行error函数,采用wakeup来启动程序
      initCount++
      if (initCount < 3) {
        setTimeout(() => {
          initPlugin(containerId, w, h, onSuccess)
        }, 1000)
      } else {
        document.getElementById(cId).innerHTML = `<a style="color:white;" href="./static/VideoWebPlugin.exe" download="VideoWebPlugin.exe">插件启动失败,请下载插件并安装!</a>`
      }
    },
    cbConnectClose: () => {
      // 异常断开:bNormalClose = false
      // JS_Disconnect正常断开:bNormalClose = true
      console.log('cbConnectClose')
      oWebControl = null
    }
  })
}

const intPluginForPlayback = option => {
  return getPubKey().then(() => {
    initPlayPlugin({ mplayMode: 1, ...option })
  })
}

const initPlayPlugin = option => {
  const { mlayout, mplayMode } = option || { mlayout: '1x1', mplayMode: 0 }
  // 请自行修改以下变量值 
  let appkey = '29613871' //综合安防管理平台提供的appkey,必填
  let secret = setEncrypt('41EAYrloufvqEmuFjxkv') //综合安防管理平台提供的secret,必填
  let ip = "59.208.84.180" //综合安防管理平台IP地址,必填
  let playMode =  0 //初始播放模式:0-预览,1-回放
  let port = 1443 //综合安防管理平台端口,若启用HTTPS协议,默认443
  let snapDir = 'D:\\SnapDir' //抓图存储路径
  let videoDir = 'D:\\VideoDir' //紧急录像或录像剪辑存储路径
  let layout = '1x1' //playMode指定模式的布局
  let enableHTTPS = 1 //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
  let encryptedFields = 'secret' //加密字段,默认加密领域为secret
  let showToolbar = 0 //是否显示工具栏,0-不显示,非0-显示
  let showSmart = 1 //是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示
  let buttonIDs = '' //自定义工具条按钮
  // 请自行修改以上变量值 

  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(() => {
      oWebControl.JS_Resize(width, height) // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
      startPreview(option.containerId, 1)

      return Promise.resolve()

    })
}

//初始化
const initForPreview = option => {
  return getPubKey().then(() => {
    initPlayPlugin(option)
  })
}

//获取公钥
const getPubKey = () => {
  return oWebControl.JS_RequestInterface({
      funcName: 'getRSAPubKey',
      argument: JSON.stringify({
        keyLength: 1024
      })
    })
    .then(oData => {
      if (oData.responseMsg.data) {
        pubKey = oData.responseMsg.data
        return Promise.resolve()
      }
    })
}

//RSA加密
const setEncrypt = value => {
  var encrypt = new JSEncrypt()
  encrypt.setPublicKey(pubKey)
  return encrypt.encrypt(value)
}

window.onresize = function () {

  if (oWebControl != null) {
    oWebControl.JS_Resize(width, height)
    setWndCover()
  }
}

window.onscroll = function () {
  if (oWebControl != null) {
    oWebControl.JS_Resize(width, height)
    setWndCover()
  }
}


// window.onmousewheel = function () {

//   if (oWebControl != null) {
//       console.log('鼠标滚动')
//       oWebControl.JS_Resize(width, height)
//       setWndCover()
//   }
// }

// 设置窗口裁剪,当因滚动条滚动导致窗口需要被遮住的情况下需要JS_CuttingPartWindow部分窗口
const setWndCover = (cw, ch) => {
  cw && (width = cw)
  ch && (height = ch)
  const playDiv = document.getElementById(cId)
  if (playDiv) {
    if (oWebControl != null) {
      oWebControl.JS_Resize(width, height)
    }
    let iWidth = window.innerWidth
    let iHeight = window.innerHeight
    let oDivRect = playDiv.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 > width ? width : iCoverLeft
    iCoverTop = iCoverTop > height ? height : iCoverTop
    iCoverRight = iCoverRight > width ? width : iCoverRight
    iCoverBottom = iCoverBottom > height ? height : iCoverBottom

    oWebControl.JS_RepairPartWindow(0, 0, width, height) // 多1个像素点防止还原后边界缺失一个像素条
    if (iCoverLeft !== 0) {
      oWebControl.JS_CuttingPartWindow(0, 0, iCoverLeft, height)
    }
    if (iCoverTop !== 0) {
      oWebControl.JS_CuttingPartWindow(0, 0, width, iCoverTop) // 多剪掉一个像素条,防止出现剪掉一部分窗口后出现一个像素条
    }
    if (iCoverRight !== 0) {
      oWebControl.JS_CuttingPartWindow(width - iCoverRight, 0, iCoverRight, height)
    }
    if (iCoverBottom !== 0) {
      oWebControl.JS_CuttingPartWindow(0, height - iCoverBottom, width, iCoverBottom)
    }
  }
}

const resizePosition = function (width, height) {
  if (oWebControl != null) {
     oWebControl.JS_Resize(width, height)
      setWndCover()
  }
 
  
}

const startPreview = (cameraIndexCode, wzId) => {
  //获取输入的监控点编号值,必填
  let streamMode = 1 //主子码流标识:0-主码流,1-子码流
  let transMode = 1 //传输协议:0-UDP,1-TCP
  let gpuMode = 0 //是否启用GPU硬解,0-不启用,1-启用
  let wndId = ''
  if (undefined === wzId || '' === wzId || null === wzId) {
    wndId = -1 //播放窗口序号(在2x2以上布局下可指定播放窗口)
  } else {
    wndId = wzId //播放窗口序号(在2x2以上布局下可指定播放窗口)
  }

  // cameraIndexCode = cameraIndexCode.replace(/(^\s*)/g, '')
  // cameraIndexCode = cameraIndexCode.replace(/(\s*$)/g, '')

  oWebControl.JS_RequestInterface({
    funcName: 'startPreview',
    argument: JSON.stringify({
      cameraIndexCode: cameraIndexCode, //监控点编号
      streamMode: streamMode, //主子码流标识
      transMode: transMode, //传输协议
      gpuMode: gpuMode, //是否开启GPU硬解
      wndId: wndId //可指定播放窗口
    })
  })
}

const startPlayback = cameraIndexCode => {
  //获取输入的监控点编号值,必填
  let startTimeStamp = new Date().getTime() - 24 * 3600000 //回放开始时间戳,必填
  let endTimeStamp = new Date().getTime() //回放结束时间戳,必填
  let recordLocation = 1 //录像存储位置:0-中心存储,1-设备存储
  let transMode = 1 //传输协议:0-UDP,1-TCP
  let gpuMode = 0 //是否启用GPU硬解,0-不启用,1-启用
  let wndId = -1 //播放窗口序号(在2x2以上布局下可指定播放窗口)

  oWebControl.JS_RequestInterface({
    funcName: 'startPlayback',
    argument: JSON.stringify({
      cameraIndexCode: cameraIndexCode, //监控点编号
      startTimeStamp: Math.floor(startTimeStamp / 1000).toString(), //录像查询开始时间戳,单位:秒
      endTimeStamp: Math.floor(endTimeStamp / 1000).toString(), //录像结束开始时间戳,单位:秒
      recordLocation: recordLocation, //录像存储类型:0-中心存储,1-设备存储
      transMode: transMode, //传输协议:0-UDP,1-TCP
      gpuMode: gpuMode, //是否启用GPU硬解,0-不启用,1-启用
      wndId: wndId //可指定播放窗口
    })
  })
}

// 标签关闭
const closeVideo = callback => {
  if (oWebControl != null) {
    oWebControl.JS_HideWnd() // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
    return oWebControl.JS_Disconnect().then(
      () => {
        // 断开与插件服务连接成功
        setTimeout(callback, 1000)
      },
      () => {
        // 断开与插件服务连接失败
      }
    )
  }
}

const handlDestory = () => {
  if (oWebControl != null) {
     oWebControl.JS_HideWnd() 
    oWebControl.JS_RequestInterface({
      funcName: 'destroyWnd',
    })
  }
  
}

const capture = () => {
  oWebControl.JS_RequestInterface({
    argument: {
      wndId: 1
    },
    funcName: 'snapShot'
  })
  return Promise.resolve()
}
export { initPlugin, initForPreview, intPluginForPlayback, startPreview, handlDestory,closeVideo, startPlayback, setWndCover, capture,resizePosition,fullPlayCode }

使用场景

import { initPlugin, setWndCover, closeVideo, resizePosition, handlDestory, fullPlayCode } from '@/components/HkPlayer/palyer'


openCameraVideoNew = (cameraInfo, e, type) => {
        this.clearAllOverLays(['cameraDetail'])
        const ResourceDetail = `
         <div class=${styles.infoModal} >
         <div class=${styles.close} id='closeBtn'>X</div>
          <div id=${cameraInfo?.DOMAIN_CODE}> </div >
        </div>`

        if (this.state.playId) {
            console.log(888888, this.state.playId)
            this.setState({
                playId: null
            })
            handlDestory()
        }
        initPlugin(cameraInfo?.DOMAIN_CODE, 326, 200, () => { }, (code) => this.getFullPlay(code))

        this.setState({
            playId: cameraInfo?.DOMAIN_CODE
        })

        const label = L.marker(L.latLng(cameraInfo?.LATITUDE || cameraInfo.latitude, cameraInfo?.LONGITUDE || cameraInfo?.longitude), {
            zIndexOffset: 1000,
            id: `cameraDetail_${cameraInfo?.DOMAIN_CODE}`,
            icon: L.divIcon({
                iconSize: null,
                iconAnchor: [105, 250],
                html: ResourceDetail
            })
        });
        this.map.addLayer(label);
        document.getElementById('closeBtn').addEventListener("click", (e) => {
            this.clearAllOverLays(['cameraDetail'])
            handlDestory()
            this.setState({
                playId: null
            })
        })

    }

总结:

总结:A方法的好处是将插件方法都写在一个文件中 想使用该方法时只需要简单引用该组件传入响应参数即可,但是坏处是,当一些地方只能接收原生的html 时无法识别自己的定义的组件(例如地图上通过html 定义弹窗展示某点位视频),那么该组件将无法使用。

b方法的好处是,你只需要定义一个div 绑定id ,引入定义好的接口后即可随意使用暴露出来的插件方法,自定义需要的接口方法然后暴露给当前页面代码即可使用,坏处是 需要在当前页面调用插件方法 可能还要多次使用

a 方法与b方法正常只需要使用其中一个即可解决插件问题,之所以涉及两种情形是因为 在大屏地图中资源点位 点击展示弹窗时需要通过原生的html 及js渲染样式与交互使用插件无法识别 所以只能通过div 绑定id

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值