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

news2024/11/15 9:21:21

第一步:引入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">
					<video
						class="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名称创建对应的video
		const 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 中可接受的最小缓冲区延迟(以秒为单位)
			}
		);
		// mpegts
		flvPlayer.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.coloradmin.cn/o/1387757.html

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

相关文章

【前端发版】vue前端发版 步骤

1、 提交代码 代码合并通过之后到deb分支 2、git checkout 切换到dev分支上 运行起来看看自己刚刚提交的代码有没有错误 3、拉取最新代码 git pull 3、yarn run build 4、打包好的文件叫dist 重新命名为服务器里替换包名 5、登录文件传输 开始替换 替换的过程中 首先删除备…

五指CMS copyfrom.php SQL注入漏洞复现(CVE-2023-52064)

0x01 产品简介 WUZHI CMS是北京五指互联科技有限公司 的一套基于PHP和MySQL的开源内容管理系统,响应式布局,一个网站兼容多个终端 微信接口全支持,快速构建微营销平台 开放接口,支持第三方APP无缝接入。 0x02 漏洞概述 Wuzhicms 内容管理系统的/core/admin/copyfrom.p…

Python入门-字面量,函数,类

Python 中常用的有6种值&#xff08;数据&#xff09;的类型 (1)字符串需要用英文的双引号包围起来&#xff0c;比如打印"helloworld" &#xff08;2&#xff09;浮点数&#xff0c;整数&#xff0c;字符串等字面量的写法 &#xff08;3&#xff09;字符串定义及打印…

系统架构09 - 信息安全(中)

信息安全 信息摘要特点算法作用 数字签名主要功能原理 数字证书&#xff08;公钥证书&#xff09;原理格式 PKI公钥基础设施组成部分基础技术功能 信息摘要 就是一段数据的特征信息。 当数据发生了改变&#xff0c;信息摘要也会发生改变。 发送方会将数据和信息摘要一起传给接…

二叉树:从基础结构到高级遍历技术

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 引言结构定义接口需求构建二叉树销毁二叉树计算节点和叶子的数量二叉树节点个数二叉树叶子节点个数二叉树第k层节点个数 二叉树查找值为x的节点二叉树的…

Dhcp中继华为+虚拟机

拓扑图&#xff1a; 配置二层交换机sw1 创建vlan 将e0/0/1接口封装到vlan10 将e0/0/2接口封装到vlan20 将e0/0/4接口封装到vlan100 将e0/0/3接口配置为中继口 并允许所有vlan通过 配置三层交换机Lsw1 将e0/0/1接口配置中继口 并允许所有vlan通过 开启dhcp 创建vlan 10 20 100 进…

前端学习路径

菜鸟感觉很多人不太知道菜鸟写的博客是一个可以跟着学习、一起深入理解的过程&#xff0c;其中包括了菜鸟从刚开始学习到后面重新学习&#xff0c;再到后面进入学框架等一系列学习过程、知识和感悟&#xff0c;所以菜鸟把自己的博客整理成一个目录提取出来&#xff0c;好让读者…

使用vue快速开发一个带弹窗的Chrome插件

vue-chrome-extension-quickstart 说在前面 &#x1f388;平时我们使用Chrome插件通常都只是用来编写简单的js注入脚本&#xff0c;大家有没有遇到过需要插件在页面上注入一个弹窗呢&#xff1f;比如我们希望可以通过快捷键快速唤起ChatGPT面板或者快速唤起一个翻译面板&#x…

汽车线束的汽配企业MES管理系统解决方案

随着科技的飞速发展和环保需求的日益提升&#xff0c;新能源汽车在全球范围内崭露头角&#xff0c;成为未来出行的主导力量。在这股浪潮中&#xff0c;中国凭借其强大的研发实力和市场敏锐度&#xff0c;迅速崛起为新能源汽车领域的佼佼者。而作为汽车数字化控制与智能化应用的…

openpyxl绘制图表

嘿&#xff0c;你是不是在处理Excel文件时感到束手无策&#xff1f;是不是想要一个简单而又强大的工具来处理数据分析和图表制作&#xff1f;别担心&#xff0c;我们有解决方案&#xff01;让我向你介绍openpyxl&#xff0c;这是一个Python库&#xff0c;专门用于处理Excel文件…

