本文档介绍了 OBS Studio 中允许跨不同平台从各种输入(麦克风、线路输入)和输出(系统声音、应用程序音频)捕获音频的音频源实现。它侧重于特定于平台的捕获机制和通用的音频处理管道,该管道准备捕获的音频供 OBS 使用。
有关视频源的信息,请参阅 视频源。
OBS 提供特定于平台的实现来捕获输入和输出设备音频
尽管每个平台在音频捕获方面需要不同的 API 和技术,但它们都遵循设备枚举、捕获初始化和连续音频数据处理的通用模式。
来源:plugins/win-wasapi/win-wasapi.cpp plugins/mac-capture/mac-audio.c plugins/linux-pulseaudio/pulse-input.c
在所有平台上,音频源都实现了以下关键功能
Windows 实现使用 WASAPI API 从输入和输出设备捕获音频。它支持三种不同的源类型
| 源类型 | 描述 | 实现 |
|---|---|---|
| 输入 | 从麦克风和其他输入设备捕获 | 使用标准 WASAPI 捕获 |
| DeviceOutput | 捕获系统音频输出 | 使用 WASAPI 环回模式 |
| ProcessOutput | 从特定应用程序捕获音频 | 使用特定于进程的音频捕获 API |
Windows 实现功能最丰富,支持
来源:plugins/win-wasapi/win-wasapi.cpp93-96 plugins/win-wasapi/win-wasapi.cpp999-1031
捕获过程包括
Windows 设备使用 IMMDeviceEnumerator 接口检测和枚举,设备信息存储在一个列表种,该列表填充了 UI 中的设备选择下拉菜单。
来源:plugins/win-wasapi/enum-wasapi.cpp37-92
macOS 实现使用 Core Audio 从音频设备进行捕获。macOS 的一个独特挑战是它不提供内置的系统音频捕获 API,因此 OBS 对输出设备使用特殊处理。
来源:plugins/mac-capture/mac-audio.c33-59 plugins/mac-capture/mac-audio.c419-456
对于 macOS 的输出捕获,OBS 维护一个已知的音频捕获实用程序的列表,例如 Soundflower、WavTap 和 BlackHole,这些实用程序必须单独安装才能启用系统音频捕获。
来源:plugins/mac-capture/audio-device-enum.c10-16
Linux 实现使用 PulseAudio,这是 Linux 桌面最常见的声音系统。它支持输入设备和输出监视。
来源:plugins/linux-pulseaudio/pulse-input.c31-51 plugins/linux-pulseaudio/pulse-input.c180-224
对于 Linux 上的输出监视,PulseAudio 提供“监视器”源,可以连接到接收器输出,允许 OBS 捕获系统音频。
来源:plugins/linux-pulseaudio/pulse-input.c243-251
音频从特定于平台的 API 捕获后,会通过 OBS 遵循通用路径
来源:plugins/win-wasapi/win-wasapi.cpp plugins/mac-capture/mac-audio.c419-456 plugins/linux-pulseaudio/pulse-input.c180-224
每个平台都必须将其原生音频格式转换为 OBS 兼容格式
| 平台 | 原生格式 | 转换函数 |
|---|---|---|
| Windows | WAVEFORMATEX | WASAPISource::InitFormat |
| macOS | AudioStreamBasicDescription | convert_ca_format |
| Linux | pa_sample_format_t | pulse_to_obs_audio_format |
音频数据通常转换为以下 OBS 音频格式之一
AUDIO_FORMAT_FLOATAUDIO_FORMAT_16BITAUDIO_FORMAT_32BITAUDIO_FORMAT_U8BIT同样,通道配置被映射到 OBS 扬声器布局,例如 SPEAKERS_MONO、SPEAKERS_STEREO 或 SPEAKERS_5POINT1。
来源:plugins/win-wasapi/win-wasapi.cpp777-791 plugins/mac-capture/mac-audio.c185-205 plugins/linux-pulseaudio/pulse-input.c58-106
音频时序对于正确同步至关重要。每个平台实现对时间戳的处理方式不同
此时序信息对于使音频与视频源同步并确保流畅播放至关重要。
来源:plugins/win-wasapi/win-wasapi.cpp1006-1019 plugins/mac-capture/mac-audio.c440-450 plugins/linux-pulseaudio/pulse-input.c163-171
所有实现都包括错误处理和设备重连逻辑,以在设备更改或暂时失败时也能保持音频捕获
每个平台实现都有自己的线程来监视设备状态,并在发生故障时尝试重新连接。
来源: plugins/win-wasapi/win-wasapi.cpp914-948 plugins/mac-capture/mac-audio.c462-475 plugins/linux-pulseaudio/pulse-input.c391-407
除了音频捕获,OBS 还实现了音频监控功能,允许用户通过选定的输出设备收听捕获的音频。此功能使用类似的特定于平台的 API 来实现,但使用的是输出模式而不是捕获模式。
音频监控系统遵循与音频捕获类似的模式,但操作方式相反,将音频数据发送到播放设备而不是接收它。
来源: libobs/audio-monitoring/pulse/pulseaudio-output.c libobs/audio-monitoring/pulse/pulseaudio-wrapper.c
音频源通过属性列表与 OBS UI 集成,这些属性列表公开设备选择和配置选项。每个平台实现都提供
这使用户能够在 OBS 界面中轻松选择和配置音频设备。
来源: plugins/win-wasapi/win-wasapi.cpp835-846 plugins/mac-capture/mac-audio.c983-1031 plugins/linux-pulseaudio/pulse-input.c442-461
| OBS 格式 | 描述 | 每样本位数 |
|---|---|---|
| AUDIO_FORMAT_FLOAT | 32 位浮点 | 32 |
| AUDIO_FORMAT_16BIT | 16 位有符号整数 | 16 |
| AUDIO_FORMAT_32BIT | 32 位有符号整数 | 32 |
| AUDIO_FORMAT_U8BIT | 8位无符号整数 | 8 |
| OBS 布局 | 通道 | 描述 |
|---|---|---|
| SPEAKERS_MONO | 1 | 单声道 |
| SPEAKERS_STEREO | 2 | 左声道和右声道 |
| SPEAKERS_2POINT1 | 3 | 左、右和 LFE |
| SPEAKERS_4POINT0 | 4 | 左、右、中、后 |
| SPEAKERS_4POINT1 | 5 | 4.0 加 LFE |
| SPEAKERS_5POINT1 | 6 | 5.1 环绕声 |
| SPEAKERS_7POINT1 | 8 | 7.1 环绕声 |