macOS 上的 Bòcan Music:三栏浏览器显示歌曲列表,下方是播放器栏。

Bòcan Music:把你的音乐库真正当作你的音乐库来对待的原生 macOS 播放器

Bòcan 是一款用 Swift 6 写的 macOS 15+ 音乐播放器与播客客户端。它到底能做什么、怎么安装、还有哪些短板,以及 Apache-2.0 许可允许你拿这些代码做什么。

要点摘要
  • Bòcan 是一款面向 macOS 15+ 的原生 Swift 6 播放器:无缝播放、完整的 DSP 链路,以及覆盖 DSD、Monkey's Audio 与 TrueHD 的 FFmpeg 格式支持。
  • 它只索引你的文件夹,不改动任何文件;识别曲目走 AcoustID 与 MusicBrainz,写入前会先并排预览改动。
  • 它采用 Apache-2.0 许可,代码可以进入商业产品,附带明确的专利授权,同时要求保留声明并标注修改过的文件。
  • 短板也写得清清楚楚:仅支持 macOS 15+,手机同步只面向 Android 且是单向的,在库内移动或重命名文件仍在路线图上。

Mac 上的音乐播放器并不少,但大多数都以同样三种方式让人失望:已经停止维护、窗口里其实是个网页应用,或者是个把一整文件夹 FLAC 当成边缘情况的流媒体客户端。Bòcan 针对的正是第三种问题。它是一款围绕「你自己的音乐库」构建的原生 Swift 6 与 SwiftUI 应用,README 开篇那句话就解释了整个项目:不用 Electron,不用 Catalyst,没有订阅,没有云端。

对一个如此年轻的项目来说,它的文档也出奇地完整。仓库创建于 2026 年 4 月,当前版本是 2.16.0,代码采用 Apache-2.0 许可。一个今天就能安装的正式发布版,加上一份可以阅读、也可以搬进自己项目的源码——正是这个组合让它值得写成一篇文章,而不是收藏一个链接。

它能做什么

指定一个文件夹,它就索引里面的音乐。浏览器是三栏窗口:左边是来源与播放列表,中间是网格或列表,右边是曲目列表。专辑、曲目、艺术家、流派、作曲者和最近添加各有视图,在任何地方开始打字就会跳进搜索框。一个字母、一个词,或者像 1984 这样的年份——输入年份会把专辑墙筛到那一年的发行。

格式覆盖是最让人意外的一块。FLAC、ALAC、AAC、MP3、WAV、AIFF、CAF、M4A 由 AVFoundation 原生处理。不好对付的那些则交给内置的 FFmpeg 桥接,不需要安装任何插件:Ogg Vorbis、Opus、Monkey's Audio、WavPack、DSD、DTS、Dolby Digital 与 Dolby Digital Plus,以及 Matroska 里装着的一切,包括 TrueHD。环绕声会被折叠成立体声,而不是只放出半个混音;CUE 文件会变成章节标记,所以单文件抓轨也能保留曲目表。

音乐库本身被当作只读对象。扫描不会修改你的任何文件,FSEvents 监听会捕捉变动,重复项靠修改时间加指纹来识别。对于标签缺失或错误的音乐,它用 AcoustID 指纹去 MusicBrainz 比对:先给出修改建议,和你现有的标签并排列出,由你勾选要更新的字段,之后才写入。此外还有支持撤销的批量标签编辑器、自动识别的同伴封面,以及「不参与随机播放」标记,免得一张雨声专辑突然混进你的播放列表。

在本地文件之外,它还支持另外三类协议。Subsonic、Navidrome 和 Airsonic 服务器是一等来源,可以跨服务器联合搜索。播客支持 RSS、Atom、Podcast Index 与 iTunes 搜索,并支持 Podcasting 2.0 的章节、文字稿和主播信息。网络电台在侧边栏里是一份电台目录,粘贴一个 .pls 或 .m3u 链接会展开成里面的各个电台。听歌记录可以同步到 Last.fm、ListenBrainz 和 Rocksky,离线时会先排队。

怎么安装

