通过两个或更多的输出设备播放声音

我有一个声卡和一副蓝牙耳机。我想通过我的声卡和蓝牙耳机同时播放音频。
我相信Windows有复选框可以“勾选”输出设备以启用/禁用它们,但Ubuntu似乎只有等效的单选按钮(一次只能选择一个)。
额外问题: 类似的,我的声卡上有5个模拟输出通道(除了数字和HDMI音频)--我希望能够确定每个端口的输出内容(例如,所有5个前置扬声器或“前置”,“中置”,“后置”等)。

我已经阅读了所有的答案,还检查了答案的日期。目前Ubuntu 18.04的解决方案是什么? - LeonidMew
5是的,在Ubuntu 18.04仓库中的paprefs版本是无用的(因为它仍然认为GConf很流行,所以无法正常工作)。最好的替代方法是自己加载PulseAudio的module-combine-sink模块(因为这就是paprefs在幕后所做的一切)。使用命令pactl load-module module-combine-sink,然后检查Ubuntu设置中的声音部分。 - AneesAhmed777
在Ubuntu 19.10中,使用paprefs解决方案可以直接使用。 - Marcin Skórzewski
Ubuntu 20.04 - 在关闭所有音频设置并重新启动PulseAudio(killall pulseaudio)后,paprefs 可以用于所有硬连接的扬声器,但是它会断开我的蓝牙扬声器 - 必须重新连接并切换到它,然后再切回多输出 :) - jave.web
它可以工作,但时机很混乱。我现在明白为什么没有专业人士愿意为Linux编写软件。完整的音频架构有些混乱。PulseAudio更加面向网络,而Jack则是单个音频设备。很难在多个音频设备之间创建紧密的同步。同步问题并不容易解决。 - U.V.
6个回答

使用paprefs,您可以访问一个虚拟输出设备,使得可以同时输出到所有连接的声卡和设备:
sudo apt install paprefs

然后在终端中运行 paprefs,选择同时输出选项卡,并勾选为所有本地声卡添加虚拟输出以实现同时输出

paprefs

在PulseAudio的“声音首选项”菜单(pavucontrol)的“输出”选项卡中,可以选择用于同时输出的附加音频输出设备。

pavucontrol screenshot

在这个例子中,它展示了一个HDMI设备,但是一旦你的蓝牙设备被识别出来,它也可以同时输出。
更改可能需要重新启动PulseAudio才能生效,可以通过注销并重新登录会话或在终端中运行pulseaudio -k来实现。

如果 paprefs 不能完成任务,或者您愿意不安装 paprefs,请使用以下命令行命令:

pactl load-module module-combine-sink

要从命令行卸载模块并将PulseAudio重置为默认设置,只需使用以下命令重新启动PulseAudio:
pulseaudio -k

或问题:
pactl unload-module module-combine-sink

4这样就完成了任务。随着我深入进行音频开发,我真的希望能够选择特定的设备和/或端口。 - Nathan J.B.
1@NathanJ.Brauer:你可能对这个答案感兴趣。如果要更改端口,请参考我在那里提供的pulseaudio wiki链接。 - Takkat
但是如果我想要使用内置扬声器和没有蓝牙的音频线呢?我尝试过这个解决方案,但由于音频插孔没有连接到具有音频卡的设备,声音选项无法识别它... - user38744
有没有办法修复蓝牙音箱和内置扬声器之间的延迟?有时候它们似乎很同步,而有时候又相差甚远。 - seb
延迟是由于A2DP协议所需的缓冲区引起的。不幸的是,我们对此无能为力。 - Takkat
3这个在18.04版本中对我不起作用。如果您知道如何使用ALSA,请在这里帮助我:https://askubuntu.com/q/1042485/586277 - ICE
4在Ubuntu 16.04上对我无效。在声音偏好窗口中,我没有看到任何类似于“同时输出”的选项。 - node_man
@node_man:你按照我回答的第一部分安装和设置了paprefs吗?这是创建同时输出源的先决条件。 - Takkat
1是的,我按照步骤正确操作了,但它没有起作用。然后我在另一台Ubuntu机器上尝试了一下,它可以工作。因此,我重新安装了我的机器上的pulse音频,现在它可以工作了。问题是 pulseaudio -k 没有杀死 pulseaudio 它会抛出一些权限错误。现在已经解决了。谢谢。 - node_man
如何独立控制每个输出设备的音量?如果无法实现这一点,那么这个答案几乎没有任何用处。 - Jollywatt
2@Jollywatt - 通过PulseAudio Preferencespavucontrol),可以在“播放”和“输出”选项卡下单独控制每个音频设备的音量。 - cipricus
1在Ubuntu 20.04上没有创建设备。 - Velkan
1@Velkan:谢谢你的提醒。Paprefs似乎出了问题。试试我在这个回答中编辑的命令吧。 - Takkat
@Takkat,是的,我确实将load-module module-combine-sink添加到了~/.config/pulse/default.pa中,正如其他评论所说的那样。它已经起作用了。 - Velkan
1也适用于Ubuntu 20.10。 - conualfy
@Velkan,你需要关闭所有音频设置窗口,然后执行killall pulseaudio命令,当音频重新开始时再重新打开它们。我刚在Ubuntu 20.04上测试过,这个方法有效。 - jave.web
@Takkat 但是我有一个不同的问题 - 杀死pulsaudio也断开了我的蓝牙扬声器 - 我不得不重新连接它,并将输出设备切换到蓝牙扬声器,然后再切换回虚拟多输出 :) - jave.web

