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">
					<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>

第六步:效果图

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k8s存储卷-动态PV

pv和PVC&#xff0c;存储卷&#xff1a; 存储卷&#xff1a; EmptyDir&#xff1a;容器内部&#xff0c;随着pod销毁&#xff0c;emptyDir也会消失&#xff0c;不能做数据持久化 HostPath&#xff1a;持久化存储数据&#xff0c;可以和节点上目录做挂载&#xff0c;pod被销毁…

屏蔽/非屏蔽线、屏蔽/非屏蔽端口介绍

一、双绞线 双绞线&#xff08;twisted pair&#xff0c;TP&#xff09;是一种综合布线工程中最常用的传输介质&#xff0c;是由两根具有绝缘保护层的铜导线组成的。把两根绝缘的铜导线按一定密度互相绞在一起&#xff0c;每一根导线在传输中辐射出来的电波会被另一根线上发出的…

vivado 使用约束、添加和创建约束文件

使用约束 Vivado IDE支持Xilinx设计约束&#xff08;XDC&#xff09;和Synopsys设计约束&#xff08;SDC&#xff09;文件格式。SDC格式用于定时约束&#xff0c;而XDC格式用于两者时间和物理约束。约束可以包括位置、时间和I/O限制。您可以在设计流程的各个步骤中创建约束&am…

1 python计算机基础

计算机基础和环境搭建 1 计算机基础和环境搭建1.计算机基础1.1 基本概念1.2 编程语言1.3 编译器/解释器 2.学习编程的本质3.Python的介绍3.1 语言的分类3.2 Python3.3 Python的解释器种类&#xff08;了解&#xff09;3.4 CPython解释器的版本 4.环境搭建4.1 安装Python解释器4…

详解SpringCloud微服务技术栈:Nacos配置管理

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;详解SpringCloud微服务技术栈&#xff1a;Nacos服务搭建及服务分级存储模型 &#x1f4da;订阅专栏&#xff1a;微服务技术全家桶…

LaTeX系列1——主结构

初学&#xff0c;可交流&#xff0c;轻喷 \documentclass{book} \begin{document} \title{Book Title} \author{Author Name} \date{\today} \maketitle\chapter{Introduction} This is the introduction chapter of the book.\section{First Section} The first section of t…

学位论文中常用的参考文献格式

撰写学位论文中&#xff0c;要确保文献列表中列出的参考文献格式正确&#xff0c;为此这篇文章给出常用的参考文献格式。 目录 目录 一、学位论文中常用的文献类型&#xff1a; 1.1学位论文中常用的文献类型&#xff1a; 1.2作者名字的书写格式&#xff1a; 1.3特殊符号// …

JRTP实时音视频传输(1)-必做的环境搭建与demo测试

1.需求 1&#xff09;支持协议自动切换。在网络优的情况下使用TCP、网络差的情况下使用UDP&#xff0c;满足实时音视频传输需求&#xff0c; 2&#xff09;支持RTCP &#xff0c;流量控制&#xff0c;阻塞控制等。需要能支持RTCP&#xff0c;这样便能在这个基础上&#xff0c;…

人工智能 | 生成式 AI 如何重塑开发流程和开发工具?

生成式 AI 如何重塑开发流程和开发工具&#xff1f; 生成式人工智能&#xff08;Generative Artificial Intelligence&#xff0c;GAI&#xff09;是一种基于大规模数据训练学习&#xff0c;从而生成新的原创内容的人工智能。生成式人工智能可以生成各种形式的数据&#xff0c…

Kafka-生产者

Kafka在实际应用中&#xff0c;经常被用作高性能、可扩展的消息中间件。 Kafka自定义了一套网络协议&#xff0c;只要遵守这套协议的格式&#xff0c;就可以向Kafka发送消息&#xff0c;也可以从Kafka中拉取消息。 在实践生产过程中&#xff0c;一套API封装良好、灵活易用的客…

CC工具箱使用指南:【添加图层名和路径到字段】