需要 macOS 15.0 Sequoia 或更高版本。请先从 GitHub Releases 下载签名并经过公证的 DMG;官方下载页 也是一个直接下载入口。Homebrew 是可选的包管理器方案,不应成为默认安装路径。每个版本还会发布构建证明,因此可以核对下载的 DMG 确实来自这个仓库的发布流程。

# Open GitHub Releases and download the signed and notarized DMG:
open https://github.com/bocan/bocan-music/releases

更新会通过应用内的 Sparkle 推送。如果更习惯 Homebrew,仍可执行 brew upgrade --greedy bocan;从源码构建属于另一条面向贡献者的路径,前置条件写在 DEVELOPMENT.md 中。

怎么用

首次启动就是选择文件夹。之后的操作和你猜的一样:双击专辑封面即播放,点击列头重新排序,开始打字就筛选。导航方式和浏览器一样:前进后退箭头、多键鼠标的侧键、⌘[ 与 ⌘],以及用于从任意层级退出的 Esc;返回时滚动位置和搜索框里的文字都会原样恢复。

值得记住的快捷键是:⌘⇧F 全屏可视化,⌘⇧I 实验性的沉浸模式,⌘⇧Y 库摘要,⌘⇧L 日志控制台。其中库摘要是别处找不到的东西:六个标签页的统计,全部在你自己的机器上算出来,覆盖库的整洁度、音频质量、收藏结构、收听行为和播客积压,甚至能通过完播率告诉你节目的广告插播大概在哪里。

智能播放列表用规则编辑器搭建,并编译成实时 SQL,因此音乐库变化时列表成员会自动更新。手动播放列表在播放过程中也保持同步:删掉一首歌,接下来播放的队列会立刻调整。此外还有六种 GPU 渲染的可视化效果、四种迷你播放器布局,以及一个手机同步面板——通过局域网把音乐库的只读副本提供给已配对的 Android 手机,需要时还能转码成 MP3 或 Opus。

演示

README 里有曲目视图和可视化效果的截图,仓库本身没有演示视频。截图传达不了的是日常真正起作用的部分:从专辑返回后搜索筛选依然保留、编辑正在播放的播放列表时播放位置不丢、排序和滚动位置回到你离开时的地方。这些才是最初十分钟里值得试的东西。

音频是怎么处理的

无缝播放是主打功能,其实现机制值得了解:播放以纳秒级精度锚定在 AVAudioTime 上,因此现场专辑或 DJ 混音跨越曲目边界时,不会出现常规切换带来的静音或爆音。在此之上,解码器与输出之间还挂着一条 DSP 链路:10 段图形均衡器、低音增强、立体声扩展、双耳交叉馈送和峰值限制器。

ReplayGain 在播放时应用,而不是写进你的文件;缺少增益标签的曲目会在后台按 EBU R128 响度标准分析。分析走的是和播放相同的解码路径,所以只有 FFmpeg 能解的格式也能拿到数值,环绕声文件也按你实际听到的立体声折叠来测量。交叉淡入淡出可在 0 到 12 秒之间调节,播放速度在 0.5 倍到 2 倍之间并带音高校正,睡眠定时器是淡出而不是在音符中间切断。

两个解码器,一张图。AVFoundation 处理它擅长的部分,其余交给 FFmpeg 桥接,包括那种系统解码器能打开却播放不了的文件,比如装在 MP4 容器里的 Opus。播放栏显示的是真正在解码的内容:编解码器、码率、采样率、位深和声道布局,来自打开的解码器而非靠扩展名猜测,所以一个 .m4a 会被正确地报为 AAC、ALAC 或 E-AC-3。

代码是怎么组织的

仓库被拆成十二个没有向上依赖的 Swift Package 模块,这是 Swift 开发者应该先读的部分。AudioEngine 负责解码图和播放 actor,Metadata 封装 TagLib,Acoustics 负责 Chromaprint 指纹与 AcoustID、MusicBrainz 查询,Library 运行文件夹扫描与 FSEvents 监听,Playback 掌管队列、随机播放和无缝调度,SyncServer 负责基于双向 TLS 的手机配对。持久化用的是 GRDB 7,配 FTS5 全文检索和响应式的 ValueObservation 流。

