更新记录

v1.0.0(2026-10-26) 下载此版本

首发版本:全局播放单例、迷你条+全屏播放页、弹性歌词动画、进度拖拽、播放列表、播放模式切换、点赞事件。


平台兼容性

uni-app(3.8.7)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× √ √ √ √ - √ √ -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
√ √ √ √ √ √ √ √ √ √ √ √

uni-music-player 插件使用指南

版本:1.1.0 · 许可:MIT
全端音乐播放插件:JS 单例播放内核 + 统一组件(迷你播放条 + 全屏播放页合一),仿 Apple Music 歌词弹性动画,uni_modules 引入即用。


一、插件特性

  • 全端播放:App 端使用后台音频管理器(锁屏 / 通知栏可控、支持后台播放),H5 / 小程序使用 InnerAudioContext;音频单例常驻,切页面不打断
  • Apple Music 弹性歌词:当前行之后 1~9 行依次回弹,级联波动动画;当前行平滑放大高亮
  • 完整播放能力:播放列表、列表循环 / 单曲循环 / 随机播放、进度拖拽、点击歌词跳转、上一首 / 下一首(3 秒规则)
  • 歌词解析内置:标准 LRC([mm:ss.xx])解析,支持一行多标签、数组格式直传
  • 样式隔离:组件样式均为 scoped,类名(ump- 前缀)不会泄漏到宿主页面
  • 加载态反馈:换歌 / 地址解析期间显示加载指示,自动防止重复触发
  • H5 键盘控制:PC 浏览器中空格播放 / 暂停,左右键快进 / 快退 5 秒,Esc 收起播放页

二、平台兼容性

2.1 总览

平台分类 支持情况
App(vue) ✅ 支持(含后台播放、锁屏 / 通知栏 / 耳机线控)
App(nvue) ❌ 不支持
H5 移动端 ✅ Safari、Android Browser、微信浏览器(Android)、QQ浏览器(Android)
H5 PC 端 ✅ Chrome、Edge(含键盘控制)
微信小程序 ✅ 支持
支付宝小程序 ✅ 支持
百度小程序 ✅ 支持
字节跳动小程序 ✅ 支持
QQ 小程序 ✅ 支持
云函数(阿里云 / 腾讯云 tcb) ✅ 支持

2.2 各端播放内核差异

平台 播放内核 后台播放 说明
App getBackgroundAudioManager ✅ 支持 锁屏 / 通知栏可控,支持耳机线控上一首 / 下一首,无需额外模块配置
H5 InnerAudioContext 跟随浏览器 浏览器要求用户手势后才能播放,play() 须在点击回调中调用
小程序 InnerAudioContext ❌ 默认不支持 退到后台会中断,属平台限制;微信端如需真后台播放,可自行替换为 wx.getBackgroundAudioManager 并配置 requiredBackgroundModes

三、快速开始(3 步接入)

第 1 步:引入播放器单例

import musicPlayer from '@/uni_modules/uni-music-player'

单例全局唯一,跨页面播放不中断。

第 2 步:设置播放列表并播放

musicPlayer.setPlaylist([
  {
    id: '1',                                    // 建议:列表内唯一
    title: '星光轨道',
    artist: '合成演示',
    cover: '/static/demo-music/cover1.png',     // 封面图
    src: '/static/demo-music/song1.wav',        // 音频直链;也支持 async (song) => url
    lrc: '[00:00.00]晚风穿过霓虹的街\n[00:03.00]星光落在你眼睑'  // LRC 文本
  }
], { index: 0, autoplay: true })

第 3 步:放置统一组件

<uni-music-player :visible="showPlayer" @open="showPlayer = true" @close="showPlayer = false" />

即可获得:迷你条常驻底部(无歌自动隐藏)→ 点击展开全屏播放页 → 弹性歌词 / 进度拖拽 / 播放列表 / 模式切换。

组件位于 uni_modules 且以 uni- 开头,HBuilderX 默认开启 easycom 自动注册;若项目关闭了 autoscan,手动 import 即可。


四、JS API

