Matrix 首页推荐
Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。
文章代表作者个人观点,少数派仅对标题和排版略作修改。
几年前,刚刚开始独居生活的我为了生活不太无聊,购入了一支 HomePod Mini 作为日常生活的 BGM 播放器,让孤单的居室能常常不再寂静。彼时我只是使用 iPhone 通过隔空播放(Airplay)放些音乐和播客,直到后来给 MacBook 外接显示器使用之后,发现盒盖后的 MacBook 音响几乎不可用,手头唯一音响的 HomePod Mini 便成了第一甚至唯一选择。
苹果近些年大力发展生态战略,各设备间基本都可打通使用,但借助无线互联的软件质量本身也一直断断续续出现各种小问题 (咖喱味)。HomePod Mini 虽然音质尚佳、使用简单,但偏偏 Mac 每次睡眠后都会忘记上次使用的 Airplay 音响,音频输出设备默认会回到上一次使用过的有线音频输出设备上,导致 HomePod 这个自家产品永远不能当作默认音响使用。1
唤醒 Mac 后切换一次音频输出设备事实上成了一种固定劳动,虽然不复杂但每天重复数次够多也足够让人烦躁。另一方面,如果各位使用 IINA 作为常用播放器,会发现 IINA 通过 Airplay 输出的音频会比画面快 2 秒,而使用有线音频输出设备或 Airpods 等耳机时又没有这个问题,导致常常要看了一段片子才发现音画不同步,再去手动调整 IINA 音频设置的尴尬。
经过一番调查后,终于找到了能够自动化的方案并通过 Keyboard Maestro 实现,如果各位读者也有使用 HomePod 作为默认音响的使用习惯,可以参考。这两种方案并非完备,不过不妨也借此机会聊聊在设置自动化时的思路,希望可以为各位抛砖引玉,未来遇到个人需求时也可举一反三。
唤醒 Mac 后自动切换到 HomePod
如若一切顺利,自动化工具本身都自带切换音频输出设备的模块,可以使用最稳定的方法触发切换动作,是进行此类设置的第一选择。如若不然,通过命令行接口或快捷键触发切换,也可以非常稳定、直接,例如命令行工具 switchaudio-osx。
但仔细一用便会发现, Airplay 设备自有其怪癖,诸如 Keyboard Maestro 的音频切换模块或 switchaudio-osx 等软件在连接到 Airplay 设备之前都无法搜索到它们。虽然没有找到官方或社区解释,我们从菜单栏中调出音频输出设备的动画大概可以略知一二:Airplay 设备是 Lazy Load 的。当我们点开音频菜单后,过一会儿 HomePod 才会出现,而并非一直在音频设备的列表里。也就是说,点击菜单这一步至关重要,此时 Mac 才会开始搜索附近的 Airplay 设备,否则自动化工具们甚至不知有能用的 HomePod,自然也无法切换。
问题变成了先有鸡还是先有蛋,使用简单直接的自带动作或命令行工具的计划就此不幸告终。
另一个方案来自 Keyboard Maestro 论坛,通过打开系统设置 App 后进入音频设置面板再切换设备。这也是一个比较稳妥的方案,但每次唤醒 Mac 后都要打开一个 App 实在有点繁琐,其中的脚本阅读和维护也并不方便。明明屏幕右上角的菜单栏就有音频设备设置,为何还要绕远路呢?
于是在赛博空间兜兜转转很久之后,不如回到最返璞归真的方式:模拟点击。
虽然鼠标点击一般并不是稳定的自动化执行方式,常常是下策,但恰好菜单栏右上角的图标位置几乎万年不变,那么使用位置参数模拟点击就基本可以保证动作每次都能运行成功。事不宜迟,开始施工:
首先,把音频图标放到菜单栏中等待点击。来到 设置 -> 控制中心
中,把 声音
一项更改为始终在菜单栏显示。如果使用 Bartender 这类菜单栏折叠工具,则可以把它放在最外层不会被软件藏起或影响位置的地方,方便被点击到。

然后便可以执行 Keyboard Maestro 中的动作步骤:

