在 Vue3 中实现音视频播放功能,可根据需求选择原生 HTML5 标签或第三方库。以下是具体方案及实现方法:
🎬 一、基础原生实现
-
视频播放
使用
<video>
标签结合 Vue 的ref
控制播放状态:<template> <video ref="videoPlayer" controls :src="videoUrl"></video> <button @click="play">播放</button> <button @click="pause">暂停</button> </template> <script setup> import { ref } from 'vue'; const videoPlayer = ref(null); const videoUrl = 'path/to/video.mp4'; const play = () => videoPlayer.value?.play(); const pause = () => videoPlayer.value?.pause(); </script>
关键点:
-
通过
ref
获取 DOM 实例,调用原生方法(play()
/pause()
)。 -
监听
@timeupdate
事件可获取播放进度。
-
-
音频播放
类似视频,使用
<audio>
标签:<audio ref="audioPlayer" :src="audioUrl" hidden></audio> <button @click="audioPlayer.value?.play()">播放音频</button>
📦 二、第三方播放器库(推荐)
-
vue3-video-play
功能:支持 HLS 直播流、自定义 UI 和事件监听。
实现步骤:
npm install vue3-video-play
<template> <VideoPlayer :src="videoUrl" :options="options" @play="handlePlay" /> </template> <script setup> import VideoPlayer from 'vue3-video-play'; const videoUrl = 'https://example.com/video.m3u8'; const options = { autoPlay: false, volume: 0.5, speedRate: ["0.75", "1.0", "1.5"], // 倍速选项 poster: '封面图地址' }; </script>
配置选项:
-
type: "m3u8"
(HLS 流)、ligthOff: true
(关灯模式)、mirror: true
(镜像画面)。
-
-
Video.js
适用场景:需要插件扩展(如字幕、清晰度切换)。
集成方法:
npm install video.js @videojs/vue3
<template> <video ref="videoPlayer" class="video-js"></video> </template> <script setup> import videojs from 'video.js'; onMounted(() => { const player = videojs(videoPlayer.value, { sources: [{ src: videoUrl, type: 'video/mp4' }], aspectRatio: '16:9' }); }); </script>
-
西瓜播放器 (xgplayer)
优势:高度自定义 UI,支持事件响应。
封装示例:
<template> <div :id="playerId"></div> </template> <script setup> import Player from 'xgplayer'; const playerId = 'video-container'; onMounted(() => { new Player({ id: playerId, url: videoUrl, autoplay: false }); });
优化:点击时才初始化播放器,避免多视频同时加载。
-
SkeyePlayer (H.265 流)
场景:RTSP/RTMP 等流媒体协议,支持低延迟播放。
核心代码:
import SkeyePlayer from '@skye-player/sdk'; const player = new SkeyePlayer({ video: videoEl.value, type: 'rtsp', decoderPath: '/wasm/decoder.wasm' // H.265 解码器 });
功能:自动降级到 H.264、截图、事件监听。
🔉 三、音频播放专用方案
-
Howler.js
特点:轻量级、支持音量控制与事件监听。
实现:
npm install howler
<script setup> import { Howl } from 'howler'; const sound = new Howl({ src: [audioUrl] }); const playAudio = () => sound.play(); </script>
扩展:
-
通过
onend
事件监听播放完成。 -
滑块控制音量:
<input type="range" @input="sound.volume(volume)" >
。
-
-
APlayer
功能:播放列表、歌词显示、主题定制。
集成:
npm install aplayer
<template> <div id="aplayer"></div> </template> <script> import APlayer from 'aplayer'; onMounted(() => { new APlayer({ container: '#aplayer', audio: [...] }); });
配置项:
-
autoplay: true
、loop: 'all'
、theme: '#ff4081'
。
-
⚙️ 四、高级功能与优化
-
播放控制
-
进度条:结合
<input type="range">
与@timeupdate
事件同步进度。 -
截图:SkeyePlayer 通过 Canvas 生成
toDataURL('image/png')
。
-
-
性能优化
-
按需加载:点击时才初始化播放器,减少并发请求。
-
预加载:
<video preload="metadata">
减少初始加载时间。 -
CDN 分发:WASM 解码器或视频资源使用 CDN 加速。
-
-
兼容性处理
-
自动播放限制:需设置
muted: true
或通过用户交互触发。 -
iOS 适配:添加
playsinline
和webkit-playsinline
属性。
-
🔍 五、方案对比与选择建议
方案 | 适用场景 | 优势 | 局限性 |
---|---|---|---|
原生 <video> | 简单播放需求 | 零依赖、快速集成 | 功能有限 |
vue3-video-play | HLS 直播、基础定制 | 开箱即用、支持移动端 | 高级定制弱 |
Video.js | 插件扩展(字幕、多语言) | 高可定制性、社区活跃 | 配置复杂 |
西瓜播放器 | 高度自定义 UI | 灵活 API、事件响应完善 | 需手动优化加载策略 |
SkeyePlayer | H.265 流媒体(RTSP/RTMP) | 低延迟、自动降级 | 需部署 WASM 解码器 |
Howler.js/APlayer | 纯音频播放 | 音量控制、播放列表 | 不适用于视频 |
💡 推荐选择:
-
基础需求:原生标签 + Vue 响应式控制。
-
功能丰富:vue3-video-play 或 Video.js。
-
直播/低延迟:SkeyePlayer(H.265)或西瓜播放器(HLS)。
-
纯音频:Howler.js(轻量)或 APlayer(播放列表)。