Skip to content

vue2播放hls流视频

约 1247 字大约 4 分钟

vue2视频流播放前端

2025-02-26

该插件允许你在 Vue.js 应用中全局使用 HLSPlay 组件。

下载

npm install vue-video-player@5.0.2
npm install videojs-contrib-hls@5.14.1

代码

模板部分

<template>
  <section class="HLSPlay-component">
    <!-- video-player 是 vue-video-player 插件提供的视频播放器组件 -->
    <!-- ref 用于在 Vue 实例中访问该组件实例,这里命名为 videoPlayer -->
    <!-- class 为视频播放器的样式类名 -->
    <!-- :options 绑定了播放器的配置选项,通过 playerOptions 数据属性传递 -->
    <!-- :playsinline 用于设置视频在移动端是否支持内联播放,设置为 true -->
    <!-- custom-event-name 自定义了一个状态改变事件的名称 -->
    <video-player
      ref="videoPlayer"
      class="video-player-box"
      :options="playerOptions"
      :playsinline="true"
      custom-event-name="customstatechangedeventname"
    />
  </section>
</template>

脚本部分

<script>
// 引入 video.js 的默认样式文件,用于视频播放器的样式
import 'video.js/dist/video-js.css'
// 引入 videojs-contrib-hls 插件,用于支持 HLS 格式视频播放
import 'videojs-contrib-hls'
// 从 vue-video-player 中导入 videoPlayer 组件
import { videoPlayer } from 'vue-video-player'

export default {
  // 组件名称为 HLSPlay
  name: 'HLSPlay',
  // 注册 videoPlayer 组件,使其在当前组件中可用
  components: {
    videoPlayer
  },
  // 定义组件接收的属性
  props: {
    // 视频源的 URL,类型为字符串,未设置默认值
    // eslint-disable-next-line vue/require-default-prop
    src: {
      type: String
    },
    // 视频封面的 URL,类型为字符串,未设置默认值
    // eslint-disable-next-line vue/prop-name-casing,vue/require-default-prop
    cover_url: {
      type: String
    }
  },
  // 组件的数据属性
  data() {
    return {
      // 视频播放器的配置选项
      playerOptions: {
        // 自动播放,设置为 true
        autoplay: true,
        // 静音,设置为 true
        muted: true,
        // 预加载的时长,设置为 '63:25'
        preload: '63:25',
        // 语言设置为中文
        language: 'zh-CN',
        // 使视频播放器自适应容器大小,设置为 true
        fluid: true,
        // 播放速度选项,这里注释掉了,可按需启用
        // playbackRates: [0.7, 1.0, 1.5, 2.0],
        // 视频源数组,这里只有一个 HLS 格式的视频源
        sources: [
          {
            // 视频源类型为 application/x-mpegURL(HLS 格式)
            type: 'application/x-mpegURL',
            // 视频源的路径,使用组件属性 src 的值
            src: this.src 
            // 这里是一个示例视频源 URL,可替换为实际的
            // src: 'https://cdn.theguardian.tv/webM/2015/07/20/150716YesMen_synd_768k_vp8.webm'
          }
        ],
        // 视频封面的地址,使用组件属性 cover_url 的值
        poster: this.cover_url, 
        // 当视频不支持播放时显示的提示信息
        notSupportedMessage: '此视频暂无法播放,请稍后再试'
        // 控制栏的配置选项,这里注释掉了,可按需启用
        // controlBar: {
        //   timeDivider: true,
        //   durationDisplay: true,
        //   remainingTimeDisplay: false,
        //   fullscreenToggle: true, // 全屏按钮
        //   currentTimeDisplay: true, // 当前时间
        //   volumeControl: false, // 声音控制键
        //   playToggle: false, // 暂停和播放键
        //   // progressControl: true // 进度条
        // }
      }
    }
  },
  // 计算属性,返回视频播放器的实例
  computed: {
    player() {
      return this.$refs.videoPlayer.player
    }
  },
  // 组件挂载完成后的生命周期钩子函数
  mounted() {
    // 这里原本有播放的调用,注释掉了,可按需启用
    // this.play()
    // 原本有打印播放器实例的操作,注释掉了,可按需启用
    // console.log('this is current player instance object', this.player)
  },
  // 组件销毁前的生命周期钩子函数
  beforeDestroy() {
    // 如果播放器实例存在,则销毁它
    this.player && this.player.dispose()
  },
  // 组件的方法
  methods: {
    // 设置新的视频源的方法
    setSrc(src) {
      // 使用播放器实例的 src 方法设置新的视频源和类型
      this.player.src({ src: src, type: 'application/x-mpegURL' })
    },
    // 播放视频的方法
    play() {
      try {
        // 确保 DOM 更新完成后执行播放操作
        this.$nextTick(() => {
          // 调用播放器实例的 play 方法播放视频
          this.player.play().then(res => {
            // 播放成功时,这里原本有一个提示,可按需完善
            this.$message('获取视频成功')
          }).catch(e => {
            // 播放失败时,打印错误信息
            console.log(e, '失败')
          }) 
        })
      } catch (e) {
        // 捕获异常并打印错误信息
        console.log(e)
      }
      // 手动触发播放
    }
  }

}
</script>

样式部分

<style lang="scss" scoped>
.HLSPlay-component{
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100%;
  height: 100%;
  ::v-deep.video-player-box{
    width: 100%;
    height: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
    #vjs_video_1{
      height: 100%;
    }
   #vjs_video_3 {
      height: inherit;
      padding-top: 36.25% !important;
    }
  }
}
::v-deep.video-player {
  //.vjs_video_3-dimensions {
  //  width: 100%;
  //  height: 96%;
  //}

  // 初始化,暂停按钮居中
  .vjs-big-play-button {
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
  }

  .video-js .vjs-tech {
    object-fit: fill;
    height: 100%;
  }
  .vjs-fluid{
    padding-top: 2vw !important;
    height: inherit;
  }
}
</style>

使用

在你的 Vue 组件中,你可以使用 HLSPlay 组件来创建一个 HLS 视频播放器。

组件属性

属性名类型描述
srcString视频源的 URL
cover_urlString视频封面的 URL

组件方法

方法名参数描述
setSrcsrc(字符串类型的新视频源 URL)设置新的视频源
play播放视频

示例

以下是一个如何在 Vue 组件中使用 HLSPlay 组件的示例:

<template>
  <div>
    <HLSPlay :src="videoSrc" :cover_url="coverUrl" ref="hlsPlayer" />
    <button @click="changeVideo">Change Video</button>
  </div>
</template>

<script>
import HLSPlay from './HLSPlay'

export default {
  components: {
    HLSPlay
  },
  data() {
    return {
      videoSrc: 'https://path/to/your/video.m3u8',
      coverUrl: 'https://path/to/your/cover.jpg'
    }
  },
  methods: {
    changeVideo() {
      this.videoSrc = 'https://path/to/another/video.m3u8'
      this.$refs.hlsPlayer.setSrc(this.videoSrc)
      this.$refs.hlsPlayer.play()
    }
  }
}
</script>