首先将鼠标移动到屏幕顶端位置并停留一会儿,这一步是防止执行动作时正有全屏的 App 隐藏状态栏导致误触;接下来点击「声音」的小喇叭图标展开音频设备选择菜单,并适当等待 Airplay 设备 Lazy Load 完毕;点击 Airplay 设备那一项,与手动选择设备时相同。最后等待片刻连接成功后模拟按下 Esc
键将菜单收起,回到前台 App,切换大功告成。我们可以将动作的 Trigger 设置为 Unlock Trigger
,即每次解锁 Mac 时自动触发,那么下次唤醒 Mac 时 HomePod 就是默认的音频输出设备了。
⚠️不过注意⚠️:这并不是一个开箱即用的动作。因为每个人的显示器尺寸各有差别,「声音」小喇叭位置也并不一定致,所以在第一次使用前,需要根据自己设备的情况做一次设置。我们需要:
- 通过三个 Move Mouse 动作中的
Get
按钮获取一次你想要点击的位置参数 - 适当根据自己设备的延迟调整步骤间的等待时间
然后便可以重复使用了。

其实,通常 Keyboard Maestro 在模拟点击时使用「识别图片并点击」是一个更稳妥和更优先的方案,但因为控制中心的展开菜单是半透明的,一旦背景更换——菜单下有不同窗口或更换了壁纸——就会识别失败,以至于几乎不可用。所以这里退而求其次选择了像素位置点击。不过好在右上角状态栏平日几乎不会移动也不会被其他内容遮挡,几乎永远在那里,那么经过一次设置后未来也可以重复运行了,在这种情况下也是一个可以接受的方案。
因为每个人的显示器尺寸略有差别,「声音」小喇叭位置也并不一致,所以在第一次使用前,可能需要通过三个 Move Mouse 动作中的 Get
按钮获取一次你想要点击的位置参数,适当根据自己设备的延迟调整步骤间的等待时间,然后便可以重复使用了。
相比调出设置 App,这个方案的好处是可以尽量少地打断眼前的工作,只会调用一下浮层菜单,同时动作简单、易于后期维护。当然它也有缺点,除了共享时需要用户做一次自定义,如果 Mac 连接了 AirPods,则会被追加到 Airplay 设备之前,导致固定位置的点击脱靶。但因为在家中很少使用耳机,对我来说日常很少遇到这种情况,虽不完备但已经足以应对大多数场景。
对于需要更精准切换音频设备而且不介意打开设置 App 的用户,这个贴子下有一种打开设置 App 并模拟键盘输入的方案,虽然可能由于系统版本或语言不同导致我运行并未成功,但本质上只是多在设置 App 中点按几次 Tab 键移动焦点,各位权可自己一试,这里就不再重造轮子。
至此,让 HomePod 成为 Mac 唤醒后的默认音响这一目的已经达成,终于不必再在点亮屏幕后做恼人的「重复机械」劳动,或者惴惴不安地担心播放的声音从哪个设备里意外发出爆鸣了。
让 IINA 自适应音频延迟
作为功能完善、界面简洁美观的 Mac 音视频播放器,IINA 在社区中获得一众好评与拥趸,在我第一次购入 Mac 时就在少数派的「装机必备」列表中发现并使用至今。但有一个恼人的小问题,直到使用 HomePod 后才发现——搭配 HomePod 使用 IINA 时会导致音画不同步,而这又是一个经年但又似乎烂尾了的 Bug。在这个 Github Issuse 中,有用户反映了这个问题,但下方讨论表示应该上游的开源播放器 mpv 更新修复,但在这个对应的 mpv 的 Issuse 中,开发者尝试修复并询问是否有好转后因为无人回复,默认问题已经解决并关闭了这个 Issuse,但下游的 IINA 至少还没有解决……
于是这个 Bug 疑似进入了三不管状态,不知何时才能修好。
在作为开源社区生态观察之前,先来着手在用户层面修复这个 Bug 吧!好在这个音画不同步的时间非常干净利落——音频比视频快了正好 2 秒——如果你只是使用 HomePod 一台播放器,那么在 IINA 的 设置 -> 高级
中增加一个 mpv 选项 audio-delay
并将值设置为 -2
,音频与画面又会重归和谐。

