[web教学] vue3实现海康威视根据海康插件进行监控实时预览和回放功能

[复制链接]
查看1164 | 回复1 | 2023-8-23 11:51:52 | 显示全部楼层 |阅读模式 来自 中国北京
介绍

由于我的文章已经写过基于vue实现海康web插件进行视频播放开箱即用文章,这个文章是利用vite+vue3+js进行编写的,大致内容跟vue2一样,拿过去能直接用。
至于我为什么要用js而不用ts,由于海康提供的三个脚本为js语言的,ts尝试过一次,我道行太浅,没搞明确。
这些代码是可以直接利用的,如果对你有帮助,贫苦点个赞。
如果需要vue2的开辟,点击跳转vue2开辟文章 
接下来进入正题。
一、插件的下载与安装

下载海康提供的插件和js文件,我上一个文章有讲过。
点击跳转至上一个文章。
引入方式和v2有一些不同,要在主目次下的index.html中引入js文件。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8" />
  5.     <link rel="icon" type="image/svg+xml" href="/vite.svg" />
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7.     <title>Vite + Vue + js</title>
  8. </head>
  9. <body>
  10.     <div id="app"></div>
  11.     <script src="/jquery-1.12.4.min.js"></script>
  12.     <script src="/jsencrypt.min.js"></script>
  13.     <script src="/jsWebControl-1.0.0.min.js"></script>
  14.     <script type="module" src="/src/main.js"></script>
  15. </body>
  16. </html>
复制代码
二、在所需视频组件中进行代码编写

