简介
在前端开发中,播放视频流是一个常见的需求,尤其是在需要实时监控或直播的场景中。本文将分享如何封装一个基于
hls.js
库的Vue组件,以便在任何需要的地方快速引用和播放视频流。
环境准备
首先,确保你的项目中已经安装了Vue框架和
hls.js
库。如果没有安装
hls.js
,可以通过npm进行安装:
npm install hls.js
组件封装
接下来,我们将创建一个名为
HlsPlayer.vue
的Vue组件,用于播放HLS视频流。
在
HlsPlayer.vue
的模板中,我们定义了一个
video
元素,它将用于播放视频流。在脚本部分,我们首先导入
Hls
类,然后定义组件的属性、数据、生命周期钩子和方法。在样式部分定义一些基本样式,确保视频播放器能够适应不同的屏幕尺寸。
<template>
<div class="myVideo">
<video class="myVideo" ref="vedioEle" controls muted width="600"></video>
<!-- <button @click="() => {this.video?.play()}">Play</button> -->
</div>
</template>
<script>
// 安装依赖: npm install hls.js
import Hls from 'hls.js'
export default {
props:{
url:{
type: String,
default:'',
}
},
data() {
return {
hls:null, // hls实例
video: null,
timer:null
}
},
created() {},
watch: {
url: {
immediate: false,
handler(newVal) {
if (newVal) {
this.initializePlayer();
}
}
}
},
mounted() {
this.$nextTick(() => {
this.initializePlayer()
})
},
beforeUnmount() {},
methods: {
initializePlayer() {
this.video = this.$refs.vedioEle;
if (!this.url) {
// 如果url为空,显示加载提示
this.showLoadingIndicator();
return;
}
this.hlsPlay();
},
showLoadingIndicator() {
// 显示加载提示的逻辑
// 这里可以是修改DOM,或者显示一个加载动画等
console.log('正在加载视频...');
// 您可能需要添加一些逻辑来定时检查url是否已经赋值
// 如果赋值了,就调用this.hlsPlay()来开始播放
},
hlsPlay() {
this.video = this.$refs.vedioEle
if (Hls.isSupported()) {
//如果支持hLs.js (MediaSource Extensions)
this.hls = new Hls()
this.hls.loadSource(this.url)
this.hls.attachMedia(this.video)
this.hls.on(Hls.Events.BUFFERING, (event, data) => {
console.log('缓冲中...');
});
this.hls.on(Hls.Events.MANIFEST_LOADED, (event, data) => {
console.log('播放列表已更新,尝试恢复播放');
if (!this.video.paused) {
this.video.play();
}
});
//自动播放
this.hls.on(Hls.Events.MANIFEST_PARSED, (event, data) => {
this.timer = setTimeout(() => {
this.video.play()
},500);
})
} else if (this.video.canPlayType('application/vnd.apple.mpegurl')) {
//如果支持原生播放
this.video.src = this.url
//自动播放
this.video.addEventListener('canplay', () => {
this.timer = setTimeout(() => {
this.video.play()
},500);
});
}
}
},
beforeDestroy() {
if (this.hls) {
this.hls.destroy();
}
clearTimeout(this.timer);
}
}
</script>
<style>
.myVideo {
width: 100%;
height: 100%;
}
</style>
使用组件
一旦
HlsPlayer.vue
组件被创建,你可以在任何Vue组件中通过以下方式使用它
<div class="imgBox" >
<HlsPlayer :url="state.hlsplayUrl" v-if="state.hlsplayUrl"></HlsPlayer>
</div>
import HlsPlayer from '@/views/securityPatrol/components/HlsPlay.vue';
const state = reactive({
// 使用网上可播放使用的地址
hlsplayUrl:'https://cph-p2p-msl.akamaized.net/hls/live/2000341/test/master.m3u8'
});
防抖优化
在前端开发中,实现视频流播放时,用户频繁点击按钮可能会导致服务器多次请求视频流地址,增加服务器负担并可能引起播放失败。为解决此问题,我们可以使用防抖技术优化按钮点击事件处理。防抖技术确保在指定时间间隔内,无论事件触发多少次,只有一次函数调用被执行。以下是实现步骤:
- 包装请求逻辑:使用
debounce
函数包装请求视频流的逻辑,设置1000毫秒的防抖时间。 - 实现防抖函数:创建
debounce
函数,通过setTimeout
和clearTimeout
控制函数执行时机。 - 处理点击事件:在点击事件处理函数中使用防抖函数,避免频繁请求。
// 包装请求视频流的逻辑
const debouncedRequestStream = debounce(() => {
killProcess().then(res => {
if (res.data.code == 200) {
const cameraIp = 1; // 这里应该是动态获取的IP地址
putStream({ cameraIp:cameraIp }).then(res => {
state.hlsplayUrl = res.data;
});
}
});
}, 1000); // 1000毫秒防抖时间
// 防抖函数
function debounce(func, delay) {
let timer = null;
return function(...args) {
clearTimeout(timer);
timer = setTimeout(() => {
func.apply(this, args);
}, delay);
};
}
// 点击事件
const handleItemClick = (row, index, i) => {
state.hlsplayUrl = ''
// 使用防抖函数处理视频流请求
debouncedRequestStream();
};
效果展示
结语
通过封装
HlsPlayer
组件,我们能够轻松地在项目中实现视频流的播放功能。这种封装方式不仅提高了代码的复用性,还使得维护变得更加简单。希望这篇文章能够帮助你在前端项目中实现视频流播放的需求。
版权归原作者 小金子J 所有, 如有侵权,请联系我们删除。