但直到有一天购入了另一台有线音响并且时不时也要用一下之后,设置打架的问题就开始尴尬了起来。在使用有线音频输出设备或蓝牙耳机时,音画本身并无错位,-2s 的修正反而搞坏了影片。一个理想的方案是,系统能够通过识别正在使用的播放设备自动适配 IINA 的音频延迟参数,让每个音频设备自得其所,这就到了 Keyboard Maestro 这类自动化工具出场的时候了。
得益于 IINA 开放的接口和继承自 mpv 的大量指令,进行自定义设置非常容易。思路上,IINA 虽然提供了 JavaScript 接口,但为这个简单问题做学习开发还是过于杀鸡用牛刀。不妨使用同样稳定但简洁许多的快捷键方案——我们需要设置两个快捷键:一个将 audio-delay
设置为 -2
,一个将其设置为 0
;然后通过 Keyboard Maestro 判断当前使用的音频输出设备,模拟按下快捷键即可。
打开 IINA 的 设置 -> 快捷键
,因为默认的快捷键配置文件不可修改,所以需要先选中正在使用的快捷键方案并点击下方的 复制
复制一份。在新的配置文件中,点击右侧面板中的 +
新增快捷键。这里在弹出窗口中录入快捷键,比如我将 ⌥+2
设置为音频延迟 -2 秒,在最下方输入 mpv 命令 set audio-delay -2
作为实际命令,即告设置完成。将音频延迟设置为 0 同理,只需要更换命令最后的参数为 0
,我将其快捷键设置为 ⌥+0
。


来到 Keyboard Maestro。我们可以先新建一个组(Group)并且只针对 IINA 响应,防止在其他软件中误触发,然后再在其中新建动作。动作的主体部分非常简单,通过 %AudioOutputDevice%
变量获取到当前的音频输出设备名,判断是否包含 Airplay:如果包含,则按下快捷键 ⌥+2
,不包含则按下 ⌥+0
。

略有复杂的是如何触发这个自动化。理想情况下,程序应该检测到「使用 IINA 播放文件」这个事件并运行动作,但现实情况中 Keyboard Maestro 无法检测文件通过 xx 软件打开这种特定条件,于是可以通过综合几种触发器来覆盖尽量多的情况:
- 一个 USB device key trigger,用来检测空格键被按下,即常用的播放键被按下后开始播放的情形。不使用单纯的按键 Trigger 是为了防止与文字输入互相冲突,但这需要在第一次使用时录入一下你的键盘空格键。点击 USB device …… 下的输入框并敲一下空格,就宣告完成。
- 一个 Audio output device trigger。顾名思义,当播放过程中更改音频输出设备时,对应切换 IINA 的设置。
- 一个 application trigger,当 IINA 被激活时,即我们从 Finder 打开一个文件时,检测音频设备并对应修改 IINA 设置。

但即便如此,这个动作依然不完备——它无法检测视频暂停时通过鼠标继续播放的情形。不过过于复杂的叠床架屋只会让稳定性更低,在能覆盖常见情况之后就到此为止。如果对鼠标点击也非常在意,可以通过 Better Touch Tool 增加一个触控板或鼠标监控并通过脚本运行 Keyboard Maestro 动作,的确可以补足这点缺憾。
至此,我的 HomePod 又可以和 IINA 以及其他音频设备愉快地生活在一起了(x),终于不必担心邀请朋友看一半电影才发现一直音画不同步的尴尬。
结语
虽然修复这两个问题总觉得是在 Bug 上雕花(虽然相信 Airplay 做不了默认播放器是苹果真心的 Feature),但作为用户,既然不能真去替厂商修复 Bug,不如凭借手里的工具,自己提升自己的使用体验。但也不得不感叹一句,苹果为 Mac 新做的 UI 比如长相如 iOS 控制中心一样的菜单栏,似乎从一开始就没有考虑给自动化工具做兼容,甚至在不开启辅助功能的「全键盘控制」时连 Tab 导航都做不到。
如此一想,自动化也是给自己赋权的方式,在越来越封闭的赛博空间里能有自由穿梭的能力。当然就像前面说的,这两个方案都有一些不完备,如果各位有更好的思路,例如能够通过更好的识图点击方式替代写死的像素位置点击,也欢迎在评论区一起讨论分享。
各位看到这里的人,祝你也享受自由,和你干杯🍻!
> 关注 少数派小红书,感受精彩数字生活 🍃
> 实用、好用的 正版软件,少数派为你呈现 🚀