vue项目业务实现,视频监控-文件流,大屏适配方案(v-scale-screen),websocket前端

最近把以前的业务场景及解决方案整理了一下,具体实现的工具如下:

监控-视频文件流==>video.js + videojs-contrib-hls
大屏适配方案==> v-scale-screen
websocket==>sockjs-client+ webstomp-client

视频监控-文件流

在这里插入图片描述

使用方法

下载video插件,


yarn add video.js -save -D  或者 npm i video.js -save -D  
yarn add videojs-contrib-hls -save -D  或者 npm i videojs-contrib-hls -save -D  

使用方法

(1)导入


//导入 css 与 videojs (可全局,可只在使用的页面)
import "video.js/dist/video-js.css";
import videojs from "video.js";

(2)模板中写入标签

<video ref="videoPlayer" style="width: 100%; height: 100%" class="video-js videoNmae"></video>

(3)页面渲染时调用函数,渲染视频


data(){return {optionc: {autoplay: true,controls: true,muted: true,sources: [{src: "视频地址",type: "application/x-mpegURL", // 监控类直播视频流为此格式// src: '',// type: "video/mp4", // 本地video视频播放为此格式},],},}
}mounted() {// 将方法包装成异步this.$nextTick(() => {setTimeout(() => {this.playerd = videojs(   // playerd 为data中的变量,初始值可设置为nullthis.$refs.videoPlayer,  // this.$refs.videoPlayer为放置视频的domthis.options,   // this.options为视频的配置,可根据官方文档自行配置,下面有我的配置项function onPlayerReady() {console.log("onPlayerReady", this);});this.playerda = videojs(this.$refs.videoPlayera,this.optionc,function onPlayerReady() {console.log("onPlayerReady", this);});});})}// 定时器的清理beforeDestroy() {//clearInterval(this.int)// var videoTime = document.getElementById("myvideo");videoTime.pause();}

optionc为视频的配置,具体其他配置可查看官网传送门
组件销毁时需要将视频的实例销毁,避免内存泄漏

大屏适配方案(v-scale-screen)

1、在项目初期,寻找大屏适配的方案,在比较多种方案后,决定使用v-scale-screen的方案,此插件根据CSS3的scale缩放功能对页面进行适配(不受浏览器缩放的影响)

缺点 : 页面尺寸过大时,开发时电脑屏幕无法看清楚细节,需要使用触控板进行放大

npm i  v-scale-screen

// main.js中注册
import VScaleScreen from 'v-scale-screen';Vue.component('v-scale-screen', {name: 'v-scale-screen',...VScaleScreen
});Vue.use(VScaleScreen, {designWidth: 750, // 设计稿宽度designHeight: 1334, // 设计稿高度
});// 使用<v-scale-screen :size="size" :boxStyle="{background:'null'}" >。。。。。。。 </v-scale-screen>   

详情可见npm官网传送门

websocket前端

2.使用插件sockjs-client,webstomp-client(最后使用方案)

1.yarn add sockjs-client webstomp-client 或者 npm i sockjs-client webstomp-client

2.创建stomp.js文件

import SockJS from "sockjs-client";
import Stomp from "webstomp-client";export class Websocket {ar = new Array();debug = false;// 客户端连接信息stompClient = {};constructor() {console.log("aaaaaaaaaa");//首次使用构造器实例if (!Websocket.instance) {console.log("bbbbbbb");this.init();//将this挂载到Websocket这个类的instance属性上Websocket.instance = this;}console.log("ccccc--->" + this.stompClient.connected);return Websocket.instance;}getStompClient() {return Websocket.instance.stompClient;}// 初始化init(callBack) {console.log("1111111111111=>", this.stompClient);if (!this.stompClient.connected) {console.log("222222");const socket = new SockJS("https://sdd.cevmp.cn/wss/publicServer");//websocket请求地址this.stompClient = Stomp.over(socket);this.stompClient.hasDebug = this.debug;this.stompClient.connect({},(suce) => {console.log("连接成功,信息如下 ↓");while (this.ar.length > 0) {let a = this.ar.pop();// this.sub(a.addres, a.fun);let timestamp = new Date().getTime() + a.address;this.stompClient.subscribe(a.addres,(message) => {//this.console(message, "message");let data = JSON.parse(message.body);console.log("000000000000000000000订阅消息通知,信息如下 000000000" +a.addres);a.fun(data);},{id: timestamp,});}if (callBack) {callBack();}},(err) => {if (err) {console.log("连接失败,信息如下 ↓");console.log(err);}});} else {if (callBack) {console.log("已连接成功,无需重复创建===========================>");callBack();}}}// 订阅sub(address, callBack) {console.log(address + "-->" + this.stompClient);if (!this.stompClient.connected) {this.ar.push({addres: address,fun: callBack,});console.log("没有连接,无法订阅", address);this.reconnect(1);return;}// 生成 idlet timestamp = new Date().getTime() + address;console.log("订阅成功 -> " + address);this.stompClient.subscribe(address,(message) => {//this.console(message, "message");let data = JSON.parse(message.body);// console.log(data + " 订阅消息通知,信息如下 ↓↓↓↓↓↓↓");callBack(data);},{id: timestamp,});}// 取消订阅unSub(address) {if (!this.stompClient.connected) {console.log("没有连接,无法取消订阅 -> " + address);return;}let id = "";for (let item in this.stompClient.subscriptions) {if (item.endsWith(address)) {id = item;break;}}this.stompClient.unsubscribe(id);console.log("取消订阅成功 -> id:" + id + " address:" + address);}// 断开连接disconnect(callBack) {if (!this.stompClient.connected) {console.log("没有连接,无法断开连接");return;}this.stompClient.disconnect(() => {console.log("断开成功");if (callBack) {callBack();}});}// 单位 秒reconnect(time) {if (!this.stompClient.connected) {console.log("连接丢失");// console.log("重新连接中...");//this.init();}}console(msg) {if (this.debug) {console.log(msg);}}
}

3.使用方法

按需引入Websocket后,在mounted钩子里调用,使用new websocket().sub()方法 传入两个参数

第一个参数:数据格式为字符串,可传与后端约定好的标识,确定是进入的页面,推与之匹配的数据

第二个参数:传递一个函数,此函数的第一个参数即后端返回的数据

注意事项:工具函数内还有许多方法,比如取消订阅,可自行按需使用

优点:1.自动识别wss与https,ws与http的对应关系,无需再写 wss协议开头的地址 ; 2.websocket调试本地时只需更改工具函数内的地址

缺点:1.需要接入外部websocket时,由于没有与其约定,则需要使用原生格式

import { Websocket } from "@/utils/stomp";
mounted() {let stomp = new Websocket();// 初始化// 初始化成功 就执行订阅stomp.sub("/topic/orderlyCharger", (res) => {console.log(res,"这个是后端推的数据");});},

取消订阅

 
beforeDestroy() {let stomp = new Websocket();stomp.unSub("/topic/publicCharger")},

websocket页面之间的切换可能会造成数据污染,因此最好在组件销毁之前取消订阅

学习更多vue知识请关注CRMEB。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/14545.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter性能优化方案

最近用jmeter测试并发出现了访问端口异常问题的排查及解决方案做一个归纳&#xff1a; 背景&#xff1a;接口压测异常情况发生率达到了99% 线上情况&#xff1a; 错误情况展示&#xff1a; 原因&#xff1a; Jmeter里的http sample勾选了keep alive&#xff0c;导致会话一直…

系统上线前,SQL脚本的9大坑

前言 系统上线时&#xff0c;非常容易出问题。 即使之前在测试环境&#xff0c;已经执行过SQL脚本了。但是有时候&#xff0c;在系统上线时&#xff0c;在生产环境执行相同的SQL脚本&#xff0c;还是有可能出现一些问题。 有些小公司&#xff0c;SQL脚本是开发自己执行的&am…

第47步 深度学习图像识别:SqueezeNet建模(Pytorch)

基于WIN10的64位系统演示 一、写在前面 &#xff08;1&#xff09;SqueezeNet SqueezeNet是一种轻量级的深度神经网络架构&#xff0c;由Iandola等人在2016年提出。这种模型的最大特点是参数量极少&#xff0c;仅有510千个参数&#xff0c;而且模型大小只有5MB&#xff0c;比…

MobileNeRF在Windows上的配置

MobileNeRF于2023年提出&#xff0c;源码地址&#xff1a;https://github.com/google-research/jax3d/tree/main/jax3d/projects/mobilenerf &#xff0c;论文为&#xff1a;《MobileNeRF: Exploiting the Polygon Rasterization Pipeline for Efficient Neural Field Renderin…

步入JAVA——环境搭建与项目通览

前言 在这篇文章中&#xff0c;荔枝会介绍如何配置Java后端开发环境并借助一个Java web项目简单介绍一下Java的后端开发逻辑。与python的后端开发逻辑是类似的&#xff0c;Java的后端开发其实也是通过一个个类来实现的。对于像荔枝这种小白白来说&#xff0c;入门的第一个练手J…

GitHub快速上手--GitHub高效操作教程

一、前言 如果你正在看我的这篇文章&#xff0c;说明你已经对GitHub有了一些基础的了解&#xff0c;下面我们将详细叙述每一步的操作&#xff0c;以保证你能够快速上手GitHub&#xff0c;完成对代码的管理。 二、创建仓库 登录GitHub账号&#xff0c;点击页面右上角的加号&am…

idea创建web项目没有jsp选项,不识别jsp,没有tomcat选项

如果你的idea的web项目中没有jsp选项 同时也不识别jsp 那么建议你检查一下你的idea是否为社区版 如果是社区版那么没有jsp的问题无法解决&#xff0c;这只是无法识别&#xff0c;但是语句对的可以正常运行 解决这个问题建议换个idea 至于tomcat&#xff0c; 在plugins中搜s…

人工智能与Chat GPT

一本书全面掌握ChatGPT&#xff0c;既有向ChatGPT提问的技巧&#xff0c; 也有构建自己的ChatGPT模型的方法&#xff0c;涵盖开发背景、关联技术、使用方法、应用形式、实用案例等 人工智能是我们这个时代最热门的话题&#xff0c;人们既希望它能代替我们做一些工作&#xff0c…

Azure 中 Linux的时间同步问题

问题概述 Azure环境中&#xff0c;将群集主机放置在不同的可用区。由于网络限制比较严格没有开启外部或内部NTP时间同步&#xff0c;而是考虑用Azure主机的时间同步&#xff0c;但群集会由于时间差异而出现异常告警信息。 问题分析 问题主要是以下原因形成&#xff1a; 自…

Android Glide预加载RecyclerViewPreloader,ViewPreloadSizeProvider,kotlin

Android Glide预加载RecyclerViewPreloader,ViewPreloadSizeProvider&#xff0c;kotlin implementation com.github.bumptech.glide:glide:4.15.1implementation ("com.github.bumptech.glide:recyclerview-integration:4.14.2") {// Excludes the support library …

【新版系统架构】第十二章-信息系统架构设计理论和实践

软考-系统架构设计师知识点提炼-系统架构设计师教程&#xff08;第2版&#xff09; 第一章-绪论第二章-计算机系统基础知识&#xff08;一&#xff09;第二章-计算机系统基础知识&#xff08;二&#xff09;第三章-信息系统基础知识第四章-信息安全技术基础知识第五章-软件工程…

python接口自动化(二十三)--unittest断言——上(详解)

简介 在测试用例中&#xff0c;执行完测试用例后&#xff0c;最后一步是判断测试结果是 pass 还是 fail&#xff0c;自动化测试脚本里面一般把这种生成测试结果的方法称为断言&#xff08;assert&#xff09;。用 unittest 组件测试用例的时候&#xff0c;断言的方法还是很多的…