前端videojs实现m3u8格式的直播

news2024/11/18 17:52:17

一、安装

 npm install --save-dev video.js
二、引入

import videojs from "video.js";
import "video.js/dist/video-js.css";

三、template

由于此处客户需要全屏至指定框大小,而不是全屏整个屏幕所以没用插件自带的全屏控件

隐藏自带全屏控件

:deep(.vjs-fullscreen-control.vjs-control.vjs-button){
          display: none!important;
        }
<div class="page-item-right margin-l20">
     <div class="video-box" v-if="!control.isScreen">
       <div :id="'videos'+index" class="item-box" v-for="(item,index) in control.videoList" :key="item" :class="{'selected-video-box':control.selectedVideoBox===index,'aaa':index===0}" @click="control.playerItemSelect('video'+index,item,index)">
         <span  class="video-fullScreen" @click="control.fullScreenClick(item,index,true)">全屏</span>
         <el-icon class="video-close" @click.stop="control.playerItemClose('video'+index,item,index)">
           <CloseBold/>
         </el-icon>
         <video :id="'video'+index" muted=“muted” autoplay class="video-js vjs-default-skin vjs-big-play-centered"></video>
       </div>
     </div>
     <div class="video-box1" v-if="control.isScreen">
       <div :id="'videos1'+index" class="item-box" v-for="(item,index) in control.videoList1" :key="item" :class="{'selected-video-box':control.selectedVideoBox===index}" @click="control.playerItemSelect('video'+index,item,index)">
         <video :id="'video'+index" muted=“muted” autoplay class="video-js vjs-default-skin vjs-big-play-centered"></video>
         <span  class="video-fullScreen video-fullScreen1" @click="control.fullScreenClick(item,index,false)">退出全屏</span>
       </div>
     </div>
   </div>

四、js代码

在onMounted里获取到数据列表后,就调用一次getVideoList(arguments),此处默认是有数据列表数据的,且arguments对象中即是包含.m3u8地址的,

 if(state.tableData.length===0)return
      control.getVideoList(state.tableData[0].channels[0])
videoList:[],
      videoList1:[],//全屏状态的videoList,只能存放一个
      player:null,
      player1:null,
      playerList:[],
      playerList1:[],
      playerOptions:[],
      getVideoList(val){
        control.playerDispose()
        let exist=control.videoList.find(item=>{
           return item.msg===val.liveAddress
         })
         let maxViews=9
        if(!exist&&control.videoList.length<maxViews){
           control.videoList.push({msg: val.liveAddress, devID: val.id,data:val,time:Date.now()})
         }else if(!exist&&control.videoList.length>=maxViews){
           let minTime =(Math.min.apply(Math,control.videoList.map(item=>{return item.time})))
           let minTimeIndex= control.videoList.findIndex((item,index)=>{ return item.time===minTime})
           control.videoList.splice(minTimeIndex,1,{msg: val.liveAddress, devID: val.id,time:Date.now()})
        }
        control.playerList=[]
        control.videoList.forEach((item, i) => {
          control.player=null
          $(`#videos${i}`).append(` <video autoplay id='video${i}' style='width: 100%;height: 100%' class='video-js vjs-default-skin vjs-big-play-centered  ${item.devID}'></video>`);
          setTimeout(() => {
            control.player = videojs(`video${i}`, {
              controls:true,
              controlBar:['PlayToggle'],
              autoplay: true,
              width: "100%",
              height: "100%",
              preload: true,
              sources: [
                {
                  src: item.msg,
                  type: "application/x-mpegURL"
                }
              ]
            })
            control.playerList.push(control.player)
          }, 100);
        });
      },
      getVideoList1(val){
        control.playerDispose()
        control.videoList1=[]
        control.videoList1.push({msg: val.liveAddress, devID: val.id,data:val,time:Date.now()})
        control.playerList1=[]
        control.videoList1.forEach((item, i) => {
          control.player1=null
          if ($(`#videos1${i}`).children().length > 1) {
            $(`#videos1${i}`).children().not(":first").remove();
          }
          $(`#videos1${i}`).append(` <video autoplay id='video${i}' style='width: 100%;height: 100%' class='video-js vjs-default-skin vjs-big-play-centered  ${item.devID}'></video>`);
          setTimeout(() => {
            control.player1 = videojs(`video${i}`, {
              controls:true,
              controlBar:['PlayToggle'],
              autoplay: true,
              width: "100%",
              height: "100%",
              preload: true,
              sources: [
                {
                  src: item.msg,
                  type: "application/x-mpegURL"
                }
              ]
            })
            control.playerList1.push(control.player1)
          }, 100);
        });
      },