我这里是直接把我测试的代码全放进去了,可以全部复制在组件里既可以利用。
这里我用的是setup语法糖,有不一样的可自行修改。
  1. <!-- 视频播放组件 -->
  2. <template>
  3.   <div class="main" ref="playWndBox">
  4.     <div
  5.       id="playWnd"
  6.       class="playWnd"
  7.       :style="{
  8.         height: playWndHeight + 'px',
  9.         width: playWndWidth + 'px',
  10.       }"
  11.     ></div>
  12.   </div>
  13. </template>
  14. <script setup>
  15. import { ref, onMounted, onBeforeUnmount, getCurrentInstance, nextTick } from 'vue'
  16. const playWndBox = ref(null)
  17. let playWndHeight = ref('')
  18. let playWndWidth = ref('')
  19. let pubKey = ref('')
  20. let oWebControl = ref(null)
  21. let objData = ref({
  22.   appkey: "",                 //海康提供的appkey
  23.   ip: "",                     //海康提供的ip   
  24.   secret: "",                 //海康提供的secret
  25.   port: 443,
  26.   playMode: 0,        // 0 预览 1回放
  27.   layout: "1x1",      //页面展示的模块数【16】
  28. })
  29. onMounted(() => {
  30.   // 获取页面的实例对象
  31.   const pageInstance = getCurrentInstance();
  32.   // 获取dom节点对象
  33.   const tagDomObj = pageInstance.refs.playWndBox;
  34.   playWndHeight.value = tagDomObj.clientHeight;
  35.   playWndWidth.value = tagDomObj.clientWidth;
  36.   // 监听scroll事件,使插件窗口尺寸跟随DIV窗口变化
  37.   window.addEventListener("scroll", () => {
  38.     console.log(5);
  39.     // return
  40.     if (oWebControl.value != null) {
  41.       oWebControl.JS_Resize(
  42.         tagDomObj.clientWidth,
  43.         tagDomObj.clientHeight
  44.       );
  45.       this.setWndCover();
  46.     }
  47.   });
  48.   // 监听resize事件,使插件窗口尺寸跟随DIV窗口变化
  49.   window.addEventListener("resize", (e) => {
  50.     console.log(0);
  51.     if (oWebControl.value != null) {
  52.       oWebControl.JS_Resize(
  53.         tagDomObj.clientWidth,
  54.         tagDomObj.clientHeight
  55.       );
  56.       this.setWndCover();
  57.     }
  58.   });
  59.   // 初始化播放器插件
  60.   nextTick(() => {
  61.     initPlugin();
  62.   })
  63. })
  64. onBeforeUnmount(() => {
  65.   if (oWebControl.value != null) {
  66.     // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
  67.     oWebControl.JS_HideWnd();
  68.     // 销毁当前播放的视频
  69.     oWebControl.JS_RequestInterface({ funcName: "destroyWnd" });
  70.     // 断开与插件服务连接
  71.     oWebControl.JS_Disconnect();
  72.   }
  73. })
  74. const initPlugin = () => {
  75.   oWebControl = new WebControl({
  76.     szPluginContainer: "playWnd", // 指定容器id
  77.     iServicePortStart: 15900, // 指定起止端口号,建议使用该值
  78.     iServicePortEnd: 15900,
  79.     szClassId: "23BF3B0A-2C56-4D97-9C03-0CB103AA8F11", // 用于IE10使用ActiveX的clsid
  80.     cbConnectSuccess: () => {
  81.       // 创建WebControl实例成功
  82.       oWebControl
  83.         .JS_StartService("window", {
  84.           // WebControl实例创建成功后需要启动服务
  85.           // 值"./VideoPluginConnect.dll"写死
  86.           dllPath: "./VideoPluginConnect.dll",
  87.         })
  88.         .then(
  89.           function () {
  90.             // 设置消息回调
  91.             oWebControl.JS_SetWindowControlCallback({
  92.               // cbIntegrationCallBack: cbIntegrationCallBack,
  93.             });
  94.             //JS_CreateWnd创建视频播放窗口,宽高可设定
  95.             oWebControl
  96.               .JS_CreateWnd("playWnd", 1152, 581, { bEmbed: true })//这一部分很重要,两个参数为你盒子的宽高,这样是写死是防止组件加载之前出现白屏;bEmbed: true 防止窗口闪烁
  97.               .then(function () {
  98.                 // 创建播放实例成功后初始化
  99.                 init();
  100.               });
  101.           },
  102.           function () {
  103.             // 启动插件服务失败
  104.           }
  105.         );
  106.     },
  107.     // 创建WebControl实例失败
  108.     cbConnectError: function () {
  109.       // 这里写创建WebControl实例失败时的处理步骤,下面的代码仅做参看,具体实现步骤根据个人需求进行编写!!!!!!!!
  110.       // console.log(0);
  111.       // oWebControl.value = null;
  112.       // // 程序未启动时执行error函数,采用wakeup来启动程序
  113.       // window.WebControl.JS_WakeUp("VideoWebPlugin://");
  114.       // initCount++;
  115.       // if (initCount < 3) {
  116.       //   setTimeout(function () {
  117.       //     initPlugin();
  118.       //   }, 3000);
  119.       // } else {
  120.       //   setTimeout(function () {
  121.       //     setTimeout(function () {
  122.       //       $router.push('/home/PlugDown')
  123.       //     }, 4000)
  124.       //   }, 4000)
  125.       // }
  126.     },
  127.     cbConnectClose: () => {
  128.       // 异常断开:bNormalClose = false
  129.       // JS_Disconnect正常断开:bNormalClose = true
  130.       // console.log("cbConnectClose");
  131.       oWebControl.value = null;
  132.     },
  133.   });
  134.   // oWebControl.JS_CuttingPartWindow(500, 500, 500, 500);
  135. }
  136. // 初始化
  137. const init = (callback) => {
  138.   getPubKey(() => {
  139.     let appkey = objData.value.appkey;                   //综合安防管理平台提供的appkey,必填
  140.     let secret = setEncrypt(objData.value.secret); //综合安防管理平台提供的secret,必填
  141.     let ip = objData.value.ip;                           //综合安防管理平台IP地址,必填
  142.     let playMode = objData.value.playMode;                //初始播放模式:0-预览,1-回放
  143.     let port = objData.value.port;                        //综合安防管理平台端口,若启用HTTPS协议,默认443
  144.     let snapDir = "D:\\SnapDir";                        //抓图存储路径
  145.     let videoDir = "D:\\VideoDir";                      //紧急录像或录像剪辑存储路径
  146.     let layout = objData.value.layout;                   //playMode指定模式的布局
  147.     let enableHTTPS = 1;                                //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
  148.     let encryptedFields = "secret";                     //加密字段,默认加密领域为secret
  149.     let showToolbar = 1;                                //是否显示工具栏,0-不显示,非0-显示
  150.     let showSmart = 0;                                  //是否显示移动框线框,0-不显示,非0-显示
  151.     let buttonIDs =
  152.       "0,16,256,257,258,259,260,512,513,514,515,516,517,768,769"; //自定义工具条按钮
  153.     // var toolBarButtonIDs = "2049,2304" // 工具栏上自定义按钮
  154.     oWebControl
  155.       .JS_RequestInterface({
  156.         funcName: "init",
  157.         argument: JSON.stringify({
  158.           appkey: appkey,         //API网关提供的appkey
  159.           secret: secret,         //API网关提供的secret
  160.           ip: ip,                 //API网关IP地址
  161.           playMode: playMode,      //播放模式(决定显示预览还是回放界面)
  162.           port: port,             //端口
  163.           snapDir: snapDir,       //抓图存储路径
  164.           videoDir: videoDir,     //紧急录像或录像剪辑存储路径
  165.           layout: layout,         //布局
  166.           enableHTTPS: enableHTTPS,   //是否启用HTTPS协议
  167.           encryptedFields: encryptedFields, //加密字段
  168.           showToolbar: showToolbar, //是否显示工具栏
  169.           showSmart: showSmart,   //是否显示智能信息
  170.           buttonIDs,              //自定义工具条按钮
  171.         }),
  172.       })
  173.       .then(function (oData) {
  174.         oWebControl.JS_Resize(playWndWidth.value, playWndHeight.value); // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
  175.         if (callback) {
  176.           callback();
  177.         }
  178.         // 隐藏
  179.         // oWebControl.JS_HideWnd()
  180.       });
  181.   });
  182. }
  183. // RSA 加密
  184. let setEncrypt = (value) => {
  185.   let encrypt = new window.JSEncrypt();
  186.   encrypt.setPublicKey(pubKey);
  187.   return encrypt.encrypt(value);
  188. }
  189. // 获取公钥
  190. const getPubKey = (callback) => {
  191.   oWebControl
  192.     .JS_RequestInterface({
  193.       funcName: "getRSAPubKey",
  194.       argument: JSON.stringify({
  195.         keyLength: 1024,
  196.       }),
  197.     })
  198.     .then(function (oData) {
  199.       if (oData.responseMsg.data) {
  200.         pubKey = oData.responseMsg.data;
  201.         callback();
  202.       }
  203.     });
  204. }
  205. // 调用这个函数可进行视频播放
  206. // 视频预览功能
  207. const previewVideo = (data) => {
  208.   let cameraIndexCode = data;  // 获取输入的监控点编号值,必填
  209.   let streamMode = 0;          // 主子码流标识:0-主码流,1-子码流
  210.   let transMode = 1;           // 传输协议:0-UDP,1-TCP
  211.   let gpuMode = 0;             // 是否启用GPU硬解,0-不启用,1-启用
  212.   let wndId = -1;              // 播放窗口序号(在2x2以上布局下可指定播放窗口)
  213.   oWebControl.JS_RequestInterface({
  214.     funcName: "startPreview",
  215.     argument: JSON.stringify({
  216.       cameraIndexCode: cameraIndexCode, // 监控点编号
  217.       streamMode: streamMode,                 // 主子码流标识
  218.       transMode: transMode,                   // 传输协议
  219.       gpuMode: gpuMode,                       // 是否开启GPU硬解
  220.       wndId: wndId,                           // 可指定播放窗口
  221.     }),
  222.   })
  223.     .then(function () {
  224.       oWebControl.JS_SetWindowControlCallback({
  225.       });
  226.     });
  227. }
  228. </script>
  229. <style lang="scss" scoped>
  230. .main {
  231.   position: fixed;
  232.   top: 50%;
  233.   left: 20%;
  234.   transform: translateY(-50%);
  235.   width: 60vw;
  236.   height: 60vh;
  237.   margin: auto;
  238.   background-color: #ccc;
  239. }
  240. </style>