从车联网到智慧城市:智慧交通的革新之路

一、引言 1、智慧城市的概念和发展背景 智慧城市&#xff08;Smart City&#xff09;是指以信息技术为基础&#xff0c;运用信息与通信等手段&#xff0c;对城市各个核心系统各项关键数据进行感测、分析、整合和利用&#xff0c;实现对城市生活环境的感知、资源的调控&#x…

基于Ubuntu22.04部署生产级K8S集群v1.27(规划和核心组件部署篇)

本文档主要根据k8s官网文档和其插件的官网文档&#xff0c;参考部分他人优秀经验&#xff0c;在实际操作中逐渐完成&#xff0c;比较详尽&#xff0c;适合在境内学习者和实践者参考。 实操环境基于VMware Workstation 17 pro&#xff0c;采用ubuntu22.04操作系统&#xff08;有…

MATLAB运行simulink模型显示找不到库Failed to load library

MATLAB运行simulink模型显示找不到库Failed to load library ‘ 原因 上述的错误即提示加载某一个库失败了&#xff0c;原因就是MATLAB需要在其设定的set path中寻找。 设置 paths 查看paths 添加成功后再次打开MATLAB的set path&#xff0c;可以看到相关文件及库被添加进来…

身体互联网 (IoB)

现在&#xff0c;我们的互联网网关就是我们手中的一个小设备。 普渡大学副教授施里亚斯森表示。 我们不断地看着这个盒子&#xff0c;我们低着头走路&#xff0c;我们把大部分时间都花在它上面。如果我们不想让这种未来继续下去&#xff0c;我们就需要开发新技术。相反&#x…

K8s:Pod生命周期

我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期&#xff0c;它主要包含下面的过程&#xff1a; pod创建过程 运行初始化容器&#xff08;init container&#xff09;过程 运行主容器&#xff08;main container&#xff09; 容器启动后钩子&#xff08;post st…

Uibot (RPA设计软件)Mage AI智能识别(发票识别)———课前材料五

微信群发助手机器人的小项目友友们可以参考小北的课前材料二博客~ (本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~&#xff09; 紧接着小北的前两篇博客&#xff0c;友友们我们即将开展新课的学习~RPA 培训前期准备指南——安装Uibot(RPA设计软件&#x…

Python展示 RGB立方体的二维切面视图

代码实现 import numpy as np import matplotlib.pyplot as plt# 生成 24-bit 全彩 RGB 立方体 def generate_rgb_cube():# 初始化一个 256x256x256 的三维数组rgb_cube np.zeros((256, 256, 256, 3), dtypenp.uint8)# 填充立方体for r in range(256):for g in range(256):fo…

积萨伯爵潮流品牌,全品类国际化,新营销创业掀起创业新浪潮

近年来中古消费开始在国内广泛兴起、受众逐渐扩大&#xff0c;尤其是在这几年疫情的影响下&#xff0c;借助直播带货的东风&#xff0c;二奢经济逐渐实现了从小众向大众的实力破圈。在二奢经济大潮下&#xff0c;一股新型创业风正刮起。 95后、00后为代表的Z时代年轻人渐渐成为…

压缩编码之JPEG变换编码不同压缩率的模拟的实现——数字图像处理

原理 离散余弦变换&#xff08;DCT&#xff09;和量化是图像压缩中的两个关键步骤&#xff0c;尤其是在JPEG压缩标准中。 离散余弦变换&#xff08;DCT&#xff09;&#xff1a;DCT的目的是将图像从空间域&#xff08;即像素表示&#xff09;转换到频率域。这种转换后&#x…

单例模式实现最好的方式即枚举实现

单例类作为23种设计模式当中最常用的设计模式&#xff0c;实现方式有很多种&#xff0c;比较流行的是DCL(DoubleCheckLock)双重检查的实现&#xff0c;线程安全&#xff0c;又比较好&#xff0c;除了存在序列化的问题之外&#xff0c;还算不错&#xff0c;如果对DCL模式还不熟悉…