方法 说明
setPlaylist(list, { index, autoplay }) 设置播放列表;index 起始下标(默认 0),autoplay 是否自动播放(默认 true)
play(index?) 播放下标歌曲;不传则继续当前歌曲。换歌加载期间调用会被忽略(防重入)
pause() / toggle() 暂停 / 播放暂停切换
next(auto?) / prev() 下一首 / 上一首(当前曲播放超 3 秒时 prev 回到本曲开头)
seek(seconds) 跳转到指定秒数;duration 已知时自动钳制到 [0, duration]
setMode(mode) / cycleMode() 设置 / 循环切换模式:'list' 列表循环、'one' 单曲循环、'random' 随机
stop() 停止播放并重置进度(保留播放列表与当前曲目,之后 play() 可继续)
on(name, handler) / off(name, handler) 订阅 / 取消订阅事件,on 返回取消函数

事件

事件 回调参数 触发时机
change { song, index, lyrics } 切换歌曲(含列表信息与已解析歌词)
playstate { playing } 播放 / 暂停状态变化
timeupdate { currentTime, duration, percent, playing } 进度更新(约 4 次 / 秒)
modechange { mode } 播放模式变化
playlistchange { playlist } 播放列表被替换
error { err, song } 播放出错 / 地址解析失败

只读状态

musicPlayer.song / playlist / index / lyrics / playing / loading / mode / currentTime / duration
(loading 为 true 表示正在加载音频或换歌)


五、组件属性与事件

uni-music-player(统一组件)

属性 类型 说明
visible Boolean 是否显示全屏播放页(默认 false)
showLyrics Boolean 是否显示歌词页(默认 true;传 false 进入无歌词模式)
事件 说明
open 点击迷你条(用于展开全屏播放页)
close 点击全屏页左上角收起
like { liked, song } 点击喜欢

六、平台注意事项

  1. App 后台播放:使用 getBackgroundAudioManager,锁屏与通知栏可控,支持耳机线控;真机后台播放需系统未锁定应用进程。
  2. H5 自动播放策略:浏览器要求用户手势后才能播放,setPlaylist / play() 请在点击回调中调用,否则会有 autoplay 警告且无声。
  3. 小程序后台播放:默认使用 InnerAudioContext,退到后台会中断(平台限制)。微信端如需真背景播放,请自行替换为 wx.getBackgroundAudioManager 并在 manifest.json 的 mp-weixin 中配置 requiredBackgroundModes: ["audio"]。
  4. 小程序本地歌词:小程序端无法 request 读取包内 .lrc 文件,请将 LRC 文本内嵌到歌曲数据中(或从接口获取)。

七、常见问题

Q:组件样式会影响我的页面吗?
不会。组件 <style> 均为 scoped,所有类名(ump- 前缀)只在组件内部生效。

Q:点击播放没有声音 / 控制台报 autoplay 警告?
H5 浏览器要求用户手势触发播放,请在点击事件回调中调用 setPlaylist 或 play。

Q:如何替换默认图标 / 封面兜底图?
替换插件目录 static/icons/ 下的同名 PNG(建议保持尺寸与透明风格一致)。

Q:播放列表只有一首歌时,播放结束会怎样?
列表循环 / 单曲循环模式下重新播放当前歌曲;随机模式在单曲时退化为重播。

Q:正式商用有什么注意的?
内置图标资源沿用自开源音乐项目,正式商用前建议替换 static/icons/ 下图标以避免版权风险。


八、完整接入示例

参见项目内 pages/index/index.vue,核心逻辑:

import musicPlayer from '@/uni_modules/uni-music-player'
import demoSongs from '@/common/demo-music/songs.js'

// 设置播放列表(autoplay:false 只加载不播放,迷你条立即显示)
musicPlayer.setPlaylist(demoSongs, { index: 0, autoplay: false })

// 订阅事件驱动自己的 UI(on() 返回取消函数,页面卸载时统一调用)
const offs = [
  musicPlayer.on('change', (e) => { /* 更新当前下标 */ }),
  musicPlayer.on('playstate', (e) => { /* 同步播放状态 */ }),
  musicPlayer.on('error', (e) => { /* 播放失败提示 */ })
]

// 点击歌曲:在用户手势回调中播放(满足 H5 限制)
function playSong(i) {
  musicPlayer.play(i)
}

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

许可协议

MIT协议

暂无用户评论。