复制代码
三、增补

我这里只实现了视频播放的功能,别的功能和vue2大同小异,可以看我vue2的文章进行修改和开辟。
这些代码是可以直接利用的,如果对你有帮助,贫苦点个赞。


来源:https://blog.csdn.net/qq_45802269/article/details/130325829
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

FrankJScott | 昨天 22:45 | 显示全部楼层 来自 英国

High Rated Ai Stock Picker Analysis Info

In reply to the guy talking about using ai for trading, best app for analysing stocks, ai trading program, data analysis in stock market, best stock analyzer app, ai system for stock trading, top ten ai stocks, best free software for stock market analysis, predict stock price, using ai to pick stocks,  I highly recommend this look what i found about AI Stock Picker Analysis tips or ai stock app, best new ai stocks, chatbot stock, ways to invest in ai, best app for analysing stocks, ai technology shares, ai nasdaq stocks, best stock research app, stock market how to invest, most promising ai stocks, and don't forget this what is it worth for AI Stock Picker Platform info together with stock trading information, free ai stock prediction, fundamentals of share market, invest in chat gpt stock, startup ai companies to invest in, stock open ai, stock picking software reviews, good websites for stock analysis, ai model for stock prediction, free website for stock analysis, not forgetting sites such as this awesome AI Stock Predictions Analysis details which is also great. Also, have a look at this click here on AI Stock Investing Platform advice alongside all best free stock trading bot, best free stock forecast website, artificial intelligence share, ai trading software free, stock picking sites, stocks help, free stock prediction website, invest in chat gpt stock, ai companies invest, best share trading software, on top of this awesome AI Stock Trading Analysis link which is worth considering with best free stock analysis app, ai trading systems, share price prediction tool, publicly traded ai companies, stock analysis tools free,  see about together with chatbot stock price, best investment analysis websites, stock gpt, ai trading technology, software that tells you when to buy and sell stocks,  for good measure. Check more @ New Bonus Kasino Terbesar Tips 7ad42_a
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则