ExistentialAudio/BlackHole
GitHub: ExistentialAudio/BlackHole
一款 macOS 虚拟音频环回驱动,以零延迟实现应用间音频路由与系统音频捕获录制。
Stars: 18953 | Forks: 797

# BlackHole: 音频环回驱动程序

[](https://github.com/ExistentialAudio/BlackHole/releases)
[](LICENSE)
[](https://twitter.com/ExistentialAI)
[](https://www.facebook.com/Existential-Audio-103423234434751)
BlackHole 是一个现代的 macOS 虚拟音频环回驱动程序,允许应用程序以零额外延迟将音频传递给其他应用程序。
### [下载安装程序](https://existential.audio/blackhole)
### [加入 Discord 服务器](https://discord.gg/y8BWfnWRnn)
## 目录
- [功能](#features)
- [安装说明](#installation-instructions)
- [卸载说明](#uninstallation-instructions)
- [用户指南](#user-guides)
- [开发者指南](#developer-guides)
- [功能请求](#feature-requests)
- [常见问题](#faq)
- [Wiki](https://github.com/ExistentialAudio/BlackHole/wiki)
## 功能
- 构建 2、16、64、128 和 256 声道版本
- 可自定义声道数、延迟、隐藏设备
- 可自定义镜像设备以允许隐藏的输入或输出
- 支持 8kHz、16kHz、44.1kHz、48kHz、88.2kHz、96kHz、176.4kHz、192kHz、352.8kHz、384kHz、705.6kHz 和 768kHz 采样率
- 零额外驱动延迟
- 兼容 macOS 10.10 Yosemite 及更新版本
- 为 Intel 和 Apple Silicon 构建
- 无需内核扩展或修改系统安全设置

## 安装说明
### 选项 1:下载安装程序
1. [下载最新安装程序](https://existential.audio/blackhole)
2. 关闭所有正在运行的音频应用程序
3. 打开并安装软件包
4. 出现提示时重新启动系统
### 选项 2:通过 Homebrew 安装
- 2声道: `brew install blackhole-2ch`
- 16声道: `brew install blackhole-16ch`
- 64声道: `brew install blackhole-64ch`
## 卸载说明
### 选项 1:使用卸载程序
- [下载 BlackHole 2声道 卸载程序](https://existential.audio/downloads/BlackHole2chUninstaller.pkg)
- [下载 BlackHole 16声道 卸载程序](https://existential.audio/downloads/BlackHole16chUninstaller.pkg)
- [下载 BlackHole 64声道 卸载程序](https://existential.audio/downloads/BlackHole64chUninstaller.pkg)
### 选项 2:手动卸载
1. 使用终端命令删除 BlackHole 驱动程序:
`rm -R /Library/Audio/Plug-Ins/HAL/BlackHoleXch.driver`
请务必将 `X` 替换为 `2`、`16` 或 `64`。
请注意,该目录是根目录 `/Library`,而不是 `/Users/user/Library`。
2. 使用终端命令重启 CoreAudio:
`sudo killall -9 coreaudiod`
有关更多详细信息,请[访问 Wiki](https://github.com/ExistentialAudio/BlackHole/wiki/Uninstallation)。
## 用户指南
### Logic Pro X
- [Logic Pro X 到 FaceTime](https://existential.audio/howto/StreamFromLogicProXtoFaceTime.php)
- [Logic Pro X 到 Google Meet](https://existential.audio/howto/StreamFromLogicProXtoGoogleMeet.php)
- [Logic Pro X 到 Skype](https://existential.audio/howto/StreamFromLogicProXtoSkype.php)
- [Logic Pro X 到 Zoom](https://existential.audio/howto/StreamFromLogicProXtoZoom.php)
### GarageBand
- [GarageBand 到 FaceTime](https://existential.audio/howto/StreamFromGarageBandToFaceTime.php)
- [GarageBand 到 Google Meet](https://existential.audio/howto/StreamFromGarageBandToGoogleMeet.php)
- [GarageBand 到 Skype](https://existential.audio/howto/StreamFromGarageBandToSkype.php)
- [GarageBand 到 Zoom](https://existential.audio/howto/StreamFromGarageBandToZoom.php)
### Audacity
- [Audacity 设置](https://github.com/ExistentialAudio/BlackHole/wiki/Audacity)
### Reaper
- [Reaper 到 Zoom](https://noahliebman.net/2020/12/telephone-colophon-or-how-i-overengineered-my-call-audio/) 由 Noah Liebman 提供
### 录制系统音频
1. [设置多输出设备](https://github.com/ExistentialAudio/BlackHole/wiki/Multi-Output-Device)
2. 在 `音频 MIDI 设置` → `音频设备` 中,右键单击新创建的多输出设备,然后选择“将此设备用于声音输出”
3. 打开数字音频工作站 (DAW),例如 GarageBand,并将输入设备设置为“BlackHole”
4. 将轨道设置为从通道 1-2 输入
5. 从另一个应用程序播放音频,并在您的 DAW 中进行监听或录制
### 在应用程序之间路由音频
1. 在发送应用程序中将输出驱动程序设置为“BlackHole”
2. 将音频输出到任何通道
3. 打开接收应用程序并将输入设备设置为“BlackHole”
4. 从相应的输出通道输入音频
## 开发者指南
### 所有非 GPLv3 项目都需要许可证
请支持我们的辛勤工作和持续开发。如需申请许可证,请[联系 Existential Audio](mailto:devinroth@existential.audio)。
### 构建和安装
构建完成后,要安装 BlackHole:
1. 将构建好的 `BlackHoleXch.driver` bundle 复制或移动到 `/Library/Audio/Plug-Ins/HAL`
2. 使用 `sudo killall -9 coreaudiod` 重启 CoreAudio
### 自定义 BlackHole
可以使用以下预处理器常量来轻松自定义 BlackHole 的构建。
```
kDriver_Name
kPlugIn_BundleID
kPlugIn_Icon
kDevice_Name
kDevice_IsHidden
kDevice_HasInput
kDevice_HasOutput
kDevice2_Name
kDevice2_IsHidden
kDevice2_HasInput
kDevice2_HasOutput
kLatency_Frame_Size
kNumber_Of_Channels
kSampleRates
```
可以在构建时使用 `xcodebuild` 的 `GCC_PREPROCESSOR_DEFINITIONS` 来指定它们。
示例:
```
xcodebuild \
-project BlackHole.xcodeproj \
GCC_PREPROCESSOR_DEFINITIONS='$GCC_PREPROCESSOR_DEFINITIONS kSomeConstant=value'
```
在使用字符串时,请务必转义所有引号。
### 重命名 BlackHole
要自定义 BlackHole,需要更改以下常量。
- `kDriver_Name`
- `kPlugIn_BundleID`(请注意,这必须与目标的 bundleID 匹配)
- `kPlugIn_Icon`
这些可以使用 ```xcodebuild``` 指定为预处理器常量。
```
driverName="BlackHole"
bundleID="audio.existential.BlackHole"
icon="BlackHole.icns"
xcodebuild \
-project BlackHole.xcodeproj \
-configuration Release \
PRODUCT_BUNDLE_IDENTIFIER=$bundleID \
GCC_PREPROCESSOR_DEFINITIONS='$GCC_PREPROCESSOR_DEFINITIONS
kDriver_Name=\"'$driverName'\"
kPlugIn_BundleID=\"'$bundleID'\"
kPlugIn_Icon=\"'$icon'\"'
```
### 自定义声道数、延迟和采样率
`kNumber_Of_Channels` 用于设置声道数。指定高声道数时请小心。尽管 BlackHole 被设计为在更高声道数下极其高效,但您的计算机可能无法跟上。采样率也起着一定作用。不要在声道数很多的情况下使用高采样率。有些应用程序不知道如何处理高声道数。请谨慎操作。
`kLatency_Frame_Size` 是驱动程序处理传入和传出音频的时间(以帧为单位)。它可用于将 BlackHole 内的音频延迟最多 65536 帧。如果在高声道数下使用 BlackHole,这可能会有所帮助。
`kSampleRates` 设置音频设备的采样率。如果使用多个采样率,请用逗号 (`,`) 分隔。例如:`kSampleRates='44100,48000'`。
### 镜像设备
默认情况下,BlackHole 有一个隐藏的镜像音频设备。可以使用以下常量自定义这些设备。
```
// Original Device
kDevice_IsHidden
kDevice_HasInput
kDevice_HasOutput
// Mirrored Device
kDevice2_IsHidden
kDevice2_HasInput
kDevice2_HasOutput
```
当所有都设置为 true 时,将出现第二个 BlackHole,其工作原理完全相同。输入和输出是镜像的,因此两个设备的输出都发送到两个设备的输入。
如果您需要单独的设备用于输入和输出,这会很有用。
示例
```
// Original Device
kDevice_IsHidden=false
kDevice_HasInput=true
kDevice_HasOutput=false
// Mirrored Device
kDevice2_IsHidden=false
kDevice2_HasInput=false
kDevice2_HasOutput=true
```
在这种情况下,我们有两个 BlackHole 设备。一个将仅有输入,另一个将仅有输出。
在项目中使用此功能的一种方法是隐藏镜像设备并在后台使用它。这样用户将看到一个仅输入设备,同时将音频在后台路由到输出。
可以使用 `kAudioHardwarePropertyTranslateUIDToDevice` 访问隐藏的音频设备。
### 持续集成 / 持续部署
BlackHole 可以集成到您的 CI/CD 中。查看 [create_installer.sh](https://github.com/ExistentialAudio/BlackHole/blob/master/Installer/create_installer.sh) shell 脚本以了解安装程序是如何构建、签名和公证的。
## 功能请求
如果您对以下任何功能感兴趣,请在链接的 issue 中留下评论。要请求未列出的功能,请创建一个新 issue。
- [与其他音频设备同步时钟](https://github.com/ExistentialAudio/BlackHole/issues/27) 正在开发中,参见 v0.3.0
- [将 BlackHole 输出到其他音频设备](https://github.com/ExistentialAudio/BlackHole/issues/40)
- [增加对 AU 插件的支持](https://github.com/ExistentialAudio/BlackHole/issues/18)
- [通道间路由](https://github.com/ExistentialAudio/BlackHole/issues/13)
- [直接录制到文件](https://github.com/ExistentialAudio/BlackHole/issues/8)
- [配置选项菜单](https://github.com/ExistentialAudio/BlackHole/issues/7)
- [支持额外的位深](https://github.com/ExistentialAudio/BlackHole/issues/42)
## 常见问题
### 为什么 BlackHole 没有出现在“应用程序”文件夹中?
BlackHole 是一个虚拟音频环回驱动程序。它只出现在 `音频 MIDI 设置`、`声音偏好设置` 或其他音频应用程序中。
### 如何在同时使用 BlackHole 的情况下监听音频?
参见[设置多输出设备](https://github.com/ExistentialAudio/BlackHole/wiki/Multi-Output-Device)。
### BlackHole 使用什么位深,我可以更改它吗?
BlackHole 使用 32 位浮点位深,因为 macOS Core Audio 在系统级别原生使用 32 位。这提供了最广泛的兼容性和最大的音频动态余量。
此格式对于高达 24 位整数的音频是无损的。所有应用程序都应该能够播放和录制音频,并且不需要在 BlackHole 驱动程序级别调整位深。
### 如何更改多输出设备的音量?
不幸的是,macOS 不支持更改多输出设备的音量,但您可以在“音频 MIDI 设置”中设置单个设备的音量。
### 为什么 BlackHole 没有播放声音?
- 检查 `系统偏好设置` → `安全性与隐私` → `隐私` → `麦克风`,以确保您的数字音频工作站 (DAW) 应用程序具有麦克风访问权限。
- 检查 ``音频 MIDI 设置`` 中 BlackHole 的输入和输出音量是否已调到最大。
- 如果您使用的是多输出设备,由于 macOS 的问题,内置输出必须启用并在多输出设备中列为顶部设备。[详见此处](https://github.com/ExistentialAudio/BlackHole/wiki/Multi-Output-Device#4-select-output-devices)。
### 为什么使用多输出设备或聚合设备 X 分钟后音频会出现故障?
- 您需要为除时钟源(也称为主设备或主要设备)之外的所有设备启用漂移校正。
### 为什么安装程序会失败?
- 某些版本的 macOS 存在一个已知问题,即当安装包位于某些文件夹中时,可能无法成功安装。如果您将 .pkg 文件下载到了“下载”文件夹,请尝试将其移动到桌面并再次打开该 .pkg 文件(反之亦然)。
### 哪些应用程序不能与多输出设备配合使用?
不幸的是,多输出设备可能存在一些缺陷,某些应用程序根本无法与其配合使用。以下是已知不兼容的应用程序列表。如果发现其他不兼容的应用程序,请通过提交 [issue](https://github.com/ExistentialAudio/BlackHole/issues) 来报告它们。
- Apple Podcasts
- Apple Messages
- HDHomeRun
### AirPods 无法与聚合/多输出设备配合使用。
来自 AirPods 的麦克风以较低的采样率运行,这意味着它不应用作聚合或多输出设备中的主要/时钟设备。解决方案是使用内置扬声器(只需将它们静音)或将 BlackHole 2ch 作为主要/时钟设备。BlackHole 16ch 不能作为主设备,因为主设备需要具有 2 个声道。
阅读[此讨论](https://github.com/ExistentialAudio/BlackHole/issues/146)以获取更多详细信息。
### 我可以将 BlackHole 集成到我的应用程序中吗?
BlackHole 采用 GPL-3.0 许可。只要您的应用程序同样采用 GPL-3.0 许可,您就可以使用 BlackHole。对于所有其他应用程序,请[直接联系 Existential Audio](mailto:devinroth@existential.audio)。
## 链接和资源
### [MultiSoundChanger](https://github.com/rlxone/MultiSoundChanger)
一个用于更改声音音量的小工具,甚至支持聚合设备,因为原生音量控制器无法更改聚合设备的音量
### [BackgroundMusic](https://github.com/kyleneideck/BackgroundMusic)
Background Music,一个 macOS 音频实用程序:自动暂停您的音乐,设置单个应用程序的音量并录制系统音频。
标签:Apple Silicon, Intel, -loopback, SOC Prime, UML, 多媒体, 客户端加密, 开发工具, 开源, 录音软件, 直播工具, 系统扩展, 虚拟声卡, 虚拟音频, 零延迟, 音频回送, 音频处理, 音频录制, 音频设置, 音频路由, 音频通道, 音频驱动