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 中的动作步骤:

切换到 HomePod 动作

首先将鼠标移动到屏幕顶端位置并停留一会儿,这一步是防止执行动作时正有全屏的 App 隐藏状态栏导致误触;接下来点击「声音」的小喇叭图标展开音频设备选择菜单,并适当等待 Airplay 设备 Lazy Load 完毕;点击 Airplay 设备那一项,与手动选择设备时相同。最后等待片刻连接成功后模拟按下 Esc 键将菜单收起,回到前台 App,切换大功告成。我们可以将动作的 Trigger 设置为 Unlock Trigger,即每次解锁 Mac 时自动触发,那么下次唤醒 Mac 时 HomePod 就是默认的音频输出设备了。

⚠️不过注意⚠️:这并不是一个开箱即用的动作。因为每个人的显示器尺寸各有差别,「声音」小喇叭位置也并不一定致,所以在第一次使用前,需要根据自己设备的情况做一次设置。我们需要:

  1. 通过三个 Move Mouse 动作中的 Get 按钮获取一次你想要点击的位置参数
  2. 适当根据自己设备的延迟调整步骤间的等待时间

然后便可以重复使用了。

动作运行演示
动作运行演示

其实,通常 Keyboard Maestro 在模拟点击时使用「识别图片并点击」是一个更稳妥和更优先的方案,但因为控制中心的展开菜单是半透明的,一旦背景更换——菜单下有不同窗口或更换了壁纸——就会识别失败,以至于几乎不可用。所以这里退而求其次选择了像素位置点击。不过好在右上角状态栏平日几乎不会移动也不会被其他内容遮挡,几乎永远在那里,那么经过一次设置后未来也可以重复运行了,在这种情况下也是一个可以接受的方案。

因为每个人的显示器尺寸略有差别,「声音」小喇叭位置也并不一致,所以在第一次使用前,可能需要通过三个 Move Mouse 动作中的 Get 按钮获取一次你想要点击的位置参数,适当根据自己设备的延迟调整步骤间的等待时间,然后便可以重复使用了。

相比调出设置 App,这个方案的好处是可以尽量少地打断眼前的工作,只会调用一下浮层菜单,同时动作简单、易于后期维护。当然它也有缺点,除了共享时需要用户做一次自定义,如果 Mac 连接了 AirPods,则会被追加到 Airplay 设备之前,导致固定位置的点击脱靶。但因为在家中很少使用耳机,对我来说日常很少遇到这种情况,虽不完备但已经足以应对大多数场景。

对于需要更精准切换音频设备而且不介意打开设置 App 的用户,这个贴子下有一种打开设置 App 并模拟键盘输入的方案,虽然可能由于系统版本或语言不同导致我运行并未成功,但本质上只是多在设置 App 中点按几次 Tab 键移动焦点,各位权可自己一试,这里就不再重造轮子。

至此,让 HomePod 成为 Mac 唤醒后的默认音响这一目的已经达成,终于不必再在点亮屏幕后做恼人的「重复机械」劳动,或者惴惴不安地担心播放的声音从哪个设备里意外发出爆鸣了。

自动切换到 HomePod 示例 Macro 下载 🔗

让 IINA 自适应音频延迟

作为功能完善、界面简洁美观的 Mac 音视频播放器,IINA 在社区中获得一众好评与拥趸,在我第一次购入 Mac 时就在少数派的「装机必备」列表中发现并使用至今。但有一个恼人的小问题,直到使用 HomePod 后才发现——搭配 HomePod 使用 IINA 时会导致音画不同步,而这又是一个经年但又似乎烂尾了的 Bug。在这个 Github Issuse 中,有用户反映了这个问题,但下方讨论表示应该上游的开源播放器 mpv 更新修复,但在这个对应的 mpv 的 Issuse 中,开发者尝试修复并询问是否有好转后因为无人回复,默认问题已经解决并关闭了这个 Issuse,但下游的 IINA 至少还没有解决……

于是这个 Bug 疑似进入了三不管状态,不知何时才能修好。

在作为开源社区生态观察之前,先来着手在用户层面修复这个 Bug 吧!好在这个音画不同步的时间非常干净利落——音频比视频快了正好 2 秒——如果你只是使用 HomePod 一台播放器,那么在 IINA 的 设置 -> 高级 中增加一个 mpv 选项 audio-delay 并将值设置为 -2,音频与画面又会重归和谐。

IINA 音频延迟修复设置
IINA 音频延迟修复设置

但直到有一天购入了另一台有线音响并且时不时也要用一下之后,设置打架的问题就开始尴尬了起来。在使用有线音频输出设备或蓝牙耳机时,音画本身并无错位,-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

IINA 快捷键设置_新增配置文件
IINA 快捷键设置_新增配置文件
IINA 快捷键设置_配置快捷键
IINA 快捷键设置_配置快捷键

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

Keyboard Maestro 动作部分
Keyboard Maestro 动作部分

略有复杂的是如何触发这个自动化。理想情况下,程序应该检测到「使用 IINA 播放文件」这个事件并运行动作,但现实情况中 Keyboard Maestro 无法检测文件通过 xx 软件打开这种特定条件,于是可以通过综合几种触发器来覆盖尽量多的情况:

  1. 一个 USB device key trigger,用来检测空格键被按下,即常用的播放键被按下后开始播放的情形。不使用单纯的按键 Trigger 是为了防止与文字输入互相冲突,但这需要在第一次使用时录入一下你的键盘空格键。点击 USB device …… 下的输入框并敲一下空格,就宣告完成。
  2. 一个 Audio output device trigger。顾名思义,当播放过程中更改音频输出设备时,对应切换 IINA 的设置。
  3. 一个 application trigger,当 IINA 被激活时,即我们从 Finder 打开一个文件时,检测音频设备并对应修改 IINA 设置。
Keyboard Maestro 动作的 Trigger 部分
Keyboard Maestro 动作的 Trigger 部分

但即便如此,这个动作依然不完备——它无法检测视频暂停时通过鼠标继续播放的情形。不过过于复杂的叠床架屋只会让稳定性更低,在能覆盖常见情况之后就到此为止。如果对鼠标点击也非常在意,可以通过 Better Touch Tool 增加一个触控板或鼠标监控并通过脚本运行 Keyboard Maestro 动作,的确可以补足这点缺憾。

至此,我的 HomePod 又可以和 IINA 以及其他音频设备愉快地生活在一起了(x),终于不必担心邀请朋友看一半电影才发现一直音画不同步的尴尬。

自动切换 IINA 延迟示例 Macro 下载 🔗

结语

虽然修复这两个问题总觉得是在 Bug 上雕花(虽然相信 Airplay 做不了默认播放器是苹果真心的 Feature),但作为用户,既然不能真去替厂商修复 Bug,不如凭借手里的工具,自己提升自己的使用体验。但也不得不感叹一句,苹果为 Mac 新做的 UI 比如长相如 iOS 控制中心一样的菜单栏,似乎从一开始就没有考虑给自动化工具做兼容,甚至在不开启辅助功能的「全键盘控制」时连 Tab 导航都做不到。

如此一想,自动化也是给自己赋权的方式,在越来越封闭的赛博空间里能有自由穿梭的能力。当然就像前面说的,这两个方案都有一些不完备,如果各位有更好的思路,例如能够通过更好的识图点击方式替代写死的像素位置点击,也欢迎在评论区一起讨论分享。

各位看到这里的人,祝你也享受自由,和你干杯🍻!

> 关注 少数派小红书,感受精彩数字生活 🍃

> 实用、好用的 正版软件,少数派为你呈现 🚀