PulseAudio/示例
创建用户配置文件
系统范围的配置文件位于 /etc/pulse
下,而用户配置文件位于 $XDG_CONFIG_HOME/pulse
下,默认路径为 ~/.config/pulse
。对于下面修改用户配置文件的示例,可能需要先创建该文件。这可以通过将系统文件从 /etc/pulse
复制到用户的配置目录,或者通过创建一个新文件,使用 .include /etc/pulse/name
语法包含该文件来完成。对于简单的更改,后者是首选,因为当系统范围的默认设置更改时,用户不需要更新该文件。
用户客户端配置文件示例
~/.config/pulse/client.conf
.include /etc/pulse/client.conf # User's directives go here.
此语法适用于 default.pa
、daemon.conf
和 system.pa
,即使后者作为用户配置文件没有意义。
诸如 Sink alsa_output.pci-0000_03_00.0.analog-stereo does not exist.
等错误可能间接指示存在此类空格。
设置默认输入源
列出可用的输入源
$ pacmd list-sources | grep -e 'index:' -e device.string -e 'name:'
index: 0 name: <input> device.string = "hw:2" * index: 1 name: <oss_input.dsp> device.string = "/dev/dsp" index: 2 name: <alsa_output.pci-0000_04_01.0.analog-stereo.monitor>
索引前面的 *
表示当前默认输入。
要设置系统范围的默认值,请在 default.pa
文件中添加源名称
/etc/pulse/default.pa
... set-default-source alsa_output.pci-0000_04_01.0.analog-stereo.monitor ...
用于临时使用
$ pacmd "set-default-source alsa_output.pci-0000_04_01.0.analog-stereo.monitor"
@DEFAULT_SOURCE@
,例如:$ pactl set-source-mute @DEFAULT_SOURCE@ toggle
。设置默认输出接收器
要列出可用的输出接收器,请键入以下命令
$ pacmd list-sinks | grep -e 'name:' -e 'index:'
* index: 0 name: <alsa_output.pci-0000_04_01.0.analog-stereo> index: 1 name: <combined>
索引前面的 *
表示当前默认输出。
要设置系统范围的默认值,请在 default.pa
文件中添加源名称
/etc/pulse/default.pa
... set-default-sink alsa_output.pci-0000_04_01.0.analog-stereo ...
或每个用户的配置 default.pa
文件(它从 /etc/pulse/default.pa
加载默认配置并覆盖此文件中指定的行
~/.config/pulse/default.pa
.include /etc/pulse/default.pa ... set-default-sink alsa_output.pci-0000_04_01.0.analog-stereo ...
完成后,您可以注销/登录或手动重启 PulseAudio,以使这些更改生效。
- 接收器的编号不能保证是持久的,因此
default.pa
文件中的所有接收器都应按名称标识。 - 为了在运行时快速识别(例如,管理声音音量),您可以使用接收器索引而不是接收器名称
$ pactl set-sink-volume 0 +3% $ pactl set-sink-volume 0 -3% $ pactl set-sink-mute 0 toggle
- 为了避免不必要地覆盖 100% 的正常音量,最好使用替代实用程序来管理声音。请参阅论坛帖子以获取更多信息。
@DEFAULT_SINK@
,例如:$ pactl set-sink-volume @DEFAULT_SINK@ +5%
。设置默认输出接收器配置文件
有时 PulseAudio 会忽略在启动时加载所需的配置文件(例如,用于具有#同一声卡上的独立模拟和数字输出的配置文件)。要更改默认配置文件,请将以下内容附加到 default.pa
/etc/pulse/default.pa
... set-card-profile <symbolic-name> <profilename>
您也可以使用 <cardindex>
而不是 <symbolic-name>
,但使用 <symbolic-name>
可以确保引用正确的设备。 <cardindex>
是动态的,并且在新设备插入时会发生变化。
通过运行 pacmd list-cards
查找 <symbolic-name>
$ pacmd list-cards 3 card(s) available. index: 0 name: <alsa_card.pci-0000_01_00.1> driver: <module-alsa-card.c> owner module: 6 (...) index: 1 name: <alsa_card.usb-Sony_Interactive_Entertainment_Wireless_Controller-00> driver: <module-alsa-card.c> owner module: 7 (...) index: 2 name: <alsa_card.pci-0000_00_14.2> driver: <module-alsa-card.c> owner module: 8 (...)
在本例中,我想使用索引号为 2 的设备,因此 <symbolic-name>
应为 alsa_card.pci-0000_00_14.2
。
要查找 <profilename>
,请手动设置所需的配置文件,然后运行 pacmd list-cards
$ pacmd list-cards | grep 'active profile' active profile: <off> active profile: <off> active profile: <output:analog-stereo+output:iec958-stereo+input:analog-stereo>
在本例中,default.pa
现在应更改为以下内容
/etc/pulse/default.pa
... set-card-profile alsa_card.pci-0000_00_14.2 output:analog-stereo+output:iec958-stereo+input:analog-stereo
您可以通过运行 pactl set-card-profile <symbolic-name> <profilename>
来测试您的配置。
同一声卡上的独立模拟和数字输出
声卡可能同时具有模拟和数字 (iec958) 输出。PulseAudio 默认不生成组合配置文件,您可以选择数字或模拟配置文件。
使两个输出都可用的最简单方法是将组合配置文件添加到默认配置文件配置文件的末尾
/usr/share/pulseaudio/alsa-mixer/profile-sets/default.conf
... # Profile must be a '+' separated list of relevant mappings configured above [Profile output:analog-stereo+output:iec958-stereo+input:analog-stereo] # Human readable description description = Analog and digital stereo output and analog stereo intput output-mappings = analog-stereo iec958-stereo input-mappings = analog-stereo
这样,定义的配置文件将被添加到可用配置文件列表的末尾。
虽然这可行,但 PulseAudio 有回退到自动生成的配置文件的坏习惯,因此您最终可能需要将您的声卡设置回组合配置文件。克服这一点的最佳方法是编写禁用 auto-profiles
的自定义配置。将 default.conf
复制到 custom-profile.conf
,并对其进行编辑以满足您的需求(此示例适用于立体声输出/输入)
/usr/share/pulseaudio/alsa-mixer/profile-sets/custom-profile.conf
[General] auto-profiles = no # disable profile auto-generation # Leave only relevant mappings: [Mapping analog-stereo] device-strings = front:%f channel-map = left,right paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2 paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headphone-mic analog-input-headset-mic priority = 15 [Mapping iec958-stereo] device-strings = iec958:%f channel-map = left,right paths-input = iec958-stereo-input paths-output = iec958-stereo-output priority = 5 [Profile output:analog-stereo+output:iec958-stereo+input:analog-stereo] description = Analog and digital stereo output and analog stereo intput output-mappings = analog-stereo iec958-stereo input-mappings = analog-stereo skip-probe=yes # since you know what your sound card has, there is no need for checking which sinks are available
现在您有了自定义配置文件,您需要告诉 PulseAudio 使用它。这可以通过定义一个 udev 规则来完成
首先获取有关您的声卡的相关信息
$ pactl list cards Card #0 Name: alsa_card.pci-0000_00_1b.0 --- snip ---- Properties: --- snip --- device.vendor.id = "8086" # This is a 'vendor' attribute for udev rule device.product.id = "1c20" # This is a 'device' attribute for udev rule
现在创建一个配置文件
/usr/lib/udev/rules.d/91-pulseaudio-custom.rules
SUBSYSTEM!="sound", GOTO="pulseaudio_end" ACTION!="change", GOTO="pulseaudio_end" KERNEL!="card*", GOTO="pulseaudio_end" SUBSYSTEMS=="pci", ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1c20", ENV{PULSE_PROFILE_SET}="custom-profile.conf" LABEL="pulseaudio_end"
现在告诉 udev 重新加载声音子系统 udevadm trigger -ssound
(以 root 用户身份)并重启 PulseAudio。您的声卡现在应该只使用定义的配置文件,并且同时具有模拟和数字输出可用。
同时 HDMI 和模拟输出
PulseAudio 允许同时输出到多个源。在本例中,某些应用程序配置为使用 HDMI,而另一些应用程序配置为使用模拟。多个应用程序能够同时接收音频。(aplay 来自 alsa-utils 软件包。)
$ aplay -l
**** List of PLAYBACK Hardware Devices **** card 0: Intel [HDA Intel], device 0: ALC889A Analog [ALC889A Analog] Subdevices: 0/1 Subdevice #0: subdevice #0 card 0: Intel [HDA Intel], device 1: ALC889A Digital [ALC889A Digital] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: Intel [HDA Intel], device 3: HDMI 0 [HDMI 0] Subdevices: 0/1 Subdevice #0: subdevice #0
或使用 pacmd 命令
$ pacmd list-sinks | grep -e 'name:' -e 'alsa.card ' -e 'alsa.device '
name: <alsa_output.pci-0000_00_1b.0.analog-stereo> alsa.device = "0" alsa.card = "0"
这种配置的关键在于理解在 pavucontrol 中配置 > 内部音频下选择的内容是默认设备。加载 pavucontrol > 配置 并选择 HDMI 作为配置文件。
要将模拟设备设置为辅助源,请将以下内容添加到 /etc/pulse/default.pa
配置的开头,在加载任何其他模块之前
### Load analog device load-module module-alsa-sink device=hw:card,device load-module module-combine-sink sink_name=combined set-default-sink combined
重启 PulseAudio,运行 pavucontrol 并选择“输出设备”选项卡。应显示三个设置
- 内置音频数字立体声 (HDMI)
- 内置音频
- 同时输出到内置音频数字立体声 (HDMI)、内置音频
现在启动一个将使用 PulseAudio 的程序,例如 MPlayer、VLC、mpd 等,并切换到“播放”选项卡。运行程序应该有一个下拉列表可用于选择三个源之一。
另请参阅 此帖子 以获取此主题的变体和 PulseAudio FAQ。
使用带延迟补偿的 module-loopback 的替代解决方案
如果以上示例不适合您,例如由于回声/延迟,您可以尝试以下配置。
在本例中,当使用 module-combine-sink 时,HDMI 音频比模拟音频延迟 65 毫秒。
/etc/pulse/default.pa
[...] load-module module-alsa-sink device=hw:0,0 sink_name=analog sink_properties=device.description=analog load-module module-alsa-sink device=hw:0,1 sink_name=digital sink_properties=device.description=digital load-module module-alsa-sink device=hw:0,3 sink_name=hdmi sink_properties=device.description=hdmi load-module module-loopback sink=analog latency_msec=65 [...] set-default-sink hdmi
HDMI 输出配置
正如 https://download.nvidia.com/XFree86/gpu-hdmi-audio-document/index.html#_issues_in_pulseaudio 中所述,除非 HDMI 端口是第一个输出端口,否则在使用某些支持 HDMI 音频的显卡时,PulseAudio 将无法输出任何音频。这是因为 PulseAudio 中的一个 bug,它只会选择设备上的第一个 HDMI 输出。一个稍后发布的解决方法是首先使用 ALSA 中的 aplay
实用程序(在 alsa-utils 中)找到哪个 HDMI 输出正在工作。
本节的原始标题表明该问题特定于 nVidia 显卡。正如在 此论坛帖子 中看到的,其他显卡也受到影响。本节的其余部分将使用 nVidia 显卡作为案例研究,但该解决方案应适用于使用其他受影响显卡的用户。
查找 HDMI 输出
然后通过列出可用的声卡来找到正在工作的输出
# aplay -l
**** List of PLAYBACK Hardware Devices **** card 0: NVidia [HDA NVidia], device 0: ALC1200 Analog [ALC1200 Analog] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: NVidia [HDA NVidia], device 3: ALC1200 Digital [ALC1200 Digital] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: NVidia_1 [HDA NVidia], device 3: HDMI 0 [HDMI 0] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: NVidia_1 [HDA NVidia], device 7: HDMI 0 [HDMI 0] Subdevices: 0/1 Subdevice #0: subdevice #0 card 1: NVidia_1 [HDA NVidia], device 8: HDMI 0 [HDMI 0] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: NVidia_1 [HDA NVidia], device 9: HDMI 0 [HDMI 0] Subdevices: 1/1 Subdevice #0: subdevice #0
如果您的 HDMI 端口连接到 NVIDIA 显卡,但 aplay
未检测到 NVIDIA 音频卡,请按照 NVIDIA/故障排除#HDMI 没有音频 进行操作。
测试正确的声卡
现在我们有了一个检测到的声卡和设备的列表,用户需要测试哪个输出到电视/显示器;例如,要测试上面列表中的声卡 1,设备 3
# aplay -D plughw:1,3 /usr/share/sounds/alsa/Front_Right.wav
如果没有音频,请尝试替换不同的声卡和/或设备号(在我的声卡上,我必须使用声卡 1 设备 7)
手动配置 PulseAudio 以检测 Nvidia HDMI
在确定哪个 HDMI 设备正在工作后,可以通过编辑 /etc/pulse/default.pa
来强制 PulseAudio 使用它
# load-module module-alsa-sink device=hw:1,7
其中 1 是声卡,7 是在上节中发现可以工作的设备。将其放置在文件的底部,以便其他 sink 仍然可以自动检测到。
重启 PulseAudio
$ pulseaudio -k $ pulseaudio --start
打开声音设置管理器,确保在硬件选项卡下,显卡的 HDMI 音频设置为“数字立体声(HDMI)输出”(我的显卡音频被称为“GF100 High Definition Audio Controller”)。
然后,打开输出选项卡。现在应该有显卡的两个 HDMI 输出。通过选择其中一个并使用程序播放音频来测试哪个有效。例如,使用 VLC 播放电影,如果不起作用,则选择另一个。
自动切换音频到 HDMI
创建一个脚本,以便在插入 HDMI 电缆时切换到所需的音频配置文件
/usr/local/bin/hdmi_sound_toggle.sh
#!/bin/bash export PATH=/usr/bin USER_NAME=$(who | awk -v vt=tty$(fgconsole) '$0 ~ vt {print $1}') USER_ID=$(id -u "$USER_NAME") CARD_PATH="/sys/class/drm/card0/" AUDIO_OUTPUT="analog-surround-40" PULSE_SERVER="unix:/run/user/"$USER_ID"/pulse/native" for OUTPUT in $(cd "$CARD_PATH" && echo card*); do OUT_STATUS=$(<"$CARD_PATH"/"$OUTPUT"/status) if [[ $OUT_STATUS == connected ]] then echo $OUTPUT connected case "$OUTPUT" in "card0-HDMI-A-1") AUDIO_OUTPUT="hdmi-stereo" # Digital Stereo (HDMI 1) ;; "card0-HDMI-A-2") AUDIO_OUTPUT="hdmi-stereo-extra1" # Digital Stereo (HDMI 2) ;; esac fi done echo selecting output $AUDIO_OUTPUT sudo -u "$USER_NAME" pactl --server "$PULSE_SERVER" set-card-profile 0 output:$AUDIO_OUTPUT+input:analog-stereo
使脚本成为可执行文件。
创建一个 udev 规则,以便在 HDMI 状态更改时运行此脚本
/etc/udev/rules.d/99-hdmi_sound.rules
KERNEL=="card0", SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/bin/hdmi_sound_toggle.sh"
为了使更改生效,请不要忘记重新加载 udev 规则
udevadm control --reload-rules
可能需要重启。
udevadm monitor
并尝试连接或断开 HDMI 电缆来检查这一点。如果此命令未显示任何事件,请为 nvidia_drm
模块添加 fbdev=0
内核模块参数。环绕声系统
许多人都有环绕声卡,但只有用于两个声道的扬声器,因此 PulseAudio 实际上无法默认设置为环绕声设置。要启用所有声道,请编辑 /etc/pulse/daemon.conf
:取消注释 default-sample-channels 行(即删除行首的分号),并将值设置为 6。对于 5.1 设置,或 8 对于 7.1 设置等。
# Default default-sample-channels=2 # For 5.1 default-sample-channels=6 # For 7.1 default-sample-channels=8
如果您的声道未正确映射,或者各个声道的音量控制在 pavucontrol 中无法按预期工作,并且您有 HDMI 和模拟声卡,请尝试将以下行添加到 /etc/pulse/default.pa
load-module module-combine channels=6 channel_map=front-left,front-right,rear-left,rear-right,front-center,lfe
请注意,此示例适用于 5.1 设置。
完成编辑后,重启 PulseAudio。
禁用 UCM/"HiFi"
大多数关于使环绕声在 PulseAudio 中工作的指南都会告诉您,您需要为您的声卡/HDMI 输出选择正确的环绕声配置文件,您可以使用 pavucontrol 中的“配置”选项卡来完成此操作。但是,您可能会发现您的声卡的唯一配置文件是“HiFi: Play HiFi quality Music”,这不是环绕声配置文件。然后,您可能会浪费太多时间尝试为您的声卡创建配置文件,或正确设置 udev 规则,但这两种方法都不会起作用。
这里实际发生的情况是您安装了 alsa-ucm-conf,因此 PulseAudio 正在忽略其自身的配置文件,并尝试使用 ALSA Use Case Manager 配置文件。不幸的是,如果 ALSA UCM 没有适用于您的声卡的有用配置文件,您将只能使用默认的 2 声道“HiFi”。幸运的是,您可以通过切换回 PulseAudio 配置文件来解决此问题,对于支持环绕声的声卡/HDMI 输出,PulseAudio 配置文件默认设置为环绕声配置。
最简单的方法是 编辑 /etc/pulse/default.pa
如下
load-module module-udev-detect use_ucm=0
然后 重新加载 pulseaudio.service
用户单元。
您的 PulseAudio 安装将忽略 UCM 并使用 PulseAudio 配置文件,如果您已按照上述说明更改了 default-sample-channels,则这些配置文件将包含一个环绕声配置文件,您可以使用该配置文件输出环绕声。您可以通过检查 pavucontrol 中的配置选项卡来验证,您应该不再看到“HiFi”。
分离前/后输出
将扬声器连接到前模拟输出,将耳机连接到后输出。将前/后输出拆分为单独的 sink 会很有用。添加到 /etc/pulse/default.pa
load-module module-remap-sink sink_name=speakers sink_properties="device.description='Speakers'" remix=no master=alsa_output.pci-0000_05_00.0.analog-surround-40 channels=2 master_channel_map=front-left,front-right channel_map=front-left,front-right load-module module-remap-sink sink_name=headphones sink_properties="device.description='Headphones'" remix=no master=alsa_output.pci-0000_05_00.0.analog-surround-40 channels=2 master_channel_map=rear-left,rear-right channel_map=front-left,front-right
确保将 alsa_output.pci-0000_05_00.0.analog-surround-40 替换为“pacmd list-sinks”中显示的声卡名称。现在您有了 2 个可以单独使用的附加 sink。您可以自由选择“sink_name”,只要没有同名的 sink 即可。“remix”参数控制是否应将音频向下/向上混合以匹配 sink 中的声道。
master sink not found
,请注释掉重新映射行,启动 PulseAudio 并验证您的声卡输出是否设置为您指定的输出(例如 analog surround 4.0)。或者,尝试使用 sink 索引 而不是 sink 名称。将 7.1 分离为 5.1+2.0
与上面的示例类似,您还可以将 7.1 配置拆分为 5.1 环绕声和立体声输出设备。将您的声卡设置为 7.1 模式,然后将以下行添加到 /etc/pulse/default.pa
load-module module-remap-sink sink_name=Surround sink_properties="device.description='Surround'" remix=no master=alsa_output.pci-0000_00_14.2.analog-surround-71 channels=6 master_channel_map=front-left,front-right,rear-left,rear-right,front-center,lfe channel_map=front-left,front-right,rear-left,rear-right,front-center,lfe load-module module-remap-sink sink_name=Stereo sink_properties="device.description='Stereo'" remix=no master=alsa_output.pci-0000_00_14.2.analog-surround-71 channels=2 master_channel_map=side-left,side-right channel_map=front-left,front-right
确保将 alsa_output.pci-0000_00_14.2 替换为您的声卡名称,通过运行“pacmd list-sinks”获取它。此配置将使用前/后/中置+低音炮(绿色/黑色/橙色)插孔用于 5.1 sink,侧面(灰色)插孔用于立体声 sink。它还将任何音频向下混合为立体声用于立体声 sink,但不会触及 5.1 输出。
master sink not found
,请注释掉重新映射行,启动 PulseAudio 并验证您的声卡输出是否设置为 analog surround 7.1。或者,尝试使用 sink 索引 而不是 sink 名称。禁用 LFE 混音
默认情况下,PulseAudio 会将声道数混音到 default-sample-channels,并且自版本 7 以来,它还会混音 LFE 声道。如果您希望禁用 LFE 混音,请取消注释该行
; enable-lfe-remixing = yes
并将 yes 替换为 no
enable-lfe-remixing = no
然后重启 Pulseaudio。
双耳耳机
ladspa-bs2bAUR 提供了一个插件,用于在立体声耳机上模拟环绕声。要使用它,请使用以下命令查找您的耳机
$ pacmd list-sinks | grep -e 'name:'
name: <alsa_output.pci-0000_00_1b.0.iec958-ac3-surround-51> name: <alsa_output.pci-0000_00_1b.0.iec958-ac3-surround-51.equalizer> name: <bluez_sink.00_1F_82_28_93_51>
加载插件(new sink_name 由您决定,master=耳机的 sink 名称)
pacmd load-module module-ladspa-sink sink_name=binaural master=bluez_sink.00_1F_82_28_93_51 plugin=bs2b label=bs2b control=700,4.5
使用 pavucontrol 将音频流传输到新的 sink,或
pactl move-sink-input $INPUTID $BINAURALSINKNAME
PulseAudio 通过网络
PulseAudio 的独特功能之一是其能够通过 TCP 将客户端的音频流可靠地传输到运行 PulseAudio 守护程序的服务器,这在局域网内是可靠的。确保客户端和服务器系统在时间上达成一致(即,使用 NTP),否则音频流可能会断断续续或根本无法工作。有关更详细的指南,请访问 官方 PulseAudio 文档
在服务器(实际输出声音的计算机)上启用 TCP 模块,编辑 /etc/pulse/default.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 文件。
如果不想从客户端复制 cookie 文件,匿名客户端可以通过在服务器上将 auth-anonymous
传递给 module-native-protocol-tcp
(再次在 /etc/pulse/default.pa
中)来访问服务器
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
更改 LAN IP 子网以匹配您希望访问服务器的客户端的子网。
选择服务器
对于单个 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
default-server = server_hostname_or_ip
使用 Zeroconf 选择服务器
为了使远程 PulseAudio 服务器出现在 PulseAudio 设备选择器 (pasystray
) 中,请加载适当的 zeroconf 模块,并启用 Avahi 守护程序。在客户端和服务器这两台机器上,安装 pulseaudio-zeroconf 软件包。之后 启动/启用 avahi-daemon.service
。
在服务器上,将 load-module module-zeroconf-publish
添加到 /etc/pulse/default.pa
。在客户端上,将 load-module module-zeroconf-discover
添加到 /etc/pulse/default.pa
。现在,通过选择适当的 sink 将任何音频流或完整的音频输出重定向到远程 PulseAudio 服务器。
如果您在客户端上远程同步出现问题,请尝试在服务器上重启 Avahi 守护程序以重新广播可用的接口。
运行图形化的 PulseAudio 音量控制 pavucontrol
。在输出设备选项卡下,您应该看到本地和远程输出设备。在播放选项卡下,“X”静音音频按钮的左侧,您应该看到一个包含输出设备名称的框。该框实际上是一个按钮,它将显示可用输出设备的下拉单选按钮列表,其中选择了一个输出设备。从列表中选择一个输出设备将允许音频流切换到与该输出设备关联的 PulseAudio 服务器。在您使用它之前,此控件一点也不明显,并且对于远程 Headless 声音服务器特别有用。
类似地,在输入设备选项卡下,将看到本地和远程输入设备。在录制选项卡下,在“X”静音音频按钮的左侧,将有一个框,其中包含输入设备的名称,该框实际上是一个按钮,它将显示可用输入设备的下拉单选按钮列表。
在与要定向的音频流关联的本地或远程主机上运行 pavucontrol
。例如,在远程主机上运行 pavucontrol
以将远程音频输出定向到本地主机。在本地主机上运行 pavucontrol
以将本地音频输出定向到某个远程主机。
设置同步输入或输出是另一回事。搜索关于“monitor”和“module-combine-sink”的内容。
切换本地 X 客户端使用的 PulseAudio 服务器
要在客户端上从 X 内切换服务器,可以使用 pax11publish
命令。例如,要从默认服务器切换到主机名为 foo 的服务器
$ pax11publish -e -S foo
或切换回默认服务器
$ pax11publish -e -r
与告诉 PulseAudio 服务器流式传输音频(如上所述)不同,这将编辑 X11 根窗口上的 PulseAudio 变量,这将指示 PulseAudio 客户端库连接到 localhost
以外的 PulseAudio 服务器。因此,程序将不再与本地 pulseaudio
进程交互,然后可以停止它。 诸如 pactl
、pacmd
或 pavucontrol
之类的程序也需要使用适当的 PULSE_SERVER
环境/X 变量运行,以控制远程 PulseAudio 服务器。
请注意,要使此切换生效,必须重启使用 Pulse 的程序,或者重新初始化它们的 PulseAudio 客户端库(完全停止并重启播放可能就足够了)。要使此设置永久生效,请编辑 ~/.config/pulse/client.conf
或 /etc/pulse/client.conf
中的 default-server
。
使用 RTP/UDP 而不是 native-protocol-tcp
尝试通过 TCP 实时发送数据存在严重问题,尤其是在像 Wi-Fi 这样容易丢包的连接上。这就是为什么发明了 基于 UDP 的 RTP。它可以用来提高可靠性并减少延迟。
当 RTP 工作正常时,延迟或丢弃的数据包只会产生几毫秒的静音,而不是 TCP 协调数据包重发时漫长的停顿。另外一个好处是,如果远程服务器重启,连接将自动重新建立。但是,将不再有办法远程控制服务器的主音量,每个客户端机器将拥有自己独立的主音量。
要使用 RTP 而不是 native-protocol-tcp
,pulseaudio 客户端必须首先连接到本地 pulseaudio 服务器。然后,此本地服务器通过 RTP 连接到远程 pulseaudio 服务器。
要在 pulseaudio 中使用 RTP,请在远程和本地服务器上安装 pulseaudio-rtp。
要配置远程 pulseaudio 服务器,请将以下内容添加到 /etc/pulse/default.pa
(或者如果以 --system
模式运行 pulseaudio,则添加到 /etc/pulse/system.pa
)
load-module module-rtp-recv latency_msec=10 sap_address=0.0.0.0
sap_address=0.0.0.0
非常重要,可以防止 pulseaudio 尝试使用多播,而多播 在 Wi-Fi 上根本无法工作。使用 latency_msec
来调整远程端的接收缓冲区大小。如果您发现音频断断续续,请尝试增加此数字。如果您更关心延迟,请尝试减少它。重启远程服务器以使更改生效。
要配置本地 pulseaudio 服务器,请将以下内容添加到 /etc/pulse/default.pa
load-module module-null-sink sink_name=rtp sink_properties="device.description='RTP'" load-module module-rtp-send source=rtp.monitor destination_ip=<remote host>
<remote host>
是远程 pulseaudio 服务器的主机名。
重启本地服务器后,pavucontrol 中将出现一个标记为“RTP”的新输出设备。要将特定客户端的输出路由到它,请在“播放”选项卡下找到该客户端,然后将客户端从其当前的输出设备(例如“内置音频模拟立体声”)更改为“RTP”。要为所有客户端默认使用 RTP 输出设备,请将其添加到 /etc/pulse/default.pa
,然后重启本地 pulseaudio 服务器
set-default-sink rtp
启用自动发现 AirPlay (raop) 服务器支持
要自动发现和使用 AirPlay 服务器,请确保已安装 pulseaudio-zeroconf 和 Avahi 正在运行(这是为了自动检测本身)。同时安装 pulseaudio-rtp(用于 raop 协议)。然后,将以下内容添加到 /etc/pulse/default.pa
load-module module-raop-discover
重启 pulseaudio.service
,设备应自动出现在输出设备列表中。
此示例取自 julianxhokaxhiu 的 gist。
ALSA 监听源
要能够从监听源(又名“What-U-Hear”、“立体声混音”)录音,请使用 pactl list
找出 PulseAudio 中源的名称(例如 alsa_output.pci-0000_00_1b.0.analog-stereo.monitor
)。然后将如下行添加到 /etc/asound.conf
或 ~/.asoundrc
pcm.pulse_monitor { type pulse device alsa_output.pci-0000_00_1b.0.analog-stereo.monitor } ctl.pulse_monitor { type pulse device alsa_output.pci-0000_00_1b.0.analog-stereo.monitor }
现在您可以选择 pulse_monitor
作为录音源。
或者,您可以使用 pavucontrol 来完成此操作:确保您已将显示设置为“所有输入设备”,然后选择“Monitor of [您的声卡]”作为录音源。
监听特定输出
可以监听特定输出,例如将音乐播放器中的音频流传输到 VOIP 应用程序。只需创建一个空输出设备
pactl load-module module-null-sink sink_name=<name> sink_properties=device.description=<description>
在 PulseAudio 音量控制 (pavucontrol) 中,在“播放”选项卡下,将应用程序的输出更改为 <name>,并在录制选项卡中将应用程序的输入更改为“Monitor of <name>”。音频现在将从一个应用程序输出到另一个应用程序。
通过 JACK 使用 PulseAudio
JACK 音频连接套件 在音频工作中很受欢迎,并受到 Linux 音频应用程序的广泛支持。它与 PulseAudio 具有相似的定位,但更侧重于专业的音频工作。它可以提供更低延迟的音频监听,以及对多输入/输出声卡设备的输入和输出的更好控制。
KXStudio 方法
此配置需要 jack2 软件包。
JACK 现在具有用于在 ALSA、PulseAudio 和 JACK 之间桥接的本机功能。这将允许您同时运行 JACK 和 PulseAudio,并且两者同时输出,而无需编辑配置或使用终端命令。
如果您安装了 qjackctl,请确保它没有运行(它可能在系统托盘中最小化运行)。还要确保没有 jackd
进程正在运行(在终端中使用 ps xw
检查)。
安装 cadenceAUR,以及 pulseaudio-jack。安装并启动后,JACK 桥接配置位于窗口的右下角。ALSA 音频桥应设置为 ALSA -> PulseAudio -> JACK,并且应启用 PulseAudio 桥。确保在 pavucontrol
中,除了 Jack sink 之外的所有输出设备都被静音,并且除了 Jack input 之外的所有输入设备都被静音。使用“强制重启”按钮启动 JACK,如果它成功启动,PulseAudio 程序应该开始输出到 JACK。
手动输出设备配置方法
此配置提供了一种允许 JACK 和 PulseAudio 同时运行并相互输出的方法。它使用手动配置系统,在 JACK 和 PulseAudio 之间架起桥梁。此配置不依赖于脚本或命令,完全基于配置。
此配置仅适用于 jack2。要使用此配置,只需安装 pulseaudio-jack 软件包。如果 pulseaudio-jack 中的模块存在,则 /etc/pulse/default.pa
已配置为加载这些模块。如果您想确保,请打开该文件并查找以下行
load-module module-jackdbus-detect options
其中 options
可以是此模块支持的任何选项,通常为 channels=2
。
如 Jack-DBUS Packaging 页面上所述
服务器自动启动实现为 D-Bus 调用,该调用自动激活 JACK D-Bus 服务(如果尚未启动),并启动 JACK 服务器。与 PulseAudio 的正确交互是使用基于 D-Bus 的声卡“获取/释放”机制完成的。当 JACK 服务器启动时,它会请求此 D-Bus 服务获取声卡,而 PulseAudio 将无条件释放它。当 JACK 服务器停止时,它会释放声卡,PulseAudio 可以再次抓取它。
module-jackdbus-detect.so
在 jackdbus 启动和停止时动态加载和卸载 module-jack-sink 和 module-jack-source。
如果 PulseAudio 声音不起作用,请使用 pavucontrol
检查相关程序是否出现在播放选项卡中。如果不是,请将以下内容添加到 ~/.asoundrc
或 /etc/asound.conf
以将 ALSA 重定向到 PulseAudio
pcm.pulse { type pulse } ctl.pulse { type pulse } pcm.!default { type pulse } ctl.!default { type pulse }
如果仍然不起作用,请使用 pavucontrol
在播放选项卡中检查,并确保相关程序输出到 PulseAudio JACK Sink 而不是您的声卡(JACK 已控制声卡,因此它将不起作用)。还要确保在 JACK 图中,PulseAudio JACK Source 已连接到系统音频输出。
Shell 脚本方法
此方法允许 JACK 和 PulseAudio 同时输出。它主要依赖于 QJackCTL 自动运行的 shell 脚本来管理 JACK 输出设备和 PulseAudio 的行为方式的各个方面。
基本思想是杀死 PulseAudio 是一个坏主意,因为它可能会导致任何使用 PulseAudio 的应用程序崩溃,并中断任何正在播放的音频。
此设置的工作流程
- PulseAudio 释放声卡
- JACK 抓取声卡并启动
- 脚本将 PulseAudio 重定向到 JACK
- 手动将 PulseAudio 应用程序发送到 JACK 输出(pavucontrol 可能对此有帮助)
- 使用 JACK 程序等
- 通过脚本,停止将 PulseAudio 重定向到 JACK
- 停止 JACK 并释放声卡
- PulseAudio 抓取声卡并将音频重新路由到它
使用 QJackCTL,设置这些脚本
pulse-jack-pre-start.sh
将其设置为启动时执行脚本
#!/bin/bash pacmd suspend true
pulse-jack-post-start.sh
将此脚本设置为启动后执行脚本
#!/bin/bash pactl load-module module-jack-sink channels=2 pactl load-module module-jack-source channels=2 pacmd set-default-sink jack_out pacmd set-default-source jack_in
pulse-jack-pre-stop.sh
“关闭时执行脚本”
#!/bin/bash SINKID=$(LANG=C.UTF-8 pactl list | grep -B 1 "Name: module-jack-sink" | grep Module | sed 's/[^0-9]//g') SOURCEID=$(LANG=C.UTF-8 pactl list | grep -B 1 "Name: module-jack-source" | grep Module | sed 's/[^0-9]//g') pactl unload-module $SINKID pactl unload-module $SOURCEID sleep 5
pulse-jack-post-stop.sh
“关闭后执行脚本”
#!/bin/bash pacmd suspend false
PulseAudio 杀死方法
此方法依赖于 shell 脚本,以便在 JACK 启动时自动杀死 PulseAudio,并在 JACK 停止时自动重启它。与同时运行两者相比,这将导致更低的 CPU 使用率,但可能会导致已运行的 PulseAudio 应用程序出现错误,并且不允许同时输出两者。
使用上面列出的设置,使用 QjackCtl 在启动和关闭时执行脚本以加载/卸载 PulseAudio。用户可能希望这样做部分原因是上述更改禁用了 PulseAudio 的自动硬件检测模块。此特定设置用于以独占方式将 PulseAudio 与 JACK 一起使用,尽管可以修改脚本以卸载和加载备用的非 JACK 设置,但在程序可能正在使用 PulseAudio 时杀死和启动 PulseAudio 将变得有问题。
以下示例可以用作启动脚本,并根据需要进行修改,该脚本将 PulseAudio 守护进程化并加载 padevchooser 程序(可选,需要从 AUR 构建),命名为 jack_startup
#!/bin/bash #Load PulseAudio and PulseAudio Device Chooser pulseaudio -D padevchooser&
以及一个关闭脚本,用于杀死 PulseAudio 和 Pulse Audio Device Chooser,作为另一个示例,命名为 jack_shutdown
,也位于主目录中
#!/bin/bash #Kill PulseAudio and PulseAudio Device Chooser pulseaudio --kill killall padevchooser
两个脚本都需要设置为 可执行。
然后在加载 QjackCtl 后,单击设置按钮,然后单击选项选项卡,并勾选“启动后执行脚本:”和“关闭时执行脚本:”,然后使用 ... 按钮或键入脚本的路径(假设脚本位于主目录中) ~/jack_startup
和 ~/jack_shutdown
,确保保存更改。
故障排除
当 JACK 启动时,Firefox、Chrome 和其他应用程序停止播放视频和音频
Firefox/Chrome/etc. 正在使用 PulseAudio 声卡输出设备而不是 JACK 输出设备。打开 pavucontrol
,在播放选项卡上,将所有音频流从类似“内置音频模拟立体声”切换到类似“Jack sink (PulseAudio JACK Sink)”。
启动 JACK 后,来自 PulseAudio 的声音变得失真
在 QjackCtl 中,单击设置,然后在设置选项卡上的参数子选项卡中,取消选中“实时”。此外,调整采样率、帧/周期和周期/缓冲区可能有所帮助。在右下角查找延迟,因为您仍然希望音频制作的延迟最小。另外,我认为采样率应该与您的音频接口支持的速率之一相匹配(cat /proc/asound/cardN/codec\#M
并查找 rates
,可能会有多个匹配项)。
通过 OSS 使用 PulseAudio
将以下内容添加到 /etc/pulse/default.pa
load-module module-oss
然后像往常一样启动 PulseAudio,确保为 OSS 设备定义了输出设备和输入设备。
从 chroot 环境中运行 PulseAudio
由于 chroot 为应用程序的运行/隔离设置了备用根目录,因此必须在 chroot 环境本身中 安装 PulseAudio。
PulseAudio 客户端如果没有设置为连接到任何特定服务器(如 #PulseAudio 通过网络 中所述),将尝试连接到本地 PulseAudio 服务器,如果失败,它将生成一个新的服务器。每个服务器都有一个基于 /var/lib/dbus
中的 machine-id 值的唯一 ID。为了允许 chroot 环境中的应用程序访问 Pulse 服务器,必须在 chroot 环境中挂载以下目录
/run /var/lib/dbus /tmp ~/.config/pulse
为了提高效率和性能,还应挂载 /dev/shm
。请注意,挂载 /home
通常也允许共享 ~/.pulse
目录。
PulseAudio 通过 XDG_RUNTIME_DIR
选择套接字的路径,因此当您使用 sudo 以普通用户身份进行 chroot 时,请务必将其拖过来(请参阅 Sudo#环境变量)。
重新映射输出设备
module-remap-sink 模块创建一个虚拟输出设备,该虚拟输出设备被标识为唯一的输出设备,但通过虚拟流连接到主输出设备。这样做,它能够重新映射主输出设备的通道如何用于播放。
重新映射选定的音频源
当然,虚拟声卡有其自身的监听器,该监听器可以用作仅捕获使用虚拟声卡的应用程序的源。sink_name 可以通过查看 pacmd list-sinks
中的 name 字段来确定。与其他模块一样,它可以从 /etc/pulse/default.pa
或使用 pacmd
调用。
$ pacmd load-module module-remap-sink sink_name=secondary master=sink_name
例如,要录制程序的输出而不包含任何其他系统声音,您可以
- 运行命令加载模块。
- 使用 pavucontrol,在播放选项卡中,将所需程序的输出设备更改为重新映射。对其音频应包含在内的任何其他程序重复此操作。
- 激活录音程序。
- 在 pavucontrol 中,在录制选项卡中,将录音程序的输入更改为重新映射的监听选项。
将立体声重新映射为单声道
通过创建虚拟声卡将立体声输入声卡重新映射为单声道声卡。如果您只有一个扬声器,这将非常有用。添加到 /etc/pulse/default.pa
load-module module-remap-sink master=alsa_output.pci-0000_00_1f.5.analog-stereo sink_name=mono sink_properties="device.description='Mono'" channels=2 channel_map=mono,mono # Optional: Select new remap as default set-default-sink mono
(在 pacmd list-sinks
显示的声卡名称中替换 alsa_output.pci-0000_00_1f.5.analog-stereo)
在虚拟单声道声卡和真实立体声声卡之间切换播放器。
将左声道或右声道重新映射为单声道
当音频流的左右声道内容不同时,尤其有用,例如带有双语音频的日语电视广播。
# For Japanese bilingual TV load-module module-remap-sink sink_name=Left-to-Mono sink_properties="device.description='Left to Mono (5.1 AC3 on ALC892 Digital)'" master=alsa_output.pci-0000_00_1b.0.iec958-ac3-surround-51 channels=2 master_channel_map=mono,mono channel_map=front-left,rear-left load-module module-remap-sink sink_name=Right-to-Mono sink_properties="device.description='Right to Mono (5.1 AC3 on ALC892 Digital)'" master=alsa_output.pci-0000_00_1b.0.iec958-ac3-surround-51 channels=2 master_channel_map=mono,mono channel_map=front-right,rear-right
将 alsa_output.pci-0000_00_1b.0.iec958-ac3-surround-51
(ALC892 Digital 上的 5.1 AC3)替换为您自己的声卡(pacmd list-sinks
)。
- master_channel_map 是要重新映射到的输出列表。
- channel_map 是要从中重新映射的输入列表。
- 立体声声卡不必指定那么多声道,例如
channels=1 master_channel_map=mono channel_map=right
为广播软件重新映射
如果您不想捕获来自应用程序的声音,则需要创建重新映射声卡
### Create Remap sink load-module module-remap-sink sink_name=Remap_sink master=SINK_NAME channels=2 remix=no set-default-sink Remap_sink
SINK_NAME
替换为实际的主声卡名称 pacmd list-sinks
。然后重启 PulseAudio 守护进程
$ pulseaudio -k $ pulseaudio --start
现在您需要在广播软件中将 Remap_sink
设置为默认声音源
PULSE_SINK=SINK_NAME
。将左(或右)输入重新映射为单声道以用于立体声
有时,传入的音频仅存在于一个声道上(例如,在双声道音频接口上使用单声道 XLR 麦克风,该接口默认配置为立体声输入时)。使用 module-remap-source
,可以将左声道重新映射为单声道源以供进一步使用
load-module module-remap-source master=alsa_input.usb-BEHRINGER_UMC204HD_192k-00.analog-stereo channels=1 master_channel_map=front-left channel_map=mono
- 将
alsa_input.usb-BEHRINGER_UMC204HD_192k-00.analog-stereo
替换为源的实际名称pacmd list-sources
。 - 将
master_channel_map
变量front-left
替换为要用作单声道源的声道。
交换左右声道
这与“反向立体声”相同,即左右声道要交换。
首先,确定您要交换声道的声卡
$ cat /proc/asound/cards
并使用您希望使用的设备的名称字符串(方括号中的那个,例如 [Intel])。
编辑 /etc/pulse/default.pa
并注释掉 module-hal-detect 和 module-detect 行。
搜索以下注释掉的行,取消注释并更改
load-module module-alsa-sink device=hw:device_name channel_map=right,left
重启 pulseaudio 守护进程
$ pulseaudio -k; pulseaudio -D
Pulseaudio 常见问题解答:如何反转我的左右扬声器声道?
使用 default.pa
在 [2] 中提出了另一种交换声道的方法
~/.config/pulse/default.pa
#!/usr/bin/pulseaudio -nF .include /etc/pulse/default.pa load-module module-remap-sink sink_name=reverse-stereo master=0 channels=2 master_channel_map=front-right,front-left channel_map=front-left,front-right set-default-sink reverse-stereo
将源直接管道传输到声卡
有时您希望将输入复制到输出,例如,如果您想在扬声器上播放麦克风以进行故障排除,或者想听到采集卡的采集音频。以下是如何使用 pactl 动态设置它
$ pactl load-module module-loopback source=input_source sink=output_source
此命令将打印模块的 ID,以便您可以稍后像这样停止管道传输
$ pactl unload-module id
如果您丢失了 ID,您可以从 pactl list modules short
中获取它。
从 S/PDIF 捕获数字输入并在(几乎)实时的模拟输出上播放
有时您有一个数字声音源,它输出以 PCM 或 AC3 编码的 S/PDIF 信号(例如智能电视),并且您想使用您的 Linux 盒子作为此信号到模拟可听信号的转换器,您可以在扬声器上播放该信号。挑战在于数字源和模拟输出之间没有可听见的延迟(这可能会导致我们的智能电视示例中音频/视频不同步)。
您可以使用 audio_async_loopback-gitAUR 工具来达到此目的。
用法非常简单。只需将 S/PDIF 电缆连接到声卡数字输入并发出
$ audio_async_loopback $my-digital-input-device $latency-in-microseconds
例如
$ audio_async_loopback alsa_input.pci-0000_04_00.0.iec958-stereo 12500
要找出您的数字设备名称,请使用命令
$ pacmd list-sources |grep 'name:'
通常数字输入包含 iec958 子字符串。如果仍然不确定,请从命令中删除 grep 部分并检查字段
properties: device.description
latency-in-microseconds 是一个反复试验来确定的问题,很大程度上取决于您的硬件速度。您可以尝试省略此参数,让 audio_async_loopback 自动确定延迟。如果您听到咔哒声和噼啪声,请增加该值。如果声音清晰但音频不同步或延迟,请减小该值。您还可以在构建软件包之前在 config.h
中对不同的缓冲区进行微调,但这应该不是必需的。
作者还建议将输入音量设置为 100%(您可以在您喜欢的 pulseaudio 混音器中执行此操作)并将 pulseaudio 设置为以 48kHz 采样率工作,以使此工具正常运行。
要设置采样率,请编辑 /etc/pulse/daemon.conf
并更改行
default-sample-rate = 44100
为
default-sample-rate = 48000
要应用更改,重启 pulseaudio.service
。
PulseAudio 作为 ALSA 的最小无干扰哑管道
有些人出于各种原因不想一直运行 PulseAudio。此示例会将功能齐全的音频服务器变成 ALSA 设备的无干扰哑管道,该管道在完成后自动启动和停止自身,允许需要 PulseAudio 的应用程序完全发挥作用,同时不触及任何 ALSA 设置,也不将自身设置为默认 ALSA 设备。
此配置告诉原生 PA 客户端在需要时自动生成守护进程,然后将守护进程配置为在所有客户端断开连接后立即自动退出。守护进程本身使用简单的静态配置,该配置使用您配置的 pcm.!default
ALSA 设备,仅此而已。不替换 ALSA 的默认设置,不玩混音器级别,除了录制/播放之外什么都没有。还要确保未安装 pulseaudio-alsa,以便标准 ALSA 客户端不会默认使用 pulse。由于 pulseaudio-alsa 仅包含配置文件 /etc/asound.conf
,如果它作为依赖项安装,则可以简单地注释掉 /etc/asound.conf
中的所有内容。alsamixer
以及任何其他 ALSA 客户端都能正常工作。还要确保 Xine、Gstreamer 和 Phonon 等常见框架配置为使用 ALSA:默认情况下,如果它们检测到已安装 PulseAudio,它们会尝试先使用它,然后再使用 ALSA。
/etc/pulse/daemon.conf
# Replace these with the proper values exit-idle-time = 0 # Exit as soon as unneeded flat-volumes = yes # Prevent messing with the master volume
/etc/pulse/client.conf
# Replace these with the proper values # Applications that uses PulseAudio *directly* will spawn it, # use it, and pulse will exit itself when done because of the # exit-idle-time setting in daemon.conf autospawn = yes
/etc/pulse/default.pa
# Replace the *entire* content of this file with these few lines and # read the comments .fail # Set tsched=0 here if you experience glitchy playback. This will # revert back to interrupt-based scheduling and should fix it. # # Replace the device= part if you want pulse to use a specific device # such as "dmix" and "dsnoop" so it doesn't lock an hw: device. # INPUT/RECORD load-module module-alsa-source device="default" tsched=1 # OUTPUT/PLAYBACK load-module module-alsa-sink device="default" tsched=1 # Accept clients -- very important load-module module-native-protocol-unix .nofail .ifexists module-x11-publish.so # Publish to X11 so the clients know how to connect to Pulse. Will # clear itself on unload. load-module module-x11-publish .endif
同时插入扬声器和耳机并在软件中即时切换
按照设计,当插入耳机时,Pulseaudio 会自动关闭线路输出,并改用耳机滑块。您可以在 alsamixer
中观察到此行为。我们想要的是耳机和线路输出滑块同时独立工作。如果您想重新映射 Realtek 的插孔,例如将后绿用于耳机,将蓝用于扬声器(借助 alsa-tools 中的 hdajackretask
),这将非常有用。
为了实现这一点,您应该直接编辑 Pulseaudio 混音器的配置。
1. 我们告诉 pulseaudio 耳机始终已插入。编辑
/usr/share/pulseaudio/alsa-mixer/paths/analog-output-lineout.conf
查找
[Jack Headphone] state.plugged = no state.unplugged = unknown
将 no
更改为 yes
2. 默认情况下,线路输出的音量仅由 Master 控制,而不是由线路输出滑块本身控制。我们希望将线路输出与 Master 合并。
将此代码段添加到文件末尾
[Element Line Out] switch = mute volume = merge
3. 当我们使用耳机时,我们需要完全切断线路输出。编辑
/usr/share/pulseaudio/alsa-mixer/paths/analog-output-headphones.conf
将此代码段添加到文件末尾
[Element Line Out] switch = off volume = off
[Element Front]
而不是 [Element Line Out]
。4. 像 Pulseaudio 一样,当插入耳机时,Alsa 本身也会切断扬声器。打开 alsamixer
(如果是 Realtek HDA,则为 alsamixer -c0
)并将 Auto-Mute mode
更改为 disabled
。
5. 重启 Pulseaudio
$ pulseaudio -k $ pulseaudio --start
现在您在 pulseaudio 的同一声卡上有两个独立的端口。它们相互静音,因此您可以切换到耳机,这将使线路输出静音,反之亦然。要在端口之间切换,您可以使用 Gnome 或 Plasma 声音混音器,或安装相应的桌面扩展。
通常,每个系统用户都运行自己的 PulseAudio 实例,并且该实例只能由运行它的用户访问。这是一种安全措施,可防止其他用户访问潜在的敏感音频通道,例如语音通话。但是,在某些情况下,希望通过以单独用户的身份运行应用程序来隔离应用程序。例如,可能希望以不同的用户身份运行 Web 浏览器,同时仍然能够在使用主用户帐户时收听来自浏览器的音频。另一种用途是在多个系统用户之间共享蓝牙耳机。
这可以通过创建 UNIX 套接字来允许其他用户访问主用户的 PulseAudio 守护进程来实现。通过此设置,主用户帐户运行 PulseAudio 守护进程,其他用户帐户连接到它并共享它。请注意,以下内容假设环境变量 `XDG_CONFIG_HOME` 指向默认位置 `~/.config`。如果不是这种情况,请在下面的示例中将 `~/.config/` 替换为正确的路径。
主用户设置
主用户应将以下指令添加到 /home/<主用户>/.config/pulse/default.pa
以创建 UNIX 套接字并接受来自其他用户的连接
~/.config/pulse/default.pa
load-module module-native-protocol-unix auth-anonymous=1 socket=/tmp/pulse-socket
请注意,这将允许系统上的所有用户访问主用户的 PulseAudio 服务器,从而访问所有音频数据。更安全的解决方案是为共享音频创建自定义用户组,并将套接字限制为该用户组。例如,要仅允许组“sharepulse”中的用户访问套接字,请将该行更改为
~/.config/pulse/default.pa
load-module module-native-protocol-unix auth-group=sharepulse socket=/tmp/pulse-socket
添加该行后,在主用户的帐户上启动 PulseAudio 守护进程。
辅助用户设置
辅助用户应将以下行添加到 /home/<辅助用户>/.config/pulse/client.conf
~/.config/pulse/client.conf
default-server = unix:/tmp/pulse-socket
其中 /tmp/pulse-socket 是在主用户的 default.pa 文件中设置的 UNIX 套接字的路径。如果主用户已将套接字限制为特定的系统组,则必须将辅助用户添加到该组。请注意,如果将已登录用户添加到该组,则在用户注销并重新登录之前,它不会生效。
辅助用户还需要将主用户的 PulseAudio 守护进程 cookie (/home/<主用户>/.config/pulse/cookie
) 复制到其配置目录中的 /home/<辅助用户>/.config/pulse/cookie
。或者,主用户可以将 cookie 复制到预期系统用户可访问的位置(例如 /tmp/sharepulse/pa_cookie),辅助用户可以通过将以下行添加到客户端配置文件来访问它
~/.config/pulse/client.conf
cookie-file = /tmp/sharepulse/pa_cookie
辅助用户现在应该可以完全访问主用户的 PulseAudio 守护进程,并且所有用户都应该可以访问所有音频。要授予更多用户访问权限,只需在每个用户帐户上重复辅助用户的设置即可。
替代设置
如果没有主用户可靠地运行共享的 PulseAudio 守护进程,则组(在本例中为 sharepulse)中的所有用户都可以使用以下脚本来检查共享服务器是否已在运行,如果未运行则启动一个。
pulseaudio-shared
#!/usr/bin/bash set -eu # The group with access to the shared PulseAudio daemon. PA_GROUP=sharepulse # The shared directory. PA_DIR=/tmp/sharepulse # Restrict access to users outside of the group. umask 007 # Create a group-restricted common directory for the socket and cookie if missing. if [[ ! -e $PA_DIR ]] then /usr/bin/mkdir -p -- "$PA_DIR" /usr/bin/chgrp -- "$PA_GROUP" "$PA_DIR" /usr/bin/chmod -- g+s "$PA_DIR" fi function start_daemon() { # Only start the daemon if one is not already running. if [[ ! -e $PA_DIR/socket ]] then echo "Attempting to (re)start the PulseAudio daemon." # Create a new random common cookie. /usr/bin/dd if=/dev/urandom of="$PA_DIR/cookie" bs=256 count=1 # Copy it to the configuration directory of the user running the daemon. /usr/bin/cp -- "$PA_DIR/cookie" "${XDG_CONFIG_HOME:-$HOME/.config}/pulse/cookie" # Start the daemon. /usr/bin/pulseaudio "$@" || true # Kill the daemon if it is not the owner of the socket. if [[ ! -O $PA_DIR/socket ]] then /usr/bin/pulseaudio --check && /usr/bin/pulseaudio -k fi fi } # Restart the daemon when necessary. while true do # Wait for the socket to be deleted when a running daemon is killed. If the # socket does not exist then this will be skipped. inotifywait -e delete_self "$PA_DIR/socket" || true start_daemon done
每个用户都需要将以下行添加到其 PulseAudio 配置文件中,以配置守护进程和客户端以使用共享套接字和 cookie
~/.config/pulse/default.pa
load-module module-native-protocol-unix auth-group=sharepulse socket=/tmp/sharepulse/socket
~/.config/pulse/client.conf
default-server = unix:/tmp/sharepulse/socket cookie-file = /tmp/sharepulse/cookie
pulseaudio-shared 应在每个用户登录时运行(例如,通过他们的 Bash 配置文件或他们的桌面环境的自动启动文件),以便在需要时启动守护进程。传递给脚本的任何参数都将传递给 PulseAudio 守护进程。当任何共享守护进程停止时,pulseaudio-shared 将自动以当前用户身份重新启动,所有其他用户应自动重新连接到新的守护进程。
故障排除
切换 TTY 时没有声音
如果在不同 TTY 或桌面环境(<ctrl>+<alt>+Fx)上的用户之间切换时声音停止,则可能是用户在未选择其 TTY 会话时无权访问声音硬件。可以通过将用户添加到 audio 组来解决此问题:用户和组#Pre-systemd 组
将额外的音频混合到麦克风的音频中
使用空声卡和回环的设置,您可以将任意应用程序的音频输出混合到麦克风的音频中,例如在语音聊天应用程序上播放音效或音乐。
此处建议的设置还会将您的音效播放回给您,并使用 PulseAudio 回声消除来防止效果反馈到您的麦克风中。
使用 pulse-autoconf 进行 PulseAudio 管理
截至 2020 年 8 月,有一个 pulse-autoconfAUR,一个 PulseAudio 服务器动态配置守护进程,它通过其“EchoCancellationWithSourcesMix”预设支持此设置,并且具有更多好处,例如动态响应 PulseAudio 服务器中的更改,例如插入或拔出耳机或网络摄像头时。
如果 pulse-autoconfAUR 不适用于您的用例,请继续阅读手动方法。
PulseAudio 配置
符号:(应用程序)
、{音频源}
、[音频声卡]
、{m} = 音频声卡的监听器
、{}* = 后备(默认)源
、[]* = 后备(默认)声卡
{Microphone} || {src_ec} -----------------> [sink_mix]{m}=={src_main}* -----> (Voice chat) Loopback ^ | | Loopback | | v (Soundboard) ---------> [sink_fx]{m} -----------------------> [sink_main]* Loopback || [Speakers]
- {src_ec}, [sink_main]
- 麦克风和扬声器的回声消除“克隆”
- [sink_fx]
- 音效播放到其中的虚拟声卡
- [sink_mix]
- 麦克风和音效混合在一起的虚拟声卡
- {src_main}
- “sink_mix 的监听器”的重新映射,以解决不允许从监听器源录制的应用程序
应用程序配置
提供音效的应用程序必须
- 输出到“sink_fx”
所有其他应用程序,包括语音聊天,必须
- 从“src_main”录制音频
- 输出到“sink_main”
因此,这些设备将被设置为默认值。控制哪个应用程序使用哪个音频源/声卡通常可以在 pavucontrol
图形 PulseAudio 控制面板中完成。
对于某些应用程序,在 pavucontrol
中更改其源或声卡无效。在这种情况下,您通常可以在应用程序的音频设置中选择源或声卡。
任何应用程序都不得从“真实”麦克风或扬声器录音或输出到“真实”麦克风或扬声器,因为这会绕过回声消除。
语音聊天应用程序提供的任何回声消除或其他音频处理都应禁用 – PulseAudio 已经这样做了,并且由于应用程序不知道扬声器上播放的声音效果,因此它很可能无法有效地从麦克风中过滤掉它们。
设置步骤
- 连接您的麦克风和耳机,并确保 PulseAudio 已正确配置以供使用,例如在
pavucontrol
的“配置”选项卡中 - 仅首次
- 将下面的模板脚本保存为您选择的可执行文件
- 使用
pactl list short sources | grep -v ".monitor"
和pactl list short sinks
分别查找您的麦克风和耳机的名称 - 在脚本中,将“microphone”和“speakers”的值替换为您的麦克风/耳机的名称
- 运行脚本
- 运行您的语音聊天应用程序,并使其从“src_main”录制音频并输出音频到“sink_main”
- 运行您的音效应用程序,并使其播放到“sink_fx”
至于可以播放音效的应用程序,castersoundboard-gitAUR 已被发现效果很好。但是,当 PulseAudio 重新启动时,需要关闭并重新打开它。
拆卸
脚本对正在运行的 PulseAudio 服务器所做的更改不是永久性的,并且在 PulseAudio 终止时将会丢失。
要放弃自定义配置,只需重启 PulseAudio,例如使用 pactl exit
。(PulseAudio 是套接字激活的,将根据需要自动启动。)
模板脚本
#!/bin/bash microphone="alsa_input.pci-0000_00_1b.0.analog-stereo" speakers="alsa_output.pci-0000_00_1b.0.analog-stereo" echo "Setting up echo cancellation" pactl load-module module-echo-cancel use_master_format=1 aec_method=webrtc \ aec_args="analog_gain_control=0\\ digital_gain_control=1\\ experimental_agc=1\\ noise_suppression=1\\ voice_detection=1\\ extended_filter=1" \ source_master="$microphone" source_name=src_ec source_properties=device.description=src_ec \ sink_master="$speakers" sink_name=sink_main sink_properties=device.description=sink_main echo "Creating virtual output devices" pactl load-module module-null-sink sink_name=sink_fx sink_properties=device.description=sink_fx pactl load-module module-null-sink sink_name=sink_mix sink_properties=device.description=sink_mix echo "Creating remaps" pactl load-module module-remap-source master=sink_mix.monitor \ source_name=src_main source_properties="device.description=src_main" echo "Setting default devices" pactl set-default-source src_main pactl set-default-sink sink_main echo "Creating loopbacks" pactl load-module module-loopback latency_msec=60 adjust_time=6 source=src_ec sink=sink_mix pactl load-module module-loopback latency_msec=60 adjust_time=6 source=sink_fx.monitor sink=sink_mix pactl load-module module-loopback latency_msec=60 adjust_time=6 source=sink_fx.monitor sink=sink_main
此脚本的灵感来自 https://askubuntu.com/a/915064,有关更深入的信息,另请参阅该帖子的作者的 pulseaudio-config GitHub 仓库。
使用 module-remap-source
来解决不接受监视器作为源的应用程序的做法取自 https://unix.stackexchange.com/a/608482。
反转一个音频通道的相位
当您的一个扬声器接线极性错误时,这很有用。要测试是否需要这样做,请参阅 [3]。
改编自 为单个音频通道分配 LADSPA 滤波器 的更通用示例。需要 swh-plugins。
#!/bin/bash master=alsa_output.pci-0000_07_00.0.analog-stereo pacmd load-module module-ladspa-sink sink_name=ladspa_out sink_master=$master plugin=inv_1429 label=inv pacmd load-module module-remap-sink sink_name=remapR master=ladspa_out channels=1 master_channel_map=front-right channel_map=front-right pacmd load-module module-remap-sink sink_name=remapL master=$master channels=1 master_channel_map=front-left channel_map=front-left pacmd load-module module-combine-sink sink_name=invert sink_properties=device.description='"Invert\ phase"' slaves=remapL,remapR channels=2
重命名设备
默认情况下,声音设备有时会被分配令人困惑的名称。像“CM106 Like Sound Device”这样的名称不是很具有描述性。这可以很容易地修复,并且适用于 PulseAudio 源和接收器。
最简单的方法是将以下行添加到 /etc/pulse/default.pa
文件的末尾。
更新源名称
update-source-proplist device_name device.description="new_name"
以及更新接收器名称
update-sink-proplist device_name device.description="new_name"
可以使用命令 pacmd list-sources | grep name:
查询源的设备名称,或使用 pacmd list-sinks | grep name:
查询接收器的设备名称。
此配置也可以按用户持久化
~/.config/pulse/default.pa
#!/usr/bin/pulseaudio -nF ## Include defaults .include /etc/pulse/default.pa ## Rename devices update-source-proplist device_name device.description="new_name"
需要包含默认的 PulseAudio 配置,否则守护程序将无法启动。
使用模块的动态默认接收器
如果您加载一个例如使用 master
的模块,您可以使用 master="@DEFAULT_SINK@"
设置“动态”默认接收器。
这样,将使用活动的选定默认接收器。如果您更改默认接收器,则新的默认接收器将在命令重新加载/重新运行或 pulseaudio 重新启动时使用。