前端实现视频流播放:封装一个可复用的HlsPlayer组件

news2024/9/22 10:24:53

简介

在前端开发中,播放视频流是一个常见的需求,尤其是在需要实时监控或直播的场景中。本文将分享如何封装一个基于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'
});

防抖优化

在前端开发中,实现视频流播放时,用户频繁点击按钮可能会导致服务器多次请求视频流地址,增加服务器负担并可能引起播放失败。为解决此问题,我们可以使用防抖技术优化按钮点击事件处理。防抖技术确保在指定时间间隔内,无论事件触发多少次,只有一次函数调用被执行。以下是实现步骤:

  1. 包装请求逻辑:使用debounce函数包装请求视频流的逻辑,设置1000毫秒的防抖时间。
  2. 实现防抖函数:创建debounce函数,通过setTimeoutclearTimeout控制函数执行时机。
  3. 处理点击事件:在点击事件处理函数中使用防抖函数,避免频繁请求。
// 包装请求视频流的逻辑
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组件,我们能够轻松地在项目中实现视频流的播放功能。这种封装方式不仅提高了代码的复用性,还使得维护变得更加简单。希望这篇文章能够帮助你在前端项目中实现视频流播放的需求。

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

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

相关文章

【整数规划】+【0—1规划】解决优化类问题(Matlab代码)

目录 文章目录 前言 一、整数规划 分类&#xff1a; 二、典例讲解 1.背包问题 2.指派问题 总结 前言 如果觉得本篇文章还不错的话&#xff0c;给作者点个赞鼓励一下吧&#x1f601;&#x1f601;&#x1f601; 在规划问题中&#xff0c;有些最优解可能是分数或小数&am…

SpringBoot教程(二十二) | SpringBoot实现分布式定时任务之elastic-job

SpringBoot教程&#xff08;二十二&#xff09; | SpringBoot实现分布式定时任务之elastic-job 简介前置条件&#xff1a;需要ZooKeeper配合1、引入相关依赖2、application.yml中配置注册中心和作业调度巨坑&#xff08;配置修改无效&#xff09;3、job实例4、ElasticJob-UI监控…

Ansible自动化运维中剧本角色(roles)来完成apache服务操作

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; Ansible…

大数据技术——实战项目:广告数仓(第六部分)报表数据导出至clickhouse

目录 第11章 报表数据导出 11.1 Clickhouse安装 11.2 Clickhouse建表 11.2.1 创建database 11.2.2 创建table 11.3 Hive数据导出至Clickhouse 第11章 报表数据导出 由于本项目最终要出的报表&#xff0c;要求具备交互功能&#xff0c;以及进行自助分析的能力&#xff0c;…

什么是云原生?(二)

1. 云原生的定义 云原生指构建和运行应用以充分利用通过云技术交付模式交付的分布式计算。云原生应用旨在充分利用云技术平台特有的可扩展性、弹性和灵活性优势。 根据云原生计算基金会 (CNCF) 的定义&#xff0c;云原生技术可帮助企业在公有云、私有云和混合云环境中构建和…

22款奔驰GLE350加装原厂香氛负离子系统,起到了提神醒脑功能的效果

奔驰原厂香氛系统激活原车自带系统&#xff0c;将香气加藏储物盒中&#xff0c;通过系统调节与出风口相结合&#xff0c;再将香味传达至整个车厢&#xff0c;达到净化车厢空气的效果&#xff0c;让整个车厢更加绿色健康&#xff0c;清新淡雅。对于负离子系统同样实现原装位安装…

DASCTF 2024暑期挑战赛 easyjob

DASCTF 2024暑期挑战赛 easyjob 下载附件没有什么特别的&#xff0c;不过很明显是xxl-job的应用&#xff0c;而且是1.9.2版本的 我们去搜索文章https://xz.aliyun.com/t/13899 猜测有两个可能 一个是打api&#xff0c;一个打executor未授权 首先打api的话可以参考https://…

案例分享—国外深色UI界面设计赏析

在国外&#xff0c;深色界面设计&#xff08;Dark Mode&#xff09;已成为提升用户体验的重要趋势。它不仅有效减少屏幕亮度&#xff0c;保护用户视力&#xff0c;还能在夜晚或低光环境下提供更加舒适的浏览体验。设计师们普遍认识到&#xff0c;深色主题不仅提升了应用的视觉层…

