vue中使用mpegts.js播放flv的直播视频流

第一步:引入mpegts.js

npm install --save mpegts.js

第二步:在vue文件中引入mpegts.js的依赖

在这里插入图片描述

第三步:编写展示视频的盒子

我这里是使用循环遍历的方式创建video标签,这样方便后面随机展示视频使用

<template><div><el-row><el-col :span="24"><div class="play-video-box"><input id="tag" v-model="tag" /><el-button @click="load">重新加载</el-button><el-button @click="start">开始播放</el-button><el-button @click="pause">暂停</el-button><el-button @click="destory">全部销毁</el-button></div></el-col></el-row><el-row><el-col :span="12" v-for="item in 4" :key="item"><div class="grid-content"><videoclass="video":id="getDivClassName(item)"autoplay="true"muted="false"controls="false"@click="saveMap(item)">{{ item }}</video></div></el-col></el-row></div>
</template>

第四步:编写播放视频和销毁视频的方式

<script setup lang="ts">
import mpegts from 'mpegts.js';
import { ref, onUnmounted } from 'vue';const flvPlayer: any = ref();
const tag = ref(null);
const videoMap = new Map();
/*** 创建 mpegts 实例*/
const initFlv = (ops: { URL: string; elementId: string }) => {if (tag.value != null && mpegts.isSupported()) {// 根据id名称创建对应的videoconst ele = document.getElementById(ops.elementId);flvPlayer.value = mpegts.createPlayer({type: 'flv', // 指定媒体类型isLive: true, // 开启直播(是否为实时流)hasAudio: false, // 关闭声音(如果拉过来的视频流中没有音频一定要把这里设置为fasle,否则无法播放)cors: true, // 开启跨域访问url: ops.URL // 指定流链接(这里是传递过过来的视频流的地址)},{enableWorker: false, //启用分离的线程进行转换(如果不想看到控制台频繁报错把它设置为false,官方的回答是这个属性还不稳定,所以要测试实时视频流的话设置为true控制台经常报错)enableStashBuffer: false, //关闭IO隐藏缓冲区(如果需要最小延迟,则设置为false,此项设置针对直播视频流)stashInitialSize: 128, //减少首帧等待时长(针对实时视频流)lazyLoad: false, //关闭懒加载模式(针对实时视频流)lazyLoadMaxDuration: 0.2, //懒加载的最大时长。单位:秒。建议针对直播:调整为200毫秒deferLoadAfterSourceOpen: false, //在MediaSource sourceopen事件触发后加载。在Chrome上,在后台打开的标签页可能不会触发sourceopen事件,除非切换到该标签页。liveBufferLatencyChasing: true, //追踪内部缓冲区导致的实时流延迟liveBufferLatencyMaxLatency: 1.5, //HTMLMediaElement 中可接受的最大缓冲区延迟(以秒为单位)之前使用flv.js发现延时严重,还有延时累加的问题,而mpegts.js对此做了优化,不需要我们自己设置快进追帧了liveBufferLatencyMinRemain: 0.3 //HTMLMediaElement 中可接受的最小缓冲区延迟(以秒为单位)});// mpegtsflvPlayer.value.attachMediaElement(ele);videoMap.set(ops.elementId, flvPlayer.value);play(flvPlayer.value);flvEvent();}
};const play = (flv: any) => {flv.load();flv.play();
};// mpegts
const flvEvent = () => {// 视频错误信息回调flvPlayer.value.on(mpegts.Events.ERROR, (errorType: any, errorDetail: any, errorInfo: any) => {console.log('类型:' + JSON.stringify(errorType),'报错内容' + errorDetail,'报错信息' + errorInfo);});//【重要事件监听】http 请求建立好后,该事件会一直监听 mpegts 实例flvPlayer.value.on(mpegts.Events.STATISTICS_INFO, () => {const end = flvPlayer.value.buffered.end(0); //获取当前buffered值(缓冲区末尾)const differTime = end - flvPlayer.value.currentTime; //获取bufferend与当前播放位置的差值console.log('差值为:' + differTime);});
};/*** 重新加载视频*/
const load = () => {for (let index = 1; index < 5; index++) {if (!videoMap.has('video-contianer-' + index)) {initFlv({URL: 'http://localhost:1010/video/' + tag.value,//这里改成自己要拉流的视频地址,我这里放的是自己后端推送的1078视频的flv实时视频流elementId: 'video-contianer-' + index});break;}}
};
/*** 播放*/
const start = () => flvPlayer.value.play();
/*** 暂停*/
const pause = () => flvPlayer.value.pause();
/*** 销毁*/
const destory = () => {if (videoMap.size > 0) {for (let [key, flv] of videoMap) {flv.pause;flv.unload();flv.detachMediaElement();flv.destroy();flv = null;videoMap.delete(key);console.log('销毁掉视频:' + key);}} else {console.log('没有要销毁的视频');}
};
const getDivClassName = (index: any) => {return 'video-contianer-' + index;
};const saveMap = (index: any) => {test001.value = '-' + index;videoMap.set(index, test001.value);
};onUnmounted(() => {destory();
});
</script>

第五步:设置展示样式

<style scoped lang="less">
.play-video-box {height: 45px;margin-top: 10px;margin-left: 200px;
}
.grid-content {height: 315.5px;margin-top: 5px;margin-left: 5px;
}
#tag {width: 280px;height: 30px;
}
//所有控件
video::-webkit-media-controls-enclosure {display: none;
}
.video {width: 100%;height: 100%;object-fit: cover;
}
</style>

第六步:效果图

(我的是在输入框中输入想要拉取的设备和通道号点击重新加载即可,多次点击会将四个窗格都展示同样的视频)
在这里插入图片描述

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

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

相关文章

甄选7款前端动画特效源码资源分享(附在线预览)

分享7款有趣也实用的前端动画特效 其中有CSS动画、canvas动画、js小游戏等等 下面我会给出特效样式图或演示效果图 但你也可以点击在线预览查看源码的最终展示效果及下载源码资源 交互式加载动画 基于three.js制作的一款交互式加载动画 鼠标长按时还有环形的过渡到圆圈的效果…

第十二章 Java内存模型与线程(二)

文章目录 12.4 Java与线程12.4.1 线程的实现12.4.2 Java线程调度12.4.3 状态转换 12.5 Java与协程12.5.1 内核线程的局限12.5.2 协程的复苏12.5.3 Java的解决方案 12.4 Java与线程 12.4.1 线程的实现 实现线程主要有三种方式&#xff1a;使用内核线程实现&#xff08;1&#…

LLaMa2 Chat gpt 大模型本地部署初体验

一直想在自己电脑或者测试环境随便找台服务器尝试部署一下“大模型”&#xff0c;但“大模型”对于内存和GPU的要求令人望而却步&#xff0c;层出不穷的各种术语也令人困惑&#xff0c;有点难以下手。 经过一段时间&#xff0c;在百度千帆大模型平台、讯飞星火大模型平台、魔搭…

工业平板定制方案_基于联发科、紫光展锐平台的工业平板电脑方案

工业平板主板采用联发科MT6762平台方案&#xff0c;搭载Android 11.0操作系统&#xff0c; 主频最高2.0GHz&#xff0c;效能有大幅提升;采用12nm先进工艺&#xff0c;具有低功耗高性能的特点。 该工业平板主板搭载了IMG GE8320图形处理器&#xff0c;最高主频为680MHz, 支持108…

RK3566RK3568安卓11隐藏状态栏带接口

文章目录 前言一、创建全局变量二、设置应用添加隐藏导航栏按钮三、添加按钮功能四、动态隐藏还有显示功能五、创建系统导航栏广播接口总结 前言 关于Android系统的状态栏&#xff0c;不同的客户有不同的需求: 有些客户需要永久隐藏状态栏&#xff0c;有些客户需要在设置显示中…

PDF 文档解除密码

PDF 文档解除密码 1. 文件 -> 文档属性 -> 安全 -> 文档限制摘要2. PDF365References 1. 文件 -> 文档属性 -> 安全 -> 文档限制摘要 密码保护《算法设计与分析基础_第3版.pdf》 2. PDF365 https://www.pdf365.cn/ 免费功能 -> PDF 去密码 开始去除 Re…

计算机网络-NAT网络地址转换

今天来回顾下之前所学的知识&#xff0c;将它们串联起来进行巩固。一开始了解了IP编址进行IP设置和划分网段&#xff1b;学习了二层以太网交换&#xff0c;了解了二层通信基础&#xff1b;学习了路由基础知识&#xff0c;大致了解到了路由是什么&#xff1f;静态路由和动态路由…

“具身智能”浪潮中,达闼机器人的商业化“奇点”已然到来?

当前&#xff0c;人形机器人产业正在快速发展&#xff0c;而2023年必将会是载入史册的一年。 具体来看&#xff0c;2023年&#xff0c;AI技术大爆发&#xff0c;可在语言、视觉、运动控制、降低研发成本等多方面赋能人形机器人产业发展。与此同时&#xff0c;特斯拉、波士顿动…

如何用AI提高论文阅读效率?

已经2024年了&#xff0c;该出现一个写论文解读AI Agent了。 大家肯定也在经常刷论文吧。 但真正尝试过用GPT去刷论文、写论文解读的小伙伴&#xff0c;一定深有体验——费劲。其他agents也没有能搞定的&#xff0c;今天我发现了一个超级厉害的写论文解读的agent &#xff0c…

利用docker的LNMP

目录 服务器环境 任务需求 服务搭建 Nginx Mysql Php 启动 wordpress 服务 服务器环境 容器 操作系统 IP地址 主要软件 nginx CentOS 7 172.20.0.10 Docker-Nginx mysql CentOS 7 172.20.0.20 Docker-Mysql php CentOS 7 172.2…

Lazada不懂英文能做吗?Lazada国内店铺好做吗?-站斧浏览器

Lazada不懂英文可以做吗&#xff1f; Lazada作为一个国际化的电商平台&#xff0c;为了方便用户来自不同国家和地区的购物需求&#xff0c;提供了多语言支持。对于不懂英文的用户来说&#xff0c;他们同样可以在Lazada上进行购物。 首先&#xff0c;Lazada平台上的界面和商品…

爬虫案例—抓取豆瓣电影的电影名称、评分、简介、评价人数

爬虫案例—抓取豆瓣电影的电影名称、评分、简介、评价人数 豆瓣电影网址&#xff1a;https://movie.douban.com/top250 主页截图和要抓取的内容如下图&#xff1a; 分析&#xff1a; 第一页的网址&#xff1a;https://movie.douban.com/top250?start0&filter 第二页的…