五、效果展示

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity 2DJoint 物理关节功能与总结

本文将以动图方式展示每个2D物理关节的效果&#xff0c;并解析部分重要参数的作用以及常见调配方式。 1.Distance Joint 2D&#xff08;距离关节&#xff09; 顾名思义是距离关节&#xff0c;以下为启用EnableCollision前后 关节使得两物体保持一定的距离&#xff0c;如果旋…

Apache (二十一)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 二、安装 1. yum安装 2. 编译安装 三、 目录结构 1. yum安装 2. 编译安装 四、虚拟主机头配置 1. 基本配置 2. 实现方式 五、配置文件语法检查 六、 …

MySQL [环境配置]

MySQL [环境配置] MySQL的下载sqlyog的下载 熟悉老陈的人, 都清楚我不喜欢写这些环境配置的博客 那为啥这次要写一下MySQL的环境配置呢? 因为我被这一个小小的环境配置困扰了很长时间, 淋过雨的人都想为别人撑一把伞, 我不希望我的铁汁们也被这个问题困扰 MySQL的下载 MySQL下…

3. 测试 - 软件测试生命周期 BUG 的级别和生命周期

目录 1. 软件测试的生命周期 2. 描述 BUG 2.1 为什么要进行描述 2.2 如何描述一个 BUG 练习描述 BUG&#xff1a;邮箱登录不上去 练习描述 BUG&#xff1a;ie下界面显示异常&#xff0c;界面文字有重叠 3. BUG 的级别 4. BUG 的生命周期 1. 软件测试的生命周期 软件的…

【kubernetes系列】Kubernetes之Ingress

概述 从前面的学习&#xff0c;我们可以了解到Kubernetes暴露服务的方式目前常见的只有三种&#xff1a;LoadBlancer Service、NodePort Service、Ingress&#xff1b;而我们需要将集群内服务提供外界访问就会面临以下几个问题&#xff1a; Pod 漂移问题 Kubernetes 具有强大…

ubuntu 不能检测到显卡信息

开始时&#xff1a;lspci | grep -i nvidia 01:00.0 VGA compatible controller: NVIDIA Corporation Device 2489 (rev a1) 01:00.1 Audio device: NVIDIA Corporation Device 228b (rev a1) 运行sudo update-pciids 运行 lspci | grep -i nvidia 找到显卡了

Linux - 进阶 NFS服务器搭建 详解实验操作

建立 NFS 服务器&#xff0c;使用客户端成功访问 # 搭建环境 server 为服务端&#xff0c; node1 为客户端 &#xff08; 客户端是通过 服务端克隆出来的机子&#xff0c;并改了 IP 和 主机名&#xff09; IP 都显示出&#xff0c;并且双方能够 Ping 通 这样准备环…

顶尖公司是平均水平的100倍,惊讶吗?

行业顶尖公司人员平均能力水平&#xff0c;在行业平均水平的100倍之上&#xff01; 程序员的超级榜样&#xff1a;美国integram公司13个人&#xff0c;最后被facebook用10亿美金收购 《中庸》人能一之己百之&#xff0c;人能十之己千之 趣讲大白话&#xff1a;百倍努力&#xf…

项目管理软件挑选诀窍:6个必须知道的关键点!

项目管理软件对于任何希望简化其操作和提高效率的组织来说都是一个有价值的工具。然而&#xff0c;市场上有这么多的选择&#xff0c;选择合适的软件可能是一项艰巨的任务。在本文中&#xff0c;我们将讨论如何选择满足您业务需求的项目管理软件。 1、确定你的挑战和限制 选择项…

TL5000可调谐激光器控制软件系统