.NET+WPF 桌面快速启动工具 GeekDesk

目录 前言 项目介绍 安装使用 1、下载安装 2、启动界面 项目功能 1、快速搜索程序和文件 2、显示设置 3、自定义壁纸 4、毛玻璃效果 5、自定义菜单图标 6、定时提醒 总结 项目地址 最后 前言 大家在平时工作中&#xff0c;是不是经常为了找某个文件或者应用而在…

[Qt][Qt 事件][下]详细讲解

目录 1.定时器0.是什么&#xff1f;1.QTimerEvent2.QTimer3.获取系统⽇期及时间 2.事件分发器1.概述2.事件分发器工作原理3.使用 3.事件过滤器0.是什么&#xff1f;2.使用 1.定时器 0.是什么&#xff1f; 在进⾏窗⼝程序的处理过程中&#xff0c;经常要周期性的执⾏某些操作&…

C++STL初阶(11):stack和queue的使用

栈和队列的先导知识在这里&#xff1a;C语言基础数据结构——栈和队列_栈和队列 插入取出数据-CSDN博客 1.容器适配器 从栈和队列开始&#xff0c;不少教材就不叫他们容器了&#xff0c;而是叫容器适配器 栈不是一种完全不同的数据结构&#xff0c;而是基于顺序表或者链表而实现…

家里总有宠物浮毛怎么办?除了宠物空气净化器真没更轻松的招了!

从几年前口罩问题爆发开始&#xff0c;我就养成了自我防护的习惯&#xff0c;家里常备口罩、消毒水&#xff0c;每天也会定时开窗通风。但是&#xff0c;由于现在天气热了&#xff0c;大多时候都闷在家里开着空调。家里两只猫时不时打个架&#xff0c;满屋子那猫毛飞得啊&#…

算法日记day 39(动归之打家劫舍)

一、打家劫舍1 题目&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。…

Containerd 介绍

早之前的 Docker Engine 中就有了 containerd&#xff0c;只不过现在是将 containerd 从 Docker Engine 里分离出来&#xff0c;作为一个独立的开源项目&#xff0c;目标是提供一个更加开放、稳定的容器运行基础设施。分离出来的 containerd 将具有更多的功能&#xff0c;涵盖整…

centos7安装Oracle 11g数据库

目录 一、安装前准备1、安装前置工具&#xff08;安装过可以忽略&#xff09;2、更配yum源2.1、备份原有源&#xff1b;2.2、下载阿里云base源和epel源&#xff1b;2.3、清理yum缓存2.4、生成新的缓存2.5、更新系统中所有软件到最新版&#xff08;按需谨慎操作&#xff09; 3 修…

做代理海外仓赚钱?代理仓如何实现盈利?

随着跨境电商与物流的火热&#xff0c;海外仓作为跨境贸易的新基建&#xff0c;也成为了一门生意。具体来说海外仓商业模式是一种通过在跨境贸易中设置离岸仓库&#xff0c;为客户提供包括商品存储、包装、发货、退货和售后服务等一系列跨境电商服务的商业模式。 海外仓的成本主…

跟《经济学人》学英文:2024年08月10日这期 A history-lover’s guide to the market panic over AI

A history-lover’s guide to the market panic over AI Past technologies offer clues to what comes next 原文&#xff1a; Andrew Odlyzko, a professor of mathematics at the University of Minnesota, has a side hustle: he has become one of the world’s foremo…

19523 最长上升子序列长度

### 分析 1. **问题描述**&#xff1a; - 给定一个序列&#xff0c;要求找到最长上升子序列的长度。 - 子序列可以是不连续的&#xff0c;但必须保持顺序。 2. **解决方案**&#xff1a; - 使用动态规划&#xff08;Dynamic Programming, DP&#xff09;来解决这个问…

RCE---无字母数字webshell

<?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$code)){die("NO.");}eval($code); }else{highlight_file(__FILE__); } 分析代码&#xff1a;传参不大于35&…

让可视化大屏摆脱面子工程的12个方法

提到可视化大屏&#xff0c;很多老铁就认为这是面子工程&#xff0c;花里胡哨&#xff0c;没啥用处&#xff0c;这固然和认知有关系&#xff0c;那么有没有办法让可视化大屏摆脱这种认知吗&#xff0c;千汇数据工场介绍往日经验&#xff0c;与大家探讨下。 可视化大屏面子工程…