BlackHole 音频驱动构建与签名分发全解析
【免费下载链接】BlackHoleBlackHole is a modern macOS audio loopback driver that allows applications to pass audio to other applications with zero additional latency.项目地址: https://gitcode.com/gh_mirrors/bl/BlackHole
BlackHole 是一个专为 macOS 打造的虚拟音频驱动,让任意应用把声音零延迟地"透传"给另一个应用。这个项目还有一层看点:编译、代码签名、公证、PKG 打包被串成了一条完整的 macOS 驱动构建流水线。读下来你会明白,它是怎么被造出来、签好名,再经 Homebrew 送到你桌面的。
一分钟上手:一条命令装好 BlackHole 音频驱动
最短路径不需要手动下载,也不需要改任何系统设置:
- 确认系统是 macOS 10.10 以上,先关掉正在运行的音频应用。
- 在终端执行
brew install --cask blackhole-2ch,Homebrew 会自动下载已签名、已公证的安装包并完成安装。 - 打开"音频 MIDI 设置",左侧设备列表里看到 BlackHole 2ch 即表示驱动就位。
- 把发送端应用的输出、接收端应用的输入都选成 BlackHole,音频就开始互传 🎧
- 日后升级只需
brew upgrade --cask blackhole-2ch一条命令。
你该选哪个版本?Homebrew 上常见三档:
| 版本 | 安装命令 | 适合场景 |
|---|---|---|
| 2ch | brew install --cask blackhole-2ch | 日常录音、会议软件互传,多数人首选 |
| 16ch | brew install --cask blackhole-16ch | 多轨道录音、DAW 多轨工作流 |
| 64ch | brew install --cask blackhole-64ch | 专业音频制作、复杂路由 |
它是怎么跑起来的:macOS 驱动核心原理
先说它解决的问题:macOS 上的应用默认各说各话,A 应用放的音乐,B 应用根本"听"不到。BlackHole 相当于在系统里装了一副虚拟音箱加虚拟麦克风:A 应用把声音输出到 BlackHole,B 应用再从 BlackHole 输入,声音就传过去了。数据走的是系统音频栈内部的环形缓冲,所以几乎没有额外延迟。
实现上它很克制:驱动本体 BlackHole/BlackHole.c 是单个 C 文件,基于 CoreAudio 的 AudioServerPlugIn 接口,输入流写入环形缓冲、输出流读出。它不是内核扩展,装进 /Library/Audio/Plug-Ins/HAL 后由 CoreAudio 自动加载,Intel 与 Apple Silicon 通用。
通道版本则是"一鱼多吃":同一份源码在编译期注入不同参数,生成 2、16、64、128、256 通道共五个驱动,每个都有独立的 Bundle ID 和 UUID,因此能同时装在一台 Mac 上互不冲突。
安装完成后,驱动会以音频设备的形式出现在系统里,大致是这样:
关键配置与签名流程:代码签名公证实操
这部分写给想自己跑构建脚本的人。全部逻辑集中在 Installer/create_installer.sh,安装前后的系统动作放在 Installer/Scripts/ 里的脚本中。
签名参数怎么配?
驱动属于系统级组件,签名比普通 App 更严格。核心命令是codesign,几个关键参数:
| 参数 | 作用 | 为什么需要 |
|---|---|---|
--force | 强制覆盖旧签名 | 保证每次构建都是新签名 |
--deep | 递归签名内部组件 | 驱动 bundle 内含可执行体等子项 |
--options runtime | 启用强化运行时 | Catalina 起的安全硬性要求 |
--sign 团队ID | 指定签名身份 | 系统据此验证发布者 |
少掉--options runtime会怎样?没有强化运行时,公证会直接失败,用户机器上的 Gatekeeper 也会拦下这个驱动。
多通道版本怎么互不冲突?
macOS 靠 Bundle ID 和 Info.plist 里的插件工厂 UUID 区分不同驱动。脚本每构建一个通道版本,就用uuidgen生成新 UUID 替换模板中的旧值,再配上独立的 Bundle ID(形如 audio.existential.BlackHole16ch)。两套标识各管一面,2ch 和 16ch 自然能和平共处。
公证卡住了怎么办?
公证分两步:把 PKG 提交给 Apple 扫描,再把返回的票据钉回包上。
xcrun notarytool submit BlackHole2ch.pkg --wait --keychain-profile notarize xcrun stapler staple BlackHole2ch.pkg若输出出现 status: Invalid,用xcrun notarytool log加提交 ID 拉取日志,常见原因是签名证书与团队 ID 不匹配,或打包时脚本文件权限不对。
接入 Homebrew 与 CI 分发:生态整合指南
对使用者意味着什么
你平时感受到的只有一条命令:brew install --cask blackhole-2ch。背后 Cask 帮你做完了四件事:从官方源下载对应通道的 PKG、校验签名、把驱动放进系统音频插件目录、升级时以新代旧。相比手动下载 PKG,版本始终可控,装与卸都有据可查 📦
CI 怎么跑完全流程
仓库里的构建脚本本身就是一条完整流水线,对五个通道版本循环执行:xcodebuild 按 Release 编译 → 生成唯一 UUID → codesign 签名 → pkgbuild 打组件包 → productbuild 合成带向导界面的 PKG → notarytool 公证并装订。版本号统一从 VERSION 文件读取,保证五个包版本一致。
装完不确定是否生效?执行ls /Library/Audio/Plug-Ins/HAL/,看到 BlackHole2ch.driver 这类目录就说明驱动已经就位。
常见问题速查:安装、公证与架构问题
Q:双击 PKG 报错装不上?某些 macOS 版本在特定目录解析安装包会失败。把 .pkg 从"下载"挪到桌面(或反过来)再打开试试。
Q:装好了却找不到 BlackHole?它不是普通应用,不会出现在"应用程序"文件夹里。打开"音频 MIDI 设置"看设备列表;若没有,执行sudo killall coreaudiod重启音频服务。
Q:公证报 status: Invalid?用xcrun notarytool log加提交 ID 看 Apple 返回的日志,多半是签名证书与团队 ID 不一致,或脚本权限不对。
Q:Intel 和 Apple Silicon 要装不同的包吗?不需要。安装包声明同时支持 x86_64 与 arm64,两种芯片装同一个包即可。
Q:怎么升级到新版本?Homebrew 用户执行brew upgrade --cask blackhole-2ch;手动安装的用户下载新 PKG 覆盖安装,装完重启更稳妥。
回到开头那三样东西——虚拟音频驱动、代码签名公证、Homebrew 分发:BlackHole 用一条脚本把三者串成了可重复的生产线。它证明了一个小而美的 macOS 驱动,也能拥有企业级的交付能力。下一步不妨打开仓库的构建脚本,把五个通道的安装包亲手做一遍。
【免费下载链接】BlackHoleBlackHole is a modern macOS audio loopback driver that allows applications to pass audio to other applications with zero additional latency.项目地址: https://gitcode.com/gh_mirrors/bl/BlackHole
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考