一、简介 如题&#xff0c;这个工具的目的就是将图层的名称和路径添加到字段值中。 有时候图层的名称和路径也是重要的信息&#xff0c;需要参与到字段的计算或是分析中&#xff0c;但是Arcgis Pro中没有一个方便的方法可以将其写入字段值&#xff0c;因此&#xff0c;就做了…

机器学习周刊第六期:哈佛大学机器学习课、Chatbot Ul 2.0 、LangChain v0.1.0、Mixtral 8x7B

— date: 2024/01/08 — 吴恩达和Langchain合作开发了JavaScript 生成式 AI 短期课程&#xff1a;《使用 LangChain.js 构建 LLM 应用程序》 大家好&#xff0c;欢迎收看第六期机器学习周刊 本期介绍10个内容&#xff0c;涉及Python、机器学习、大模型等,目录如下&#xff…

特征工程-特征处理(三)

特征处理 连续型变量处理&#xff08;二&#xff09; 多特征 降维 PCA PCA是一种常见的数据分析方式&#xff0c;通过数据分解&#xff0c;将高维数据降低为低维数据&#xff0c;同时最大程度保持数据中保存的信息。 from sklearn.decomposition import PCA A np.array([[84…

表单生成器基于(form-create-designer+ant design vue)

效果展示 1.源码地址&#xff1a; 前端&#xff1a;https://gitee.com/houshixin/form-design-ui 后端&#xff1a;https://gitee.com/houshixin/form-design-web 2.单独使用前端的时候就把请前后台的接口注释就可以 3.都启动的话&#xff1a; 1&#xff09;.先导入数据库 2.表…

altair,一个超级厉害的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 数据可视化是数据科学和数据分析中不可或缺的一部分。它帮助我们以可视化的方式理解和传达数据&#xff0c;从而更好地发现数据中的模式、趋势和见解。在Python生态系统中&#xff0c;有许多优秀的数据可视化工具…

Three.js 镜面反射Reflector 为MeshStandardMaterial增加Reflector能力

效果效果官方案例 区别&#xff1a;官方的案例更像一个镜子 没有纹理等属性 也没有透明度修改 根据源码进行修改为 MeshStandardMaterial实现反射 使用案例 createReflector() {const plane this.helper.create.plane(2, 2);this.helper.add(plane.mesh);plane.mesh.rotat…

vue中设置注释模板

参考地址 ctrlshiftp 打开编辑器配置输入configure user snippets - 选择 new global snipp files - 命名为 vueComment&#xff0c;弹出注释模板&#xff0c;即可自定义注释 如下/// 回车 即可在代码块中使用注释 { "Print to console": {"prefix": &q…

机器学习周刊第五期:一个离谱的数据可视化Python库、可交互式动画学概率统计、机器学习最全文档、快速部署机器学习应用的开源项目、Redis 之父的最新文章

date: 2024/01/08 这个网站用可视化的方式讲解概率和统计基础知识,很多内容还是可交互的,非常生动形象。 大家好,欢迎收看第五期机器学习周刊 本期介绍7个内容,涉及Python、概率统计、机器学习、大模型等,目录如下: 一个离谱的Python库看见概率,看见统计2024机器学习最…

智慧港口解决方案:PPT全文53页,附下载

关键词&#xff1a;智慧港口建设方案&#xff0c;港口信息化建设&#xff0c;智慧港口发展现状与展望&#xff0c;智慧码头 一、建设智慧港口的意义 1、提高运营效率&#xff1a;智慧港口利用先进的技术手段&#xff0c;如物联网、大数据、人工智能等&#xff0c;对港口进行智…

Kafka 集群部署

目录 1、环境准备 2、搭建ZooKeeper集群 配置文件 节点标记 环境变量 启动集群 数据同步测试 故障测试 3、搭建 Kafka 集群 配置文件 环境变量 配置其他机器 启动服务 4、集群测试 创建 Topic 显示 Topic 配置 创建 Producer 创建consumer 删除Topic 查看Z…