123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351 |
- <!-- 海康威视组件
- https://blog.csdn.net/weixin_53322542/article/details/134334347
- -->
- <template>
- <div :id="state.id" class="playWnd"></div>
- <img class="fullscreen" src="@/assets/images/video/fullscreen.png" @click.stop="doubleClick" />
- </template>
- <script setup lang="ts" name="hikvision-player">
- const WebControl = window.WebControl; //index.html引入 直接从window里面拿到sdk
- const JSEncrypt = window.JSEncrypt; //index.html引入 直接从window里面拿到sdk
- const props = defineProps({
- wsUrl: {
- type: String //视频监控code
- },
- objData: {}
- });
- const emits = defineEmits(['exitFullScreen']);
- const objData = props.objData;
- // console.log(props.wsUrl, '====>wsurl')
- const state = reactive({
- id: 'playWnd' + Math.random().toString(16).slice(2), //多个监控同时显示需要不同的id
- idWidth: 0 as any,
- idHeight: 0 as any,
- initCount: 0,
- pubKey: '',
- oWebControl: null as any
- });
- // console.log(state)
- //创建播放实例
- const initPlugin = () => {
- console.log('initPlugin');
- state.oWebControl = new WebControl({
- szPluginContainer: state.id, // 指定容器id
- iServicePortStart: 15900, // 指定起止端口号,建议使用该值
- iServicePortEnd: 15900,
- // szClassId: '23BF3B0A-2C56-4D97-9C03-0CB103AA8F11', // 用于IE10使用ActiveX的clsid
- cbConnectSuccess: function () {
- // 创建WebControl实例成功
- state.oWebControl
- .JS_StartService('window', {
- // WebControl实例创建成功后需要启动服务
- dllPath: './VideoPluginConnect.dll' // 值"./VideoPluginConnect.dll"写死
- })
- .then(
- () => {
- console.log('启动成功');
- // 启动插件服务成功
- state.oWebControl.JS_SetWindowControlCallback({
- // 设置消息回调
- cbIntegrationCallBack: cbIntegrationCallBack
- });
- state.oWebControl.JS_CreateWnd(state.id, state.idWidth, state.idHeight).then(() => {
- console.log('JS_CreateWnd success');
- //JS_CreateWnd创建视频播放窗口,宽高可设定
- init(); // 创建播放实例成功后初始化
- });
- },
- function () {
- console.log('启动失败');
- // 启动插件服务失败
- }
- );
- },
- cbConnectError: function () {
- // 创建WebControl实例失败
- state.oWebControl = null;
- console.log('插件未启动,正在尝试启动,请稍候...');
- WebControl.JS_WakeUp('VideoWebPlugin://'); // 程序未启动时执行error函数,采用wakeup来启动程序
- state.initCount++;
- if (state.initCount < 3) {
- setTimeout(function () {
- initPlugin();
- }, 3000);
- } else {
- console.log('插件启动失败,请检查插件是否安装!');
- }
- },
- cbConnectClose: function (bNormalClose) {
- // 异常断开:bNormalClose = false
- // JS_Disconnect正常断开:bNormalClose = true
- console.log('cbConnectClose', bNormalClose);
- state.oWebControl = null;
- if (!bNormalClose) {
- console.log('插件未启动,正在尝试启动,请稍候...');
- WebControl.JS_WakeUp('VideoWebPlugin://');
- state.initCount++;
- if (state.initCount < 3) {
- setTimeout(function () {
- initPlugin();
- }, 3000);
- } else {
- console.log('插件启动失败,请检查插件是否安装!');
- }
- }
- }
- });
- };
- // 设置窗口控制回调
- const setCallbacks = () => {
- state.oWebControl.JS_SetWindowControlCallback({
- cbIntegrationCallBack: cbIntegrationCallBack
- });
- };
- // 推送消息
- const cbIntegrationCallBack = (oData) => {
- console.log(oData.responseMsg, '--oData');
- if (oData.responseMsg.type === 7) {
- doubleClick();
- }
- if(oData.responseMsg.msg.result == 1025) {
- emits('exitFullScreen');
- }
- };
- // 双击窗口放大
- const doubleClick = () => {
- state.oWebControl
- .JS_RequestInterface({
- funcName: 'setFullScreen'
- })
- .then(function (oData) {
- console.log(oData);
- // showCBInfo(JSON.stringify(oData ? oData.responseMsg : ''))
- });
- };
- //初始化
- const init = () => {
- getPubKey(() => {
- // 请自行修改以下变量值
- let appkey = objData.appkey; //综合安防管理平台提供的appkey,必填
- let secret = setEncrypt(objData.secret); //综合安防管理平台提供的secret,必填
- let ip = objData.ip; //综合安防管理平台IP地址,必填
- let playMode = objData.playMode; //初始播放模式:0-预览,1-回放
- let port = objData.port; //综合安防管理平台端口,若启用HTTPS协议,默认443
- let snapDir = 'D:\\SnapDir'; //抓图存储路径
- let videoDir = 'D:\\VideoDir'; //紧急录像或录像剪辑存储路径
- let layout = objData.layout; //playMode指定模式的布局
- let enableHTTPS = 1; //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
- let encryptedFields = 'secret'; //加密字段,默认加密领域为secret
- let showToolbar = objData.showToolbar; //是否显示工具栏,0-不显示,非0-显示
- let showSmart = 0; //是否显示移动框线框,0-不显示,非0-显示
- let buttonIDs = '0,16,256,257,258,259,260,512,513,514,515,516,517,768,769'; //自定义工具条按钮
- // 请自行修改以上变量值
- 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 //自定义工具条按钮
- })
- })
- .then(function (oData: any) {
- console.log(oData, 'oData');
- state.oWebControl.JS_Resize(state.idWidth, state.idHeight); // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
- props.wsUrl && previewClick('') && doubleClick();
- });
- });
- };
- //获取公钥
- const getPubKey = (callback: any) => {
- state.oWebControl
- .JS_RequestInterface({
- funcName: 'getRSAPubKey',
- argument: JSON.stringify({
- keyLength: 1024
- })
- })
- .then((oData: { responseMsg: { data: string } }) => {
- console.log('getPubKey', oData);
- if (oData.responseMsg.data) {
- state.pubKey = oData.responseMsg.data;
- callback();
- }
- });
- };
- //RSA加密
- const setEncrypt = (value: string) => {
- var encrypt = new JSEncrypt();
- encrypt.setPublicKey(state.pubKey);
- return encrypt.encrypt(value);
- };
- // 监听resize事件,使插件窗口尺寸跟随DIV窗口变化
- window.addEventListener('resize', () => {
- console.log('resize');
- if (state.oWebControl != null) {
- getElementWidth();
- state.oWebControl.JS_Resize(state.idWidth, state.idHeight);
- // setWndCover();
- }
- });
- // 监听滚动条scroll事件,使插件窗口跟随浏览器滚动而移动
- window.addEventListener('scroll', () => {
- if (state.oWebControl != null) {
- getElementWidth();
- state.oWebControl.JS_Resize(state.idWidth, state.idHeight);
- // setWndCover();
- }
- });
- //视频预览功能
- const previewClick = (data) => {
- let wsUrl = props.wsUrl;
- let urlList = wsUrl.split(",");
- console.log('previewClick ===========>>>>', urlList);
-
- urlList.forEach((indexCode)=>{
- var cameraIndexCode = indexCode; //获取输入的监控点编号值,必填
- var streamMode = 1; //主子码流标识:0-主码流,1-子码流
- var transMode = 1; //传输协议:0-UDP,1-TCP
- var gpuMode = 1; //是否启用GPU硬解,0-不启用,1-启用
- var wndId = -1; //播放窗口序号(在2x2以上布局下可指定播放窗口)
- state.oWebControl.JS_RequestInterface({
- funcName: 'startPreview',
- argument: JSON.stringify({
- cameraIndexCode: cameraIndexCode, //监控点编号
- streamMode: streamMode, //主子码流标识
- transMode: transMode, //传输协议
- gpuMode: gpuMode, //是否开启GPU硬解
- wndId: wndId //可指定播放窗口
- })
- });
- console.log(state.oWebControl.JS_RequestInterface, ' ------face');
- console.log('当前的编号', cameraIndexCode);
- console.log('执行完成');
- })
- return true;
- };
- const playbackClick = (data, begin_time, end_time) => {
- console.log('playbackClick ===========>>>> ');
- var cameraIndexCode = data ? data : (props.wsUrl as any);
- var startTimeStamp = begin_time; //回放开始时间戳
- var endTimeStamp = end_time; //回放结束时间戳
- var recordLocation = 0; //录像存储位置:0-中心存储,1-设备存储
- var transMode = 1; //传输协议:0-UDP,1-TCP
- var gpuMode = 0; //是否启用GPU硬解,0-不启用,1-启用
- var wndId = -1; //播放窗口序号(在2x2以上布局下可指定播放窗口)
- state.oWebControl.JS_RequestInterface({
- funcName: 'startPlayback',
- argument: JSON.stringify({
- cameraIndexCode: cameraIndexCode, //监控点编号
- startTimeStamp: Math.floor(startTimeStamp / 1000).toString(), //回放开始时间戳
- endTimeStamp: Math.floor(endTimeStamp / 1000).toString(), //回放结束时间戳
- recordLocation: recordLocation, //录像存储位置
- transMode: transMode, //传输协议
- gpuMode: gpuMode, //是否开启GPU硬解
- wndId: wndId //可指定播放窗口
- })
- });
- console.log(state.oWebControl.JS_RequestInterface, ' ------face');
- console.log('当前的编号', cameraIndexCode);
- console.log('执行完成');
- };
- // 停止全部预览
- const stopAllPreview = () => {
- state.oWebControl.JS_RequestInterface({
- funcName: 'stopAllPreview'
- });
- console.log('stopAllPreview');
- };
- // 获取元素宽高
- const getElementWidth = () => {
- let scale = window.innerWidth / 3840;
- state.idWidth = document.getElementById(state.id)?.offsetWidth;
- state.idHeight = document.getElementById(state.id)?.offsetHeight;
- state.idWidth = parseInt(state.idWidth * scale);
- state.idHeight = parseInt(state.idHeight * scale);
- };
- onMounted(() => {
- getElementWidth();
- initPlugin();
- });
- onActivated(() => {
- getElementWidth();
- initPlugin();
- });
- onDeactivated(() => {
- console.log('销毁了');
- state.oWebControl.JS_HideWnd();
- state.oWebControl.JS_Disconnect().then(
- function () {
- //断开与插件服务连接成功
- console.log('断开与插件服务连接成功');
- },
- function () {
- //断开与插件服务连接失败
- console.log('断开与插件服务连接失败');
- }
- );
- });
- onUnmounted(() => {
- console.log('销毁了');
- state.oWebControl.JS_HideWnd();
- state.oWebControl.JS_Disconnect().then(
- function () {
- //断开与插件服务连接成功
- console.log('断开与插件服务连接成功');
- },
- function () {
- //断开与插件服务连接失败
- console.log('断开与插件服务连接失败');
- }
- );
- });
- // 暴露给父组件调用
- defineExpose({
- previewClick,
- playbackClick,
- stopAllPreview
- });
- </script>
- <style>
- .playWnd {
- width: 100%;
- height: 100%;
- }
- .fullscreen {
- width: 28px;
- height: 28px;
- background: url('@/assets/images/video/fullscreen.png');
- cursor: pointer;
- position: absolute;
- top: 20px;
- right: 20px;
- z-index: 10;
- }
- </style>
|