工程纪律是以要求而非愿景的形式写下来的:Swift 6 严格并发,采用 @MainActor 隔离与 Sendable 一致性;80% 的行覆盖率门槛,达不到就构建失败;会驱动真实界面的端到端测试套件;以及 XcodeGen,让 .pbxproj 永远不需要手工编辑。SwiftLint、SwiftFormat、gitleaks 和 Snyk 在每个 Pull Request 上运行,更新则由 Sparkle 通过已签名的 feed 分发。

还差在哪里

先说下限:只支持 macOS 15.0,再往下没有,所有还停在旧版本上的 Mac 都被排除。手机同步只面向 Android,而且是单向的:Mac 提供服务,手机保留一份副本,任何内容都不会写回你的文件或数据库。没有 iPhone 应用,用手机控制 Mac 被列在「接下来做什么」而不是「已经做了什么」里。

另一块空缺是文件管理。Bòcan 会索引、打标签、识别你的音乐,但不会移动或重命名文件;在应用内整理音乐库仍在路线图上。沉浸模式在 README 里被标为实验性,可能改版也可能被砍掉。Deep Dive 这个基于 MusicBrainz 和 Wikipedia 生成报告的功能默认关闭,而且首次扫描大型音乐库时会被限制在每 1.5 秒一个请求,所以耗时以小时计而不是分钟。

许可:你能做什么

Bòcan 采用 Apache License 2.0,© 2026 Chris Funderburg。Apache-2.0 和 MIT 一样宽松,但文本更长,如果你打算发布这些代码而不只是阅读它,那些差别就很要紧。

你可以把它用于商业产品,也可以放进闭源产品。你可以修改它,并按自己选择的条款分发结果,包括作为某个更大的专有应用的一部分。和 MIT 不同,Apache-2.0 还授予每位贡献者一项明确的专利许可,覆盖其贡献必然侵犯的那些专利;而如果你提起指控该作品侵权的专利诉讼,这份许可即告终止。

义务集中在声明而不是开源上。分发任何东西时都要附上一份许可副本,标注你修改过的文件,保留源码中的著作权、专利和商标声明,并复现项目 NOTICE 文件中的署名信息。这里没有 copyleft:你永远不必公开自己的改动,也不必用同样的方式许可自己的应用。

Apache-2.0 有两点不给。它不授予在说明代码来源之外使用项目名称、标志或商标的权利;它也不提供任何担保——软件按「原样」提供,任何贡献者都不对损害负责。实践上就是:保留声明、标注改动,然后你是自由的。

该不该装

如果你在一台 Sequoia 或更高版本的 Mac 上存着本地音乐库,下载本身没有成本,而唯一的设置就是把音乐文件夹指给它。如果你是 Swift 开发者,价值更多在仓库而不是应用:十二个模块、一条能跑通的从 FFmpeg 到 AVAudioEngine 的解码图、带 FTS5 的 GRDB,以及被覆盖率门槛约束的严格并发 Swift 6 代码,而且许可允许你把其中任何一部分搬进你要卖的产品里。短板是写下来的而不是藏起来的:只支持 Android 的手机同步、尚未实现的文件管理,以及 macOS 15 这条硬下限。这比一份没有任何保留意见的功能清单要更像好兆头。

项目概况

许可证
Apache-2.0
平台
macOS 15.0+ (Sequoia)
开发语言
Swift 6、SwiftUI
查看版本
v2.16.0 (2026-09-16)

安装

# Open GitHub Releases and download the signed and notarized DMG:
open https://github.com/bocan/bocan-music/releases

许可说明

Apache-2.0 是宽松许可:只要你随附许可及其声明、标注你修改过的文件,并传递项目的 NOTICE 文件中的署名信息,就可以在商业应用和闭源应用中使用、修改并再分发这些代码。它还附带明确的专利授权。不提供任何担保,也不授予商标使用权。