画了两周时间&#xff0c;利用下班时间&#xff0c;设计了一个ITLA可调谐激光器控制系统&#xff0c;从硬件到软件。 这是使用的界面&#xff0c;实现了下面的功能&#xff1a; 1、模块信息的读取&#xff0c;包括生产日期&#xff0c;生产厂家&#xff0c;型号&#xff0c;序…

在WIN10系统中安装TIA博途V18,重启后提示安装介质不可用,请插入DVD 或检查网络连接的解决办法

在WIN10系统中安装TIA博途V18,重启后提示安装介质不可用,请插入DVD 或检查网络连接的解决办法 原因:下载的安装包为ISO文件,若没有解压缩,直接点击打开安装,则会出现这样的错误提示。 解决办法: 把安装包解压缩之后再进行安装。 安装教程可参考以下步骤: 前提条件: T…

【iOS内存管理-编译链接的过程】

文章目录 前言计算机语言文件后缀名 编译和链接的过程编译链接预处理&#xff08;预编译&#xff09;-> 产生.i文件编译 -> 产生.s文件汇编 -> 产生.o文件链接 总结 前言 就我而言&#xff0c;iOS开发的过程中接触到的编译链接方面的知识很少&#xff0c;这部分知识还…

【JavaSE】- 包装类和String常用方法

包装类和常用方法 1.1 包装类1.2 自动装箱和自动拆箱1.3 包装类型转String类型2.1 String2.2 String常用方法3.1 StringBuffer4.1 StringBuilder 1.1 包装类 1.2 自动装箱和自动拆箱 // 手动装箱int n1 100;Integer integer new Integer(n1);// 手动拆箱Integer integer02 I…

electron globalShortcut 快捷键与系统全局快捷键冲突

用 electron 开发自己的接口测试工具&#xff08;Post Tools&#xff09;&#xff0c;在设置了 globalShortcut 快捷键后&#xff0c;发现应用中的快捷键与系统全局快捷键冲突了&#xff0c;导致系统快捷键不可正常使用。 快捷键配置 export function initGlobalShortcut(main…

20款奔驰E300升级柏林之声音响系统,体验不一样的感觉

享有盛名的 Burmester 音响系统可带来独特音质&#xff0c;打造震撼的听觉体验。高性能扬声器可营造殿堂级的立体声音响效果。您可以分别为前排和后排乘客优化这一设置&#xff0c;进一步提升听觉体验。

如何快速搭建自己同城跑腿系统?尚无忧跑腿小程序源码

是一款集代买、代送、代取等服务为一体的本地同城跑腿配送系统&#xff0c;支持二次开发&#xff0c;功能定制。 跑腿系统可众包模式&#xff0c;提供全套解决方案&#xff0c;包括跑腿系统配送端、用户端以及强大的后台管理系统。 使用uniappthinkphp技术 适配支持公众号APP…

【问卷分析】调节效应检验的操作②

文章目录 2.2 当调节变量是分类变量时&#xff08;1&#xff09; 确定组别区分&#xff08;2&#xff09;检验调节效应值&#xff08;3&#xff09;结果解读 接上一篇文章&#xff1a; 【问卷分析】调节效应检验的操作① 2.2 当调节变量是分类变量时 我们将以该模型中的调节变…

ASO优化之在海外如何进行竞品分析

进行竞争对手研究&#xff0c;需要分析当前的市场形势&#xff0c;确定竞争对手表现的模式&#xff0c;并将其应用到我们应用营销策略中。不同的应用可以在直观的用户界面上进行简单的比较&#xff0c;很容易看到长期趋势。 在App Store和Google Play上获取竞争对手评论区的信…

promise规范及应用

##promise解析 *啥是异步? //异步执行let count 1let timer setTimeout(function () {countconsole.log(in, count);}, 1000);console.log(out);// out>1000>in//循环执行let count 1let timer setInterval(function () {countconsole.log(in, count);}, 1000);con…

YOLO学习笔记1. YOLOV1的基本概念

YOLO学习笔记1. YOLOV1的基本概念 一、 YOLO简介二、一些基本概念1. two-stage和one-stage2. 指标分析&#xff08;1&#xff09;精度的概念&#xff08;2&#xff09;召回率的概念&#xff08;3&#xff09;IOU&#xff08;4&#xff09;置信度阈值&#xff08;5&#xff09; …