封面
-
·
0.0 s
🎵 纯音乐

🎧 迷你音乐播放器 · 开发者指南

本项目说明:music-player.js 是主模块,提供播放器核心功能;media-session.js 为可选扩展模块,用于注册系统媒体会话(Media Session API),非必须使用。下面的示例使用占位地址引入模块,替换为你上传后的实际 URL 即可。

📋 歌曲对象结构

字段类型必填说明
namestring歌曲名称
singerstring歌手
albumstring专辑
coverstring封面图片路径
urlstring音频文件路径(放音乐没有url那怎行?)
lyricsstringLRC歌词文件路径、内联歌词字符串,或空字符串表示纯音乐

lyrics 字段示例

// 1. LRC 文件路径(模块自动 fetch)
lyrics: './music/song.lrc'

// 2. 内联 LRC 字符串
lyrics: `[00:01.00]第一句
[00:05.00]第二句`

// 3. 纯音乐(留空)
lyrics: ''

🚀 初始化播放器(面向初学者)

步骤概览:引入主模块 → 创建播放列表 → 实例化 MusicPlayer → 将歌词视图插入页面 → 可选注册 Media Session

1) 引入模块(占位地址)

在实际部署时将下列占位 URL 替换为你上传后的地址:

<script src="https://a2942.top/more/mini-music-player-module/music-player.js"></script>
<!-- 可选:Media Session 扩展 -->
<script src="https://a2942.top/more/mini-music-player-module/media-session.js"></script>

2) 创建播放列表

播放列表是一个普通的 JavaScript 数组,元素按顺序播放:

const playlist = [
    {
        name: '天真的橡皮',
        singer: '白水寒',
        album: 'DJ林泽',
        cover: './music/cover.jpg',
        url: './music/song.mp3',
        lyrics: './music/song.lrc' // 或内联 LRC 字符串,或 '' 表示纯音乐
    }
];

3) 实例化并初始化

基本用法:构造并把滚动歌词视图插入到页面容器中。

// 创建播放器
const player = new MusicPlayer({ playlist });

// 将歌词滚动视图插入到页面(页面需有一个容器,例如:<div id="lyricContainer"></div>)
document.getElementById('lyricContainer').appendChild(player.getLyricDiv());

// 事件:自动更新 UI(示例)
player.audio.addEventListener('play', updateUI);
player.audio.addEventListener('pause', updateUI);
player.audio.addEventListener('timeupdate', updateUI);

4) 可选:注册 Media Session(可扩展)

如果你引入了 media-session.js,使用它可以让系统媒体控件显示当前曲目信息。该模块是可选的,调用后会返回一个清理函数以便在销毁播放器时解除注册:

// 注册并保留 cleanup 函数
const cleanup = setupMediaSession(player);

// 当不再需要 media session 时调用
// cleanup();

5) 错误处理与浏览器策略

API 小贴士

🔧 核心 API

方法说明
play(index?)播放指定索引歌曲
pause()暂停
togglePlay()切换播放/暂停
next() / prev()上一首/下一首
getCurrentSongInfo()获取当前歌曲对象
getCurrentTime()获取播放进度(秒)
getCurrentLyric()获取当前歌词行 { text }null
getLyricDiv()获取滚动歌词DOM元素(插入页面任意位置)
updatePlaylist(arr)替换整个播放列表

📝 减少 DOM 刷新示例

更新当前歌词行时,建议只在内容变化时操作 DOM:

function updateLyricLine() {
    const lyric = player.getCurrentLyric();
    const newText = lyric ? lyric.text : '🎵 纯音乐';
    if (currentLyricEl.textContent !== newText) {
        currentLyricEl.textContent = newText;
    }
}

🎤 滚动歌词集成

// 获取歌词滚动视图并插入容器
const lyricDiv = player.getLyricDiv();
document.getElementById('lyricContainer').appendChild(lyricDiv);

模块会自动根据播放进度高亮当前行并滚动。

📜 LRC 文件格式详解

LRC 是一种常见的歌词时间轴格式,基本形式为每一行以时间标签开始,后面跟随对应歌词文本。

[ti:天真的橡皮]
[ar:白水寒]
[00:05.00]这是第一句歌词
[00:12.30]这是第二句歌词

本播放器会自动 fetch LRC 文件,解析时间标签并在播放进度匹配时高亮对应行。若歌词为空则显示“纯音乐”。

🎚️ Media Session(可选扩展)

说明:media-session.js 是可选扩展,用于将播放信息暴露给系统媒体控件(锁屏、媒体键等)。你可以按需引入并注册;若不需要可忽略此文件。

如何引入(占位地址)

<!-- 主模块(必须) -->
<script src="https://a2942.top/more/mini-music-player-module/music-player.js"></script>
<!-- 扩展(可选) -->
<script src="https://a2942.top/more/mini-music-player-module/media-session.js"></script>

注册与清理示例

调用 setupMediaSession(player) 会注册 action handlers 并返回一个清理函数,建议在更换或销毁播放器实例时调用清理函数:

// 注册 media session
const cleanupMedia = setupMediaSession(player);

// 在页面或播放器销毁时调用
// cleanupMedia();

注意:Media Session 在非 HTTPS 或兼容性较差的浏览器中可能部分功能受限。

🔌 事件与回调(进阶)

播放器通过底层 audio 元素触发事件,推荐订阅以下事件以实现完整体验:

player.audio.addEventListener('error', (e) => {
  console.error('音频错误', e);
  // 可显示提示并尝试切换到下一首
});

🛠️ 调试与常见问题

  1. 若封面或歌词未加载,检查路径是否含有未转义字符或空格,建议使用 URL encode(如 demo 中所示)。
  2. 浏览器自动播放策略:多数浏览器禁止未经过用户交互的自动播放,页面需要用户点击一次才能播放声音。
  3. 若 LRC 时间对不上,确认时间标签是否使用了毫米/百分之一秒格式([mm:ss.xx])。