菜单

音频源

相关源文件

本文档介绍了 OBS Studio 中允许跨不同平台从各种输入(麦克风、线路输入)和输出(系统声音、应用程序音频)捕获音频的音频源实现。它侧重于特定于平台的捕获机制和通用的音频处理管道,该管道准备捕获的音频供 OBS 使用。

有关视频源的信息,请参阅 视频源

概述

OBS 提供特定于平台的实现来捕获输入和输出设备音频

  • Windows 使用 Windows Audio Session API (WASAPI)
  • macOS 使用 Core Audio
  • Linux 使用 PulseAudio

尽管每个平台在音频捕获方面需要不同的 API 和技术,但它们都遵循设备枚举、捕获初始化和连续音频数据处理的通用模式。

来源:plugins/win-wasapi/win-wasapi.cpp plugins/mac-capture/mac-audio.c plugins/linux-pulseaudio/pulse-input.c

通用功能

在所有平台上,音频源都实现了以下关键功能

  • 设备枚举和选择
  • 音频格式转换为 OBS 兼容格式
  • 扬声器布局映射
  • 音频缓冲和同步
  • 失败时设备重新连接
  • 支持输入设备(麦克风)和输出设备(扬声器)

平台实现

Windows (WASAPI)

Windows 实现使用 WASAPI API 从输入和输出设备捕获音频。它支持三种不同的源类型

源类型描述实现
输入从麦克风和其他输入设备捕获使用标准 WASAPI 捕获
DeviceOutput捕获系统音频输出使用 WASAPI 环回模式
ProcessOutput从特定应用程序捕获音频使用特定于进程的音频捕获 API

Windows 实现功能最丰富,支持

  • 特定于进程的音频捕获
  • 基于窗口的目标定位
  • 设备更改检测
  • 健壮的重连逻辑

来源:plugins/win-wasapi/win-wasapi.cpp93-96 plugins/win-wasapi/win-wasapi.cpp999-1031

捕获过程包括

  1. 创建设备枚举器
  2. 查找请求的设备
  3. 创建音频客户端
  4. 初始化捕获参数
  5. 设置捕获循环
  6. 处理音频数据并将其转发给 OBS

Windows 设备使用 IMMDeviceEnumerator 接口检测和枚举,设备信息存储在一个列表种,该列表填充了 UI 中的设备选择下拉菜单。

来源:plugins/win-wasapi/enum-wasapi.cpp37-92

macOS (Core Audio)

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 实现使用 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 兼容格式

平台原生格式转换函数
WindowsWAVEFORMATEXWASAPISource::InitFormat
macOSAudioStreamBasicDescriptionconvert_ca_format
Linuxpa_sample_format_tpulse_to_obs_audio_format

音频数据通常转换为以下 OBS 音频格式之一

  • AUDIO_FORMAT_FLOAT
  • AUDIO_FORMAT_16BIT
  • AUDIO_FORMAT_32BIT
  • AUDIO_FORMAT_U8BIT

同样,通道配置被映射到 OBS 扬声器布局,例如 SPEAKERS_MONOSPEAKERS_STEREOSPEAKERS_5POINT1

来源:plugins/win-wasapi/win-wasapi.cpp777-791 plugins/mac-capture/mac-audio.c185-205 plugins/linux-pulseaudio/pulse-input.c58-106

时序与同步

音频时序对于正确同步至关重要。每个平台实现对时间戳的处理方式不同

  • Windows WASAPI:可使用设备时序或系统时序
  • macOS Core Audio:使用 mach_timebase_info 进行精确时序
  • Linux PulseAudio:将样本帧转换为时间戳

此时序信息对于使音频与视频源同步并确保流畅播放至关重要。

来源: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

UI 集成

音频源通过属性列表与 OBS UI 集成,这些属性列表公开设备选择和配置选项。每个平台实现都提供

  1. 属性下拉列表的设备枚举
  2. 默认设置
  3. 属性更改的 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_FLOAT32 位浮点32
AUDIO_FORMAT_16BIT16 位有符号整数16
AUDIO_FORMAT_32BIT32 位有符号整数32
AUDIO_FORMAT_U8BIT8位无符号整数8

常见扬声器布局

OBS 布局通道描述
SPEAKERS_MONO1单声道
SPEAKERS_STEREO2左声道和右声道
SPEAKERS_2POINT13左、右和 LFE
SPEAKERS_4POINT04左、右、中、后
SPEAKERS_4POINT154.0 加 LFE
SPEAKERS_5POINT165.1 环绕声
SPEAKERS_7POINT187.1 环绕声