老柯修机铺

通讯行老师傅的手机软件笔记——每款 App 装过、用过,才敢写下来

给博客加个音乐播放器,我绕了一圈才选对它

项目内容
软件APlayer
版本2.0.9.0
平台Android APK
体积7.47M
分类系统工具
开发商rRemix
包名remix.myplayer
官网APlayer 官网
下载一APlayer 下载,APlayer 下载
下载二APlayer 下载,APlayer 下载
文档APlayer 文档
介绍个人博客想放几首背景音乐试了好几种方案,从网易云挂件到 HTML5 audio 原生标签,最后落在了 APlayer 这个小巧的开源组件上。

APlayer 是什么

先交代一下这个东西。APlayer 是一个开源的网页音乐播放器组件——你给它一个 HTML 容器、一串音频地址,它就能渲染出一个带封面、歌词、播放列表的完整播放器界面。最早是给网页加背景音乐用的,后来发展成了一个小而全的播放器家族,配合 MetingJS 这种配套库,能直接拉网易云、QQ 音乐的歌单,不用自己写后端接口。

那个被广告耽误的下午

上周六我在咖啡馆改自己的博客模板,改到一半觉得页面太空,想在侧边栏加个音乐模块——不是自动播放的那种(太烦人),就是放个播放器卡片,访客想听就点一下。

一开始想偷懒,直接嵌网易云的官方挂件。打开网易云后台生成代码,贴到模板里,刷新页面——好家伙,一个大大的推广横幅,还带个"下载客户端"的按钮。这哪是我的博客,这是网易云的广告位。

换 QQ 音乐的试试,情况差不多。第三方播放器插件也找了几个,要么体积大得离谱,要么界面老得像十年前的网吧弹窗。

我掏出手机在推特上搜了一圈,有人提了一句 APlayer,说"比大多数播放器都轻,而且能接 MetingJS 拉国内平台的歌"。我去搜了一下作者仓库,Star 数快两万了,说明不是个玩具项目。

从一首 HTML 标签到一行配置

我先试了最朴素的用法——给它一个 HTML 容器,然后在脚本里 new 一个 APlayer 实例,传进去一首歌的地址。代码大概长这样:

<div id="aplayer"></div>
<script>
const ap = new APlayer({
    container: document.getElementById('aplayer'),
    audio: [{
        name: '晴天',
        artist: '周杰伦',
        url: '1.mp3',
        cover: '1.jpg'
    }]
});
</script>

刷新页面,播放器出来了。封面、进度条、播放列表一切正常。我有点惊喜——就这么点代码,界面比那些动辄几百 KB 的插件还清爽。

但光播本地文件不够用。博客访客来自全国各地,谁知道他们想听什么。这时候就该 MetingJS 上场了——它是 APlayer 的配套库,能调用公开的 Meting API 去拉网易云、QQ 音乐、酷狗这些平台的音频地址、歌词和封面。

接入方式简单到离谱。在 CDN 引入 MetingJS 之后,直接写一个 <meting-js> 标签就行了:

<meting-js
    server="netease"
    type="playlist"
    id="60198">
</meting-js>

server 指定平台,type 指定拉歌单还是专辑还是单曲,id 就是网易云里那串数字 ID。我把自己网易云收藏夹的歌单 ID 填进去,刷新页面——十几首歌瞬间出现在播放列表里,每首都有封面和歌词。

APlayer 播放器界面截图

切歌的时候发现了一个彩蛋

用了两天之后我注意到一个细节:每切一首歌,播放器的主题色会跟着封面图变。周杰伦的歌是暖黄色,陈绮贞的歌变成了清新的草绿,换一首金属封面的歌就切成了冷灰蓝。

一开始以为是 APlayer 内置的效果,翻了文档才知道——这是配合 color-thief.js 库实现的。color-thief 能从一张图片里提取主色调,切歌时 APlayer 调用它拿到当前封面的颜色,然后把自己的主题色平滑过渡过去。

接入也不难。在 APlayer 之后引入 color-thief,然后写一个函数:下载封面图 → 提取主色 → 调 ap.theme() 设置主题。最后监听 APlayer 的 listswitch 事件,每次切歌时重新跑一遍。

我试着把这个功能关掉了——手动指定了一个固定主题色。对比了一下,还是自动提取好看。固定颜色显得死板,封面色自动跟随时播放器和歌曲本身产生了某种"化学反应",听音乐的感觉都轻盈了一点。

大尺寸歌曲封面

歌词不滚动的那个小坑

有天我改完模板刷新页面,发现歌词区域只有文字但不跟着滚动——播放到哪一行它都停在第一行。

翻了排错指南,排查清单里给了几个高概率原因。我先检查了 lrcType 参数——这是个顶层参数,放错位置就会静默失效。我在自己的代码里搜了一下,果然把 lrcType 塞进了 audio 对象内部,而不是 new APlayer 的 options 里。移到顶层之后歌词开始滚动了。

文档里还列了 LRC 时间戳格式的问题——APlayer 只认 [分:秒.毫秒] 这种格式,不接受 [分:秒:毫秒]。好在 MetingJS 返回的 LRC 格式是对的,我自己不用操心这个。但如果是手动写 LRC 文件的话,这点得注意。

事后复盘

绕了一圈才选定 APlayer,回头看其实没那么复杂。总结一下几个判断点:

第一,别偷懒用大厂的官方挂件。它们的核心目的是导流和推广,给用户的播放器只是顺便的事。自己的博客、自己的页面,播放器的界面和行为必须自己能说了算。

第二,组件要小而全。APlayer 的核心 JS 压缩后不到 30KB,加上 MetingJS 也才 50KB 出头。对比那些动辄几百 KB 的重型播放器,它加载几乎是瞬时的。功能上虽然不像商业播放器那样有一堆特效,但核心的播放、列表、歌词、主题色都齐了。

第三,接入成本低到可以忽略。一个 <div> 加几行初始化代码就能跑,想用 MetingJS 更简单,一个自闭合标签完事。就算之后想换别的播放器,迁移成本也几乎为零——所有音频数据都在自己手里,不是锁死在某个平台的私有格式里。

写博客本来就是一件很个人的事,加个播放器这种小功能,本来没想写这么多。但 APlayer 确实让我体验到了开源组件最舒服的那种感觉:够轻、够透明、够自由,不绑你、不逼你、不推广告。就挺好。

本文为个人基于网络公开资料整理编写,非官方内容,仅供学习交流参考;软件版权归原作者所有,请支持正版;使用过程中遇到问题请查阅官方渠道,本文不承担任何责任。

同类文章

gogh 第一次用?這幾題幫你省半小時摸索

一款二次元主題的習慣養成與專注工具,主打虛擬人偶陪伴。這篇把新手最常卡殼的題一次講完——怎麼裝、怎麼玩、有啥坑,五分鐘搞懂。