PulseAudio
PulseAudio 是一个通用声音服务器,旨在作为应用程序和硬件设备之间的中间件运行,可以使用 高级 Linux 声音架构 (ALSA) 或 开放声音系统 (OSS)。如果启用,它还提供使用 Avahi 在本地设备间轻松进行网络流媒体。虽然其主要目的是简化音频配置,但其模块化设计允许高级用户精确配置守护进程以最适合他们的需求。
安装
安装 pulseaudio 软件包。
某些 PulseAudio 模块未包含在主软件包中,如果需要必须单独安装
- pulseaudio-alsa 用于 PulseAudio 也管理 ALSA,详见 #ALSA
- pulseaudio-bluetooth 用于 蓝牙 支持 (BlueZ),详见 蓝牙耳机 页面
- pulseaudio-equalizer 用于均衡器接收器 (qpaeq)
- pulseaudio-jack 用于 JACK 接收器、源和 jackdbus 检测
- pulseaudio-lirc 用于使用 LIRC 进行红外音量控制
- pulseaudio-zeroconf 用于 Zeroconf (Avahi/DNS-SD) 支持
前端
有许多用于控制 PulseAudio 守护进程的前端可用
控制台
- ncpamixer — 受 pavucontrol 启发的 PulseAudio Ncurses 混音器。
- pacmixer — 类似 alsamixer(1) 的 PulseAudio 工具。
- PAmix — 类似于 pavucontrol 的 Ncurses PulseAudio 混音器。
- pamixer — PulseAudio 命令行混音器。
- pavolume — 带有 libnotify 消息的 PulseAudio 简单命令行音量控制。
- Ponymix — PulseAudio 命令行混音器。
- pulseaudio-ctl — 从 Shell 或映射到键盘快捷键控制 PulseAudio 音量。
- pulsemixer — PulseAudio 的 CLI 和 curses 混音器。已停止开发。
图形界面
- KMix — KDE 音量控制应用程序,支持包括 PulseAudio 在内的多个平台,系统托盘小程序可配置。
- MicTray — 轻量级系统托盘应用程序,允许您使用 PulseAudio 控制麦克风状态和音量。
- pa-applet — 带有音量条的 PulseAudio 系统托盘小程序。
- pa-notify — PulseAudio 或 PipeWire 音量通知守护进程。
- pasystray — PulseAudio 系统托盘小程序。
- plasma-pa — KDE Plasma 小程序,用于 PulseAudio 音量管理。
- PulseAudio Equalizer — 基于 LADSPA 的 PulseAudio 多频段均衡器。
- PulseAudio Graph Control — 基于 Electron 的 PulseAudio 音量和图形控制。
- PulseAudio Preferences — 简单的 PulseAudio GTK 配置对话框。
- PulseAudio Volume Control — 简单的 PulseAudio GTK 音量控制工具(“混音器”)。
- PulseAudio Volume Control (Qt) — PulseAudio 混音器 (pavucontrol 的 Qt 移植版)。
- PulseAudio Volume Meter — 简单的 PulseAudio GTK 音量计。已停止开发。
- PulseEffects — PulseAudio 应用程序的音频效果。
- Volctl — 每个应用程序的系统托盘小程序音量控制和 PulseAudio 的 OSD。
- Xfce PulseAudio Panel Plugin — Xfce4 面板的 PulseAudio 插件。
配置
默认情况下,PulseAudio 配置为自动检测和管理所有声卡。它接管所有检测到的 ALSA 设备,并将所有音频流重定向到自身,使 PulseAudio 守护进程成为中心配置点。守护进程通常开箱即用,只需少量微调。
尽管 PulseAudio 通常开箱即用,只需最少的配置即可正常运行,但高级用户可以通过修改默认配置文件以禁用模块或从头编写自己的配置文件来更改守护进程的几乎所有方面。
PulseAudio 作为服务器守护进程运行,可以使用客户端/服务器架构在全系统范围内或按用户运行。守护进程本身除了提供 API 和托管动态加载的模块外,如果没有其 模块 就什么也做不了。音频路由和处理任务都由各种模块处理,包括 PulseAudio 的原生协议本身 (由 module-native-protocol-unix 提供)。客户端通过众多协议模块之一连接到服务器,这些模块将接受来自外部源的音频,通过 PulseAudio 路由,并最终通过另一个最终模块输出。输出模块不一定是实际的声音输出:它可以将流转储到文件中,将其流式传输到广播服务器(如 Icecast),甚至可以直接丢弃。
您可以在 PulseAudio 可加载模块 中找到所有可用模块的详细列表。要启用它们,只需在 ~/.config/pulse/default.pa 中添加一行 load-module module-name-from-list。
配置文件
PulseAudio 将首先在主目录 ~/.config/pulse/ 中查找配置文件,如果未找到,则将应用 /etc/pulse/ 中的系统级配置。
- 强烈建议不要编辑系统级配置文件,而是编辑用户配置文件。创建
~/.config/pulse目录,然后将系统配置文件复制到其中并根据需要进行编辑。 - 确保您的用户配置与
/etc/pulse/中打包文件的更改保持同步。否则,PulseAudio 可能会因配置错误而拒绝启动。 - 通常无需将您的用户添加到
audio组,因为 PulseAudio 使用 udev 和 logind 动态地向当前“活动”用户授予访问权限。例外情况包括无头运行机器,这样就没有当前“活动”用户。
daemon.conf
这是配置守护进程本身的主要配置文件。它定义了基本设置,如模块使用的默认采样率、重采样方法、实时调度以及与服务器进程相关的各种其他设置。这些设置无法在运行时更改,除非重新启动 PulseAudio 守护进程。默认值对于大多数用户来说是合理的,有关更多信息,请参阅 pulse-daemon.conf(5) 手册页。布尔选项接受以下任何值:true、yes、on 和 1,以及 false、no、off 和 0。
| 选项 | 描述 |
|---|---|
| daemonize | 控制服务器是否将自身守护化并返回。调试时将其设置为 no,以便您可以在终端上看到调试信息。 |
| resample-method | 当具有不兼容采样率的音频需要在模块之间传递时(例如,在仅支持 48kHz 的硬件上播放 96kHz 音频)使用哪种重采样器。可以使用 pulseaudio --dump-resample-methods 列出可用的重采样器。根据当前用例,在 CPU 使用率和音频质量之间选择最佳折衷。提示 在某些情况下,PulseAudio 会产生高 CPU 负载。这可能发生在多个流被(单独)重采样时。如果这是工作流中的常见用例,则应考虑以匹配的采样率创建一个额外的接收器,然后将其馈送到主接收器,只进行一次重采样。
|
| avoid-resampling | 将 avoid-resampling = yes,PulseAudio 会自动将硬件配置为应用程序使用的采样率,如果硬件支持该采样率(需要 PA 11 或更高版本)。警告 启用此功能可能会导致音频失真,因此默认情况下它是禁用的,有关更多信息,请参阅发行说明。
|
| enable-remixing | 当输入和输出具有不同的通道数时(例如,将 6 声道电影输出到立体声接收器),PulseAudio 可以混音所有通道(默认 yes),或者当设置为 no 时,仅按名称简单地映射通道(左声道到左声道,右声道到右声道,所有其他通道被忽略)。 |
| system-instance | 如果设置为 yes,则将守护进程作为全系统实例运行。**强烈不建议**这样做,因为它可能会引入安全问题。在 Multiseat 系统或没有实际本地用户的无头系统上很有用。默认为 no。 |
| flat-volumes | 如果设置为 yes,则设备音量将随“最响亮”应用程序的音量进行缩放。例如,提高 VoIP 通话音量将提高硬件音量,并调整音乐播放器音量使其保持原样,而无需手动降低音乐播放器音量。默认为 no。注意 启用此功能有时可能会令人困惑,一些不了解此功能的应用程序可能会在启动时将音量设置为 100%,这可能会损坏您的扬声器或听力。
|
| realtime-scheduling | 如果您的 内核 支持实时调度(即 实时内核),请将其设置为 yes 以确保 PulseAudio 可以提供低延迟、无故障的播放。您还可以调整 realtime-priority 以使其使用正确的优先级,尤其是在系统上同时运行 JACK 时。 |
| nice-level | 由于 PulseAudio 在用户空间运行并涉及进程间通信,如果守护进程没有足够的 CPU 时间来处理音频,音频可能会出现中断。默认值通常足够,但可以调整以使 PulseAudio 具有高于(或低于)其他应用程序的所需优先级。 |
| exit-idle-time | 如果您只想在需要时运行 PulseAudio,否则使用 ALSA,您可以设置一个延迟(以秒为单位),在此延迟之后,所有客户端断开连接后,守护进程将自动关闭。将其设置为 -1 以禁用此功能。 |
| log-level | 调试时,您可能希望提高守护进程的日志级别,以确切了解特定模块加载失败的原因。高日志级别有时会打印有用的信息,例如系统检测到的最小延迟,然后可以用于调整 default-fragments 和 default-fragment-size-msec。 |
| default-sample-format | 这通常不需要更改,但如果您的声卡的本机格式不同,通过在此处设置正确的格式可以提高性能和质量。 |
| default-sample-rate | PulseAudio 使用的默认采样率,除非在模块级别被覆盖。如果您的声卡不支持 44100Hz 或您希望对所有音频进行上采样,请更改此项。请参阅之前关于 CPU 使用率的说明。 |
| alternate-sample-rate | 为了解决一个常见的限制,即 48000Hz 的电影被不必要地降采样到 44100Hz,一些模块支持动态更改其采样率,以在可能的情况下避免重采样。有关更深入的信息,请参阅手册。这通常不需要更改。 |
| default-sample-channels | 未指定时的默认通道数。通常不需要任何更改,因为您可以基于每个模块配置更多通道。 |
| default-fragments | 音频样本被分成多个片段,每个片段的大小为 default-fragment-size-msec。缓冲区越大,系统过载时音频跳过的可能性越小。不利的一面是,这会增加整体延迟。如果遇到问题,请增加此值。 |
| default-fragment-size-msec | 每个片段的毫秒大小。这是守护进程一次将处理的数据量。 |
default.pa
此文件是一个启动脚本,用于配置模块。它实际上在守护进程完成初始化后解析和读取,并且可以使用 pactl(1) 或 pacmd(1) 在运行时发送附加命令。启动脚本也可以通过在终端中使用 pulseaudio -nC 启动 PulseAudio 来从命令行提供。这将使守护进程加载 CLI 模块,并直接从命令行接受配置,并在同一终端上输出结果信息或错误消息。这在调试守护进程或在将各种模块永久写入磁盘之前进行测试时非常有用。手册页内容非常直观,请查阅 pulse-cli-syntax(5) 以获取语法详情。
默认配置还会加载 module-gsettings 以应用 paprefs 指定的设置。
~/.config/pulse/default.pa可以不是完整的复制,而是以.include /etc/pulse/default.pa开头,然后只覆盖默认值。- 运行
pacmd list-sinks | grep -Ei 'index:|name:'以列出可用的接收器。当前默认接收器用星号标记。 - 编辑
~/.config/pulse/default.pa以插入/更改 set-default-sink 命令,使用接收器的名称,因为编号不能保证可重复。
system.pa
当 PulseAudio 在全系统模式下运行时,此文件用作 default.pa 的替代启动脚本。
client.conf
这是每个 PulseAudio 客户端应用程序读取的配置文件。它用于配置单个客户端的运行时选项。它可以用于静态设置和配置默认接收器和源,以及允许(或不允许)客户端在服务器未运行时自动启动服务器。如果启用了自动生成(autospawn),当客户端尝试连接时,如果 PulseAudio 未运行,它将自动启动。如果您不希望 PulseAudio 始终运行以节省系统资源,这会很有用。否则,您确实应该让它随 X11 会话一起启动。
配置命令
在运行时配置服务器的主要命令是 pacmd。运行 pacmd --help 以获取选项列表,或直接运行 pacmd 进入 shell 交互模式,然后按 Ctrl+d 退出。所有修改将立即应用。
一旦您的新设置经过测试并满足您的需求,请相应地编辑 default.pa 以使更改持久化。有关一些基本设置,请参阅 PulseAudio/Examples。
default.pa 文件中的 load-module module-default-device-restore 行。它将允许您以默认状态重新启动服务器,从而取消任何错误的设置。重要的是要理解,通过 PulseAudio 可访问和选择的“源”(进程、捕获设备)和“接收器”(声卡、服务器、其他进程)取决于当前选择的硬件“配置文件”(Profile)。这些“配置文件”是 aplay -L 命令列出的 ALSA “pcms”,更具体地说,是 pacmd list-cards 命令列出的,其输出中将包含一行“index:”,一个以“profiles:”开头的列表,以及一行“active profile: <...>”等等。“配置文件”对应于不同的声卡输入/输出配置,特别是可用输入/输出通道的数量。
“活动配置文件”可以使用命令 pacmd set-card-profile INDEX PROFILE 设置,其中 INDEX 和 PROFILE 之间**没有**逗号分隔,INDEX 是“index:”行上的数字,PROFILE 名称是“profiles:”下任何行的开头到冒号和第一个空格**之前**显示的所有内容,如 pacmd list-cards 命令所示。例如,pacmd set-card-profile 0 output:analog-stereo+input:analog-stereo。
使用图形工具(例如 pavucontrol 在配置选项卡下,或 KDE 系统设置在声音选项卡下)选择“配置文件”可能更容易。每个音频“卡”,即 aplay -l 命令或 pacmd list-cards 命令列出的那些设备,都将有自己可选择的“配置文件”。当选择了一个“配置文件”后,可以使用 pacmd list-sources 和 pacmd list-sinks 命令查看当时可用的“源”和“接收器”。请注意,每当声卡配置文件更改时,可用源和接收器的“索引”也会更改。
选择的“配置文件”可能会成为某些应用程序的问题,特别是 Adobe Flash 播放器,通常是 /usr/lib/mozilla/plugins/libflashplayer.so 和 /usr/lib/PepperFlash/libpepflashplayer.so。通常,这些 Flash 播放器只有在选择了立体声配置文件之一时才能工作,否则,将播放无声视频,或直接“崩溃”。当所有其他方法都失败时,您可以尝试选择不同的配置文件。
当然,在 PulseAudio 中配置环绕声的某种变体时,必须选择适当的环绕声配置文件,环绕声才能工作,或者才能执行诸如重新映射扬声器通道之类的操作。
如果您似乎只有“HiFi”配置文件,这意味着您正在使用 ALSA 用例管理器 配置文件而不是 PulseAudio 配置文件。有关如何恢复使用 PulseAudio 配置文件的信息,请参阅 PulseAudio/Examples#禁用 UCM/"HiFi"。
连接和认证
由于 PulseAudio 作为当前用户的守护进程运行,客户端需要知道在哪里找到守护进程套接字来连接它,以及客户端用于与其进行身份验证的共享随机 cookie 文件。默认情况下,客户端应该能够使用环境变量、X11 根窗口属性、client.conf 中的 default-server 选项,最后尝试默认位置 $XDG_RUNTIME_DIR/pulse/native(通常是 unix:/run/user/user-id/pulse/native)来定位守护进程。但是,如果您有需要访问 X11 会话之外的 PulseAudio 的客户端(例如作为不同用户运行的 mpd),您将需要告诉它如何连接到您的 PulseAudio 实例。有关完整示例,请参阅 PulseAudio/Examples#允许多个用户共享 PulseAudio 守护进程。默认情况下启用包含随机字节的身份验证 cookie,以确保在多用户系统上音频不会从一个用户泄漏到另一个用户。如果您已经使用用户/组权限控制谁可以访问服务器,您可以通过将 auth-cookie-enabled=0 传递给 module-native-protocol-unix 来禁用 cookie。
环境变量
如果您将 PulseAudio 的套接字移动到其他位置,这两个变量对于 libpulse 客户端定位 PulseAudio 很重要。有关更多详细信息和客户端将读取的其他有用环境变量,请参阅 pulseaudio(1)。
| 变量 | 定义 |
|---|---|
PULSE_SERVER |
定义服务器的位置。它接受像 unix: 或 tcp 这样的协议前缀,后跟服务器的路径或 IP。示例:unix:/home/pulse/native-sock。 |
PULSE_COOKIE |
指向包含 PulseAudio 生成的随机 cookie 的文件位置。此文件将被客户端读取,其内容将发送到服务器,因此该文件必须对所有音频客户端可读。它不必是同一个文件,只要其内容与守护进程使用的内容匹配即可。 |
X11 属性
使用 SSH X11 转发时(即,当 DISPLAY 和 SSH_CONNECTION 环境变量 存在时),libpulse 客户端还使用 X11 服务器根窗口上的窗口属性来帮助找到守护进程。
X11 属性可以使用 xprop -root 查询,或使用 pax11publish -d 读取 PulseAudio 特定属性。pax11publish 也可以用于从环境变量更新属性(pax11publish -e,或 pax11publish -r 完全删除它们)。如果可能,建议让 PulseAudio 使用 module-x11-publish 模块或 start-pulseaudio-x11 命令自行完成。
| 变量 | 定义 |
|---|---|
PULSE_SERVER |
字符串值 (xprop -root -f PULSE_SERVER 8s -set PULSE_SERVER 127.0.0.1:4713 或 pax11publish -e -S 127.0.0.1:4713),与同名环境变量工作方式相同。 |
PULSE_COOKIE |
包含认证 cookie 十六进制表示的字符串值。 |
运行
Arch 上的 PulseAudio 默认情况下为 systemd/User 实例启用了 pulseaudio.socket。这意味着 PulseAudio 将在需要时自动启动。
- 要禁用
pulseaudio.socket,请屏蔽pulseaudio.socket用户单元。这将允许您安装 pulseaudio 而不让应用程序使用它,例如您不需要声音或正在使用备用声音服务器。- 这种基于 systemd 的方法优先于 pulse-client.conf(5) 中描述的
autospawn选项。pulseaudio 默认禁用此选项,因此您无需担心自行设置。[3]
- 这种基于 systemd 的方法优先于 pulse-client.conf(5) 中描述的
- 许多 桌面环境 支持 XDG 自动启动。在这些桌面环境中,无论套接字激活状态如何,PulseAudio 都会自动启动。
更多信息,请参阅 PulseAudio: Running。
停止
停止 pulseaudio.socket 和 pulseaudio.service 用户单元。
后端配置
ALSA
如果您有不明确支持 PulseAudio 但依赖 ALSA 的应用程序,这些应用程序将尝试通过 ALSA 直接访问声卡,从而绕过 PulseAudio。因此,PulseAudio 将不再能够访问声卡。结果是,所有依赖 PulseAudio 的应用程序将不再工作,导致 此问题。为防止这种情况,您需要安装 pulseaudio-alsa 软件包。它包含必要的 /etc/alsa/conf.d/99-pulseaudio-default.conf,用于配置 ALSA 使用 PulseAudio。另请确保 ~/.asoundrc 不存在,因为它会覆盖 /etc/asound.conf 文件。
如果您运行的是 x86_64 系统并希望为 32 位 多架构 程序(如 Wine 和 Steam)提供声音,还需要安装 lib32-libpulse 和 lib32-alsa-plugins。
为防止应用程序使用 OSS 仿真并绕过 PulseAudio(从而阻止其他应用程序播放声音),请确保模块 snd_pcm_oss 未在启动时加载。如果它当前已加载(lsmod | grep oss),请通过执行以下命令禁用它:
# rmmod snd_pcm_oss
通过 ALSA 启用 DTS
要通过 ALSA 启用 PulseAudio DTS (数字影院系统),请安装 dcaencAUR 软件包并启用它
/etc/asound.conf
<confdir:pcm/dca.conf>
最后重启 PulseAudio。如果您的 DTS 设备和/或 PulseAudio 出现音量问题,您可以通过在 dcaenc 的 GitLab 上查找更多设置选项来解决。
向 ALSA 暴露 PulseAudio 源、接收器和混音器
尽管 pulseaudio-alsa 包含了允许 ALSA 应用程序使用 PulseAudio 默认设备的必要配置文件,但 ALSA 的 pulse 插件功能更强大。
~/.asoundrc (or /etc/asound.conf)
# Create an alsa input/output using specific PulseAudio sources/sinks
pcm.pulse-example1 {
type pulse
device "my-combined-sink" # name of a source or sink
fallback "pulse-example2" # if combined not available
}
pcm.pulse-example2 {
type pulse
device "other-sound-card" # name of a source or sink
# example: device "alsa_output.pci-0000_00_1b.0.analog-stereo"
}
# Create an ALSA mixer using specific PulseAudio sources/sinks
# these can be tested with "alsamixer -D pulse-example3"
ctl.pulse-example3 {
type pulse
device "my-output" # name of source or sink to control
# example: always control the laptop speakers:
# device "alsa_output.pci-0000_00_1b.0.analog-stereo"
fallback "pulse-example4" # supports fallback too
}
# Mixers also can control a specific source and sink, separately:
ctl.pulse-example4 {
type pulse
sink "my-usb-headphones"
source "my-internal-mic"
# example: output to HDMI, record using internal
sink "alsa_output.pci-0000_01_00.1.hdmi-stereo-extra1"
source "alsa_input.pci-0000_00_1b.0.analog-stereo"
}
# These can override the default mixer (example: for pnmixer integration)
ctl.!default {
type pulse
sink "alsa_output.pci-0000_01_00.1.hdmi-stereo-extra1"
source "alsa_input.pci-0000_00_1b.0.analog-stereo"
}
可以查阅源代码以了解所有可用选项。
不占用硬件设备的 ALSA/dmix
您可能希望在大多数应用程序中直接使用 ALSA,同时仍然能够使用需要 PulseAudio 的应用程序。以下步骤允许您让 PulseAudio 使用 dmix 而不是占用 ALSA 硬件设备。
- 移除 pulseaudio-alsa 软件包,它提供了 ALSA 应用程序和 PulseAudio 之间的兼容层。在此之后,您的 ALSA 应用程序将直接使用 ALSA,而不会被 PulseAudio 钩住。
- 在
/etc/pulse/default.pa中,注释或删除load-module module-udev-detect行并添加以下行
/etc/pulse/default.pa
load-module module-alsa-sink device=dmix load-module module-alsa-source device=dsnoop
- 现在,重启您的计算机并尝试同时运行 ALSA 和 PulseAudio 应用程序。它们都应该同时发出声音。
- 如果需要,使用 pavucontrol 控制 PulseAudio 音量。
OSS
有多种方法可以使仅支持 OSS 的程序输出到 PulseAudio
ossp
padsp 包装器
使用 OSS 的程序可以通过使用 padsp(1)(包含在 libpulse 中)启动它来与 PulseAudio 配合使用
$ padsp OSSprogram
几个例子
$ padsp aumix $ padsp sox foo.wav -t ossdsp /dev/dsp
您还可以添加一个自定义的包装脚本,如下所示
/usr/local/bin/OSSprogram
#!/bin/sh exec padsp /usr/bin/OSSprogram "$@"
确保您的 PATH 中 /usr/local/bin 位于 /usr/bin 之前。
GStreamer
gst-plugins-good 为使用 GStreamer 的应用程序提供了 pulseaudio 插件。
OpenAL
OpenAL Soft 默认应使用 PulseAudio,但可以明确配置为这样做
/etc/openal/alsoft.conf
drivers=pulse,alsa
libao
编辑 libao 配置文件
/etc/libao.conf
default_driver=pulse
务必删除 alsa 驱动程序的 dev=default 选项,或将其调整为指定特定的 PulseAudio 接收器名称或编号。
alsa 驱动及其默认设备的标准,因为此时 ALSA 默认设备**就是** PulseAudio。音频后处理
PulseEffects
PulseEffects 是一个高级 GTK 工具,用于对音频输入和输出应用多种音频效果(例如降噪、均衡器等)。
您可能还需要安装其可选依赖 lsp-plugins 以使插件正常工作。如果在安装插件后 PulseEffects 插件变为灰色,尝试启动守护进程时产生错误,或者在设置 > PulseAudio 选项卡中未显示设备,请考虑清除缓存,如 [4] 所示。
PulseEffects 预设集可以在 社区预设 中找到。
均衡
如果您想使用 PulseEffects 中集成的均衡器以外的其他均衡器,有以下选项。
LADSPA 模块
安装 pulseaudio-equalizer-ladspa,这是一个基于 LADSPA swh-plugins 的均衡器。启动 pulseaudio-equalizer-gtk GUI 并调整参数以符合您的预期。
集成模块
PulseAudio 有一个集成的 10 频段均衡器系统。为了使用它,请安装 pulseaudio-equalizer 并加载 module-equalizer-sink
$ pactl load-module module-equalizer-sink
如果您的配置默认不加载 module-dbus-protocol,也请加载它。
要启动 GUI,请运行 qpaeq。
要在每次启动时加载均衡器模块,请在 /etc/pulse/default.pa.d/ 中创建一个 .pa 文件或编辑 ~/.config/pulse/default.pa 并添加以下行
### Load the integrated PulseAudio equalizer load-module module-equalizer-sink
动态范围压缩
动态范围压缩可以通过 #PulseEffects 完成,但是 PulseEffects 可能会给音频流带来很大的开销和延迟,所以如果您只需要压缩效果并且系统负载较小,则可以使用 module-ladspa-sink 的其他选项。
Steve Harris 插件
Steve Harris LADSPA 是一组包含各种压缩模块的插件。安装 swh-plugins 并按如下方式编辑配置:
~/.config/pulse/default.pa
.include /etc/pulse/default.pa set-default-sink your_card_sink_name load-module module-ladspa-sink sink_name=shw_sc4 sink_master=your_card_sink_name plugin=sc4_1882 label=sc4 control=,,,,,, set-default-sink shw_sc4
您必须指定您的声卡接收器名称,可以从 pacmd list-sinks 获取。要应用更改,请停止并重新启动 PulseAudio。上述配置具有使用默认值的空控制选项。
要使用自定义控制参数调整模块,请按正确的顺序填写它们。
| 控制选项 | 描述 |
|---|---|
| RMS/峰值 (0/1) | RMS 和峰值包络跟随器之间的平衡。RMS 通常更适合细微、音乐性的压缩,而峰值更适合更重、快速的压缩和打击乐。 |
| 启动时间 (毫秒) | 启动时间(以毫秒为单位)。 |
| 释放时间 (毫秒) | 释放时间(以毫秒为单位)。 |
| 阈值水平 (分贝) | 压缩器开始工作的点。 |
| 比率 (1:n) | 当信号电平超过阈值时使用的增益降低比。1 表示无压缩;值越高,压缩越强。 |
| 拐点半径 (分贝) | 拐点曲线开始距阈值的距离。 |
| 补偿增益 (分贝) | 控制补偿输入信号的增益(以分贝为单位)。 |
其他插件可以在 Steve Harris 的 LADSPA 插件文档中找到。
Calf 插件
对于更专业的压缩器,您可以使用 Calf Studio Gear 开发的[失效链接 2025-08-16—SSL 错误]。安装 calf-ladspaAUR 并按如下方式编辑配置
~/.config/pulse/default.pa
.include /etc/pulse/default.pa set-default-sink your_card_sink_name load-module module-ladspa-sink sink_name=calf_comp_x2 sink_master=your_card_sink_name plugin=veal label=Compressor control=,,,,,,,,,, set-default-sink calf_comp_x2
该插件有 11 个控制选项。如果您想插入自定义值,请阅读下表并记住按正确的顺序指定它们。
| 控制选项 | 默认 | 最小值 | 最大值 | 类型 | 信息 |
|---|---|---|---|---|---|
| 旁路 | 0 | 0 | 1 | 布尔值 | |
| 输入电平 | 1 | 0.015625 | 64 | 浮点分贝 | |
| 阈值 | 0.125 | 0.000976563 | 1 | 浮点 dbFs | 例如,要设置 -18 分贝,正确的值是 10^(-18/20) = 0.158 |
| 比率 | 2 | 1 | 20 | 浮点数 | |
| 启动 | 20 | 0.01 | 2000 | 浮点毫秒 | |
| 释放 | 250 | 0.01 | 2000 | 浮点毫秒 | |
| 补偿 | 1 | 1 | 64 | 浮点分贝 | |
| 拐点 | 2.828427125 | 1 | 8 | 浮点分贝 | |
| RMS/峰值 | 0 | 0 | 1 | 布尔值 | 0 = RMS;1 = 峰值 |
| 立体声联动 | 0 | 0 | 1 | 布尔值 | 0 = 平均值;1 = 最大值 |
| 混合 | 1 | 0 | 1 | 浮点数 | 百分比 |
| 要理解每个选项的含义,请阅读 Calf 压缩器文档[失效链接 2025-08-16—SSL 错误]。 | |||||
麦克风回声/噪声消除
Arch 默认不加载 PulseAudio 回声消除模块,因此,我们必须将其添加到 /etc/pulse/default.pa.d/ 中。首先,您可以使用 pacmd 并输入 list-modules 来测试模块是否存在。如果您找不到显示 name: <module-echo-cancel> 的行,则必须创建:
/etc/pulse/default.pa.d/noise-cancellation.pa
### Enable Echo/Noise-Cancellation load-module module-echo-cancel use_master_format=1 aec_method=webrtc aec_args="analog_gain_control=0 digital_gain_control=1" source_name=echoCancel_source sink_name=echoCancel_sink set-default-source echoCancel_source set-default-sink echoCancel_sink
然后重启 PulseAudio。
$ pulseaudio -k $ pulseaudio --start
并启动 pavucontrol 检查模块是否已激活。在录音下,输入设备应显示来自回声消除源流。
如果您有多个麦克风(这在许多新笔记本电脑上很常见),在 aec_args 中打开 beamforming=1 也可以显著降低背景噪音。然而,波束成形需要指定您的 mic_geometry(见下文)。
如果您希望现有流自动移动到新的接收器和源,您必须在此之前加载带有 ignore_virtual=no 的 module-switch-on-connect。
module-echo-cancel 后将耳机插入前置音频接口,您必须手动卸载并再次加载 module-echo-cancel,因为遗憾的是无法告诉模块它应该自动切换到新的默认 'source_master' 和 'source_sink'。详见 [5]。'aec_method=webrtc' 可能的 'aec_args'
以下是 'aec_method=webrtc' 可能的 'aec_args' 及其默认值列表 [6][7]
analog_gain_control=1- 模拟 AGC - “自动增益控制”通过直接改变音量完成 - 最有可能导致 失真。digital_gain_control=0- 数字 AGC - “自动增益控制”在后处理中完成(CPU 负载更高)。experimental_agc=0- 允许启用 webrtc 实验性 AGC 机制。agc_start_volume=85- 使用 AGC 时的初始音量 - 可能的值 0-255 - 过低的初始音量可能会阻止 AGC 算法将音量提高到足够高 [8]。high_pass_filter=1- ?noise_suppression=1- 噪声抑制。voice_detection=1- VAD - 语音活动检测。extended_filter=0- 扩展滤波器比常规滤波器更复杂,对硬件报告的不正确延迟不那么敏感。扩展滤波器模式默认禁用,因为它在双讲期间似乎产生了更差的结果 [9]。如果您的麦克风或扬声器具有较大的延迟,例如,如果您使用无线麦克风或某些 HDMI 电视作为扬声器,请启用此选项。intelligibility_enhancer=0- webrtc 语音清晰度增强器的一些位。drift_compensation=0- 漂移补偿,允许不同设备之间进行回声消除(例如笔记本电脑上的扬声器和 USB 摄像头上的麦克风)。 - 仅在 "mobile=0" 时可能。beamforming=0- 这可以显著降低背景噪音。详见 [10][11]mic_geometry=x1,y1,z1,x2,y2,z2- 仅在 "beamforming=1" 时可用。target_direction=a,e,r- 仅在 "beamforming=1" 时可用。注意:如果模块不希望使用此参数加载,请将方位角 (a) 设置为所需值,但将仰角 (e) 和半径 (r) 设置为 0。
mobile=0- ?routing_mode=speakerphone- 可能的值为 "quiet-earpiece-or-headset,earpiece,loud-earpiece,speakerphone,loud-speakerphone" - 仅在 "mobile=1" 时有效。comfort_noise=1- ? - 仅在 "mobile=1" 时有效。
在特定应用程序中禁用音频后处理
如果您正在使用 module-echo-cancel,您可能不希望其他应用程序进行额外的音频后处理。以下是在以下应用程序中禁用音频后处理的列表:
- Mumble
- 配置 > 设置 > 音频输入
- 回声消除:选择禁用
- 噪声抑制:选择禁用
- 最大放大:将滑块设置为1.00
- TeamSpeak
- 工具 -> 选项 -> 捕获
- 取消勾选:“打字衰减”,“移除背景噪音”,“回声消除”和“回声降低 (Ducking)”
- Firefox:请参阅 Firefox 优化#禁用 WebRTC 音频后处理
- Steam
- 设置 > 语音 > 高级选项 > 显示
- 禁用以下滑块:回声消除、噪声消除、自动音量/增益控制
重新加载 module-echo-cancel 的脚本
由于 `module-echo-cancel` 并非总是需要,或者在 `source_master` 或 `sink_master` 发生变化时必须重新加载,因此有一个简单的方法来加载或重新加载 `module-echo-cancel` 是很好的。
echoCancelEnable.sh
#!/bin/sh aecArgs="$*" # If no "aec_args" are passed on to the script, use this "aec_args" as default: [ -z "$aecArgs" ] && aecArgs="analog_gain_control=0 digital_gain_control=1" newSourceName="echoCancelSource" newSinkName="echoCancelSink" # "module-switch-on-connect" with "ignore_virtual=no" (needs PulseAudio 12 or higher) is needed to automatically move existing streams to a new (virtual) default source and sink. if ! pactl list modules short | grep "module-switch-on-connect.*ignore_virtual=no" >/dev/null 2>&1; then echo Load module \"module-switch-on-connect\" with \"ignore_virtual=no\" pactl unload-module module-switch-on-connect 2>/dev/null pactl load-module module-switch-on-connect ignore_virtual=no fi # Reload "module-echo-cancel" echo Reload \"module-echo-cancel\" with \"aec_args=$aecArgs\" pactl unload-module module-echo-cancel 2>/dev/null if pactl load-module module-echo-cancel use_master_format=1 aec_method=webrtc aec_args=\"$aecArgs\" source_name=$newSourceName sink_name=$newSinkName; then # Set a new default source and sink, if module-echo-cancel has loaded successfully. pacmd set-default-source $newSourceName pacmd set-default-sink $newSinkName fi
要从图形环境中轻松运行该脚本,您可以为其创建一个桌面启动器。
循环神经网络噪声抑制 (RNNoise)
安装 noise-suppression-for-voice 软件包将允许基于 RNNoise: 学习噪声抑制 [12] 进行实时噪声抑制。配置详情可在项目 Github 站点 [13] 上找到。
另一个选择是 noisetorchAUR,它建立在 RNNoise 之上。它不仅有输入噪声消除,还有输出。
应用程序
QEMU
有关如何在 QEMU 中配置 PulseAudio 的详细指南,请参阅 QEMU#创建音频后端。
AlsaMixer.app
安装 pulseaudio-alsa 并使 alsamixer.appAUR dockapp 用于 windowmaker 使用 PulseAudio,例如:
$ AlsaMixer.app --device pulse
这里有两个例子,第一个是针对 ALSA 的,另一个是针对 PulseAudio 的。您可以运行它的多个实例。使用 -w 选项选择要绑定到鼠标滚轮的控制按钮。
$ AlsaMixer.app -3 Mic -1 Master -2 PCM --card 0 -w 1 $ AlsaMixer.app --device pulse -1 Capture -2 Master -w 2
详见 #ALSA。
XMMS2
使其切换到 PulseAudio 输出。
$ xmms2 server config output.plugin pulse
并切换到 ALSA。
$ xmms2 server config output.plugin alsa
要让 XMMS2 使用不同的输出接收器,例如:
$ xmms2 server config pulse.sink alsa_output.pci-0000_04_01.0.analog-stereo.monitor
另请参阅官方指南。
KDE Plasma 工作区和 Qt
PulseAudio 将自动被 KDE / Qt 应用程序使用。KDE 声音混音器默认支持它。更多信息请参阅 PulseAudio wiki 中的 KDE 页面。
如果 Phonon 使用 phonon-gstreamer 后端,也应按照 #GStreamer 中所述配置 GStreamer。
Audacious
Audacious 原生支持 PulseAudio。要使用它,请设置 文件 > 设置 > 音频 > 输出插件 > PulseAudio 输出。
音乐播放器守护进程 (MPD)
配置 MPD 以使用 PulseAudio。另请参阅 音乐播放器守护进程/提示和技巧#PulseAudio。
MPlayer
MPlayer 原生支持使用 -ao pulse 选项进行 PulseAudio 输出。它也可以配置为默认使用 PulseAudio 输出,在 ~/.mplayer/config 中用于每用户配置,或在 /etc/mplayer/mplayer.conf 中用于全系统配置
/etc/mplayer/mplayer.conf
ao=pulse
mpv
mpv 支持 PulseAudio,与 #MPlayer 中所述相同。配置在 ~/.config/mpv/mpv.conf 中用于每用户,或在 /etc/mpv/mpv.conf 中用于全系统。
guvcview
guvcview 在使用来自 摄像头 的 PulseAudio 输入时,音频输入可能会暂停,导致没有音频被录制。您可以通过执行以下命令来检查:
$ pactl list sources
如果音频源处于“暂停”状态,则创建以下 .pa 文件
/etc/pulse/default.pa.d/no-module-suspend-on-idle.pa
unload-module module-suspend-on-idle
然后重启 PulseAudio 或您的计算机,这将只会使输入源空闲而不是暂停它。guvcview 将随后正确地从设备录制音频。
网络音频
PulseAudio 的独特功能之一是它能够通过 TCP 在局域网内可靠地将音频从客户端流式传输到运行 PulseAudio 守护进程的服务器。确保客户端和服务器系统时间一致(即,使用 NTP),否则音频流可能会断断续续或根本无法工作。有关更详细的指南,请访问 PulseAudio 官方文档。
要在服务器(实际输出声音的计算机)上启用 TCP 模块,请创建以下 .pa 文件
/etc/pulse/default.pa.d/tcp.pa
load-module module-native-protocol-tcp
或者您可以使用 paprefs GUI 应用程序(不需要 root 权限)。转到网络服务器 > 启用网络访问本地声音设备。
为确保服务器上已加载 module-native-protocol-tcp,您可以使用:
$ pacmd list-modules | grep module-native-protocol-tcp
客户端和服务器必须共享相同的 cookie。确保客户端和服务器共享 ~/.config/pulse/cookie 下找到的同一 cookie 文件。您使用哪个 cookie 文件(服务器的或客户端的)并不重要,只要服务器和客户端共享同一个即可。
如果不希望从客户端复制 cookie 文件,匿名客户端可以通过在服务器上(再次在 /etc/pulse/default.pa.d/ 中)向 module-native-protocol-tcp 传递 auth-anonymous 来访问服务器。
load-module module-native-protocol-tcp auth-anonymous=1
也可以基于客户端 IP 地址进行身份验证。
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/24
更改局域网 IP 子网,使其与您希望访问服务器的客户端的 IP 子网匹配。
开机时在系统范围内启动
PulseAudio 守护程序通常在用户登录并尝试播放某种音频时作为用户服务启动。对于运行接受通过 TCP 连接的专用 PulseAudio 服务器,守护程序必须在开机时作为系统服务启动。请注意,在大多数桌面使用场景中,系统模式可能不是正确的选择。
要以系统模式运行 PulseAudio,首先我们需要设置系统范围的 PulseAudio 服务器实例所需的用户和组[14]。
- 添加用户
pulse。PulseAudio 守护程序启动后会切换到此用户。# useradd -d /var/run/pulse -s /usr/bin/nologin -G audio pulse
- (可选)如果您的系统中有
bluetooth组(BlueZ),并且希望 PulseAudio 使用蓝牙,则将用户pulse添加到bluetooth组。# usermod -aG bluetooth pulse
- 添加
pulse-access组。此组由 PulseAudio 服务器用于访问控制。# groupadd pulse-access
- 如果您希望用户访问系统范围的 PulseAudio 实例,请将这些用户添加到
pulse-access组。# usermod -aG pulse-access root
在 /etc/systemd/system 中创建包含以下内容的 pulseaudio.service 服务
/etc/systemd/system/pulseaudio.service
[Unit] Description=Sound Service [Service] # Note that notify will only work if --daemonize=no Type=notify ExecStart=/usr/bin/pulseaudio --daemonize=no --exit-idle-time=-1 --disallow-exit=true --system --disallow-module-loading Restart=always [Install] WantedBy=default.target
root 更改为 pulse。[15] 用户和组名是硬编码的:以 `pulse` 用户启动服务不起作用,并且 PulseAudio 会抱怨它不是 root 用户。然后,在系统级别启用 pulseaudio.service。您还需要通过使用 --global 标志屏蔽 pulseaudio.socket 来禁用整个系统中的用户级 PulseAudio 服务。
即使您通过 SSH 访问系统,这也是必要的,以确保用户级 PulseAudio 服务永远不会启动。
当 PulseAudio 以系统模式启动时,将使用 /etc/pulse/system.pa 而不是 default.pa,因此请务必将所有必要的设置放入 system.pa 中。
选择服务器
对于单个 shell 或命令,您可以将 PULSE_SERVER 环境变量设置为所需 PulseAudio 服务器的主机名或 IP 地址
$ env PULSE_SERVER=server-hostname-or-ip mplayer test.mp3
或者,您可以创建或修改 ~/.config/pulse/client.conf 或 /etc/pulse/client.conf 来持久设置默认服务器
default-server = server-hostname-or-ip
也可以指定多个用空格分隔的服务器,PulseAudio 会随后尝试连接它们[16]
default-server = server1 backup
技巧与提示
键盘音量控制
将以下命令映射到您的音量键:XF86AudioRaiseVolume、XF86AudioLowerVolume 和 XF86AudioMute。
首先找出哪个 sink 对应于您想要控制的音频输出。要列出可用的 sink
$ pactl list sinks short
假设使用 sink 0,以提高音量
$ sh -c "pactl set-sink-mute 0 false ; pactl set-sink-volume 0 +5%"
减小音量
$ sh -c "pactl set-sink-mute 0 false ; pactl set-sink-volume 0 -5%"
静音/取消静音音量
$ pactl set-sink-mute 0 toggle
静音/取消静音麦克风
$ pactl set-source-mute 1 toggle
- 要使键盘快捷键始终在默认 sink 上操作,请将
@DEFAULT_SINK@指定为 sink 编号,例如pactl set-sink-mute @DEFAULT_SINK@ toggle。 - 对于更高级的控制,例如限制最大音量,请考虑使用其中一个控制台前端。
从非交互式 shell(systemd 服务、cron)播放声音
将 user 替换为运行 PulseAudio 的用户
# machinectl shell --uid=user .host /usr/bin/paplay /usr/share/sounds/freedesktop/stereo/complete.oga
X11 响铃事件
要让 PulseAudio 处理 X11 响铃事件,请在 X11 会话启动后运行以下命令
$ pactl upload-sample /usr/share/sounds/freedesktop/stereo/bell.oga bell-window-system $ pactl load-module module-x11-bell display=$DISPLAY
或使用配置文件 /etc/pulse/default.pa.d/ 或 ~/.config/pulse/default.pa
~/.config/pulse/default.pa
.include /etc/pulse/default.pa # audible bell load-sample-lazy bell-window-system /usr/share/sounds/freedesktop/stereo/bell.oga load-module module-x11-bell
要调整 X11 响铃的音量,请运行以下命令
$ xset b 100
100 是百分比。这需要 xorg-xset 软件包。请参阅自动启动以了解在 X11 会话启动时自动运行这些命令的方法。
连接时切换
switch-on-connect 模块在连接新设备时将输出声音切换到新设备。例如,如果您插入 USB 耳机,输出将切换到耳机。如果您拔下耳机,输出将恢复到上一个设备。
此模块默认禁用,因为它过于激进,但可以通过将 load-module module-switch-on-connect 这行添加到您的 ~/.config/pulse/default.pa 来启用。
切换输出端口的脚本
某些声卡提供多个模拟输出选项,可以通过 PulseAudio 端口进行切换。但手动切换可能会很麻烦,因此您可以使用 pactl 命令将其自动化。
列出可用端口
$ LC_ALL=C.UTF-8 pactl list sinks
Sink #0 ... Ports: analog-output-speaker: Speakers (type: Speaker, priority: 10000, availability unknown) analog-output-headphones: Headphones (type: Headphones, priority: 9900, not available) Active Port: analog-output-speaker
当前端口可以通过以下方式获取
$ LC_ALL=C.UTF-8 pactl list sinks | grep "Active Port" | cut -d ' ' -f 3-
切换活动端口
$ pactl set-sink-port sink-index port
这个过程可以通过一个简单的脚本自动化。然后用户可以为这个脚本设置一个快捷方式
~/pa.sh (or anything the user wants)
#!/bin/sh # This script uses notify-send from the libnotify package to warn the user of the currently swapped to port. # User could adapt it to their needs or change it. CURRENT_PORT=$(LC_ALL=C.UTF-8 pactl list sinks | grep "Active Port" | cut -d ' ' -f 3-) if [ "$CURRENT_PORT" = "analog-output-speaker" ] ; then pactl set-sink-port 0 "analog-output-headphones" notify-send --expire-time=2000 "PulseAudio" "Headphones" else pactl set-sink-port 0 "analog-output-speaker" notify-send --expire-time=2000 "PulseAudio" "Speakers" fi
此脚本旨在在两个端口之间进行切换。首先检查当前端口,然后进行切换。用户可能需要更改 sink 索引号和端口名称以适应其机器。
禁用在进入语音通话时静音媒体(module-role-cork)
当进入语音通话时(例如在 Microsoft Teams 中,也可能是其他应用程序),任何媒体应用程序都可能被静音。要禁用此行为,您只需在 PulseAudio 配置中禁用此模块
/etc/pulse/default.pa.d/no-cork.pa
unload-module module-role-cork
高级配置和用例
故障排除
请参阅PulseAudio/Troubleshooting。