Ubuntu

我刚刚确认这个解决方案在Ubuntu 14.04 LTS上仍然有效。

  1. 安装:打开终端并输入sudo apt install paprefs,按照上面的图片选择选项卡。
  2. 首次运行
    1. 保持在终端中,输入pulseaudio -k 来杀死并重新启动pulseaudio(使用当前systemd pulseaudio用户服务的方法)。
    2. 然后进入声音设置,您将看到输出到多个声音设备的选项。
    3. 对于编写paprefs的人来说,这是一个很棒的小软件,我真的希望它能够包含在Ubuntu中,而不需要额外安装。

Apple Mac OS X

通过一个内置的软件也可以找到类似的解决方案,而且pulseaudio之所以如此出色,是因为声音似乎完美同步从两个输出设备传出,所以它一定会调整延迟,这就是它如此令人印象深刻的原因;否则我们会听到一个略有延迟的版本和另一个版本。


1感谢您进行检查,确认解决方案是否仍然有效! - peter karasev
2这在Ubuntu 16.04.1 LTS上也适用。 - aggsol
谢谢,刚刚确认这在Linux Mint 20中可行。它是每个用户的,所以你必须作为桌面用户执行命令。 - SurpriseDog

在Kubuntu 18.04中,Plasma 5.12不需要使用,因为已经有一个类似的设置存在。

enter image description here

重启后,应该会出现一个新的输出选项,称为“同时输出”。

enter image description here

或者在 pavucontrol 中:

enter image description here


在18.10版本中,使用Plasma 5.13.5时,“同时输出”选项已被移除,因此需要使用paprefs。

1我的ArchLinux与KDE 5.19.2仍支持“同时输出”。 - user690429

我在Debian 8.7中无法让Takkat的建议立即运行,尽管我重新启动了系统。 我假设您已经完成了安装paprefs的Takkat提案。 基于Arch Linux wiki,Takkat的答案扩展可以保留模拟输入并将Pulse称为“双工”。
# /etc/pulse/default.pa
# http://unix.stackexchange.com/a/180374/16920
load-module module-alsa-sink device=hdmi:0
load-module module-combine-sink sink_name=combined
set-default-sink combined

然后重新启动pulseaudio:
pulseaudio -k

对我来说,当我将device="hw:0,0"设置为aplay -l中的设备时,这个方法有效(请参考https://forums.linuxmint.com/viewtopic.php?t=264540#p1436479)。 - Laurenz
请确保将此文本放在文件的顶部!在Ubuntu 18.04.2上,我使用这个设置(hw:0,0),可以在两个HDMI显示器上播放。在将这些行移到顶部后,它对我有效。 - orangenarwhals

因为LeonidMew问到了18.04(我正在使用的是18.04.2),所以这是我的版本。
GUI paprefs试图将一个HDMI和一个模拟输出合并在一起,而不是两个HDMI。所以我按照Léo Léopold Hertz的描述编辑了文件/etc/pulse/default.pa
$ gedit /etc/pulse/default.pa  # make changes as in method a or b below
$ pulseaudio -k # then restart pulseaudio

以下两种方法都可以单独使用,所以选择其中一种(确保将这些行添加到文件的顶部,我把它放在.fail之后!否则它不起作用)。

方法A

load-module module-alsa-sink device=hw:0,0
load-module module-combine-sink sink_name=combined

方法B

load-module module-alsa-sink device=hw:1,3 sink_name=hdmi
load-module module-alsa-sink device=hw:1,7 sink_name=hdmi2
load-module module-combine-sink sink_name=combined slaves=hdmi,hdmi2
set-default-sink hdmi-combined

参考

方法A

作为参考,hw:0,0 是从 aplay -l 中获取的。

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC892 Analog [ALC892 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 1: ALC892 Digital [ALC892 Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 7: HDMI 1 [HDMI 1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 8: HDMI 2 [HDMI 2]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 9: HDMI 3 [HDMI 3]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

方法B

而且1:71:3是从中得出的

$ pacmd list-sinks | grep -e 'name:' -e 'alsa.device ' -e 'alsa.subdevice '
    name: <alsa_output.pci-0000_00_1b.0.iec958-stereo>
        alsa.subdevice = "0"
        alsa.device = "1"
    name: <alsa_output.pci-0000_01_00.1.hdmi-stereo-extra1>
        alsa.subdevice = "0"
        alsa.device = "7"

在GNOME的“声音设置”中,我将第二个监视器的其他HDMI设置为输出,然后重新运行了命令。
$ pacmd list-sinks | grep -e 'name:' -e 'alsa.device ' -e 'alsa.subdevice '
    name: <alsa_output.pci-0000_00_1b.0.iec958-stereo>
        alsa.subdevice = "0"
        alsa.device = "1"
    name: <alsa_output.pci-0000_01_00.1.hdmi-stereo>
        alsa.subdevice = "0"
        alsa.device = "3"

为了验证这些数字是否正确,我进行了运算。
$ aplay -D plughw:1,3 /usr/share/sounds/alsa/Front_Right.wav
$ aplay -D plughw:1,7 /usr/share/sounds/alsa/Front_Right.wav

在他们各自的监视器上听起来。


为了补充Takkat的出色答案,我发现新设备的默认名称过长并且扭曲了音效设置对话框。为了缩短那个名称,我还需要执行以下命令:
gconftool --set --type string /system/pulseaudio/modules/combine/args0 sink_properties=device.description=Combined

Sound settings with combined device


4怎么才能撤销这个? - Iman Mohamadi