如何在PulseAudio中移除Nvidia HDMI音频输出?

每次重新启动时,PulseAudio都会将一个音频输出(在我的情况下是“HDMI音频输出”)设置为默认选项。
因此,每次重新启动时,我听不到任何声音,需要每次重新配置默认选项为“模拟输出”。
我该如何移除/禁用特定的音频输出,比如HDMI,或者设置一个默认选项来覆盖现有的音频输出?

2即使有人提供了一个变通方法,请您还是按照https://help.ubuntu.com/community/ReportingBugs上描述的方式提交一个错误报告,以解决您的问题。谢谢。 - João Pinto
这是谷歌上“pulseaudio disable sink”搜索的第二个排名问题,似乎完全符合使用和管理Ubuntu官方版本的范围,并且不涉及任何避免的范围。请重新开放。 - fatal_error
6个回答

只需将声卡的配置设置为“关闭”,例如:
pactl set-card-profile alsa_card.usb-Generic_ThinkPad_Dock_USB_Audio-00 off

pavucontrol在其“配置”选项卡中也可以做到这一点:

enter image description here

一个替代方案是完全禁用pulseaudio中的任何自动连接功能,但是对于我的蓝牙耳机来说,我喜欢这个功能。 通过上述解决方案,您可以以细粒度的方式禁用声卡。

1如果你的音频设备没有配置文件怎么办?我的主板上的HDMI和模拟声音就没有配置文件。 - einpoklum
从未遇到过这种情况,你能展示一张在回答中使用的屏幕截图吗? - hbogert
1如果能够记住的话,这将是一个不错的解决方案。我正在设置我的HDMI输出配置文件,但它总是自动重置 :( 真是非常烦人。Kubuntu 21.04 - piit79
@piit79 在我的情况下,这绝对是被记住的。 - hbogert

在18.10版本中,我成功修复了它。
文件/etc/modprobe.d/blacklist.conf。 添加。
blacklist snd_hda_codec_hdmi

1. 删除用户设置

在编辑default.pa之前,另一种方法是将隐藏目录~/.pulseaudio重命名为类似~/.pulseaudio.000的名称,放置在您的/home目录中。这是存储用户定义设置的位置。如果删除或重命名它,它将立即从/etc/pulse/default.pa的设置中重新创建。

2. 编辑默认设置

只有当这对您的系统没有影响时,可能udev会将HDMI接口加载为默认输出设备。那么一个方法就是按照HagenaarsDotNu提到的方式编辑default.pa文件。请务必备份当前的default.pa文件。查找以下部分,它相当容易理解(请注意,在Ubuntu >10.04中,hal-detect将不起作用)。

### Load audio drivers statically (it's probably better to not load
### these drivers manually, but instead use module-hal-detect --
### see below -- for doing this automatically)
#load-module module-alsa-sink
#load-module module-alsa-source device=hw:1,0
#load-module module-oss device="/dev/dsp" sink_name=output source_name=input
#load-module module-oss-mmap device="/dev/dsp" sink_name=output source_name=input
#load-module module-null-sink
#load-module module-pipe-sink
#
### Automatically load driver modules depending on the hardware available
.ifexists module-udev-detect.so
load-module module-udev-detect
.else
### Alternatively use the static hardware detection module (for systems that
### lack udev support)
load-module module-detect
.endif

3. 优雅的方式
另一种更优雅的方法是通过在此处启用“同时输出”选项来使音频正常工作,如下所示:

paprefs

这将使内部音频和HDMI接口都能输出音频。将此虚拟输出设备设置为默认设备,您就可以拥有所有选项。


"同时输出"往往会对CPU产生较大负荷。 - Tomot
“同时输出”也有可能使至少一个输出的音频质量变得糟糕。我所说的糟糕是指非常糟糕,可以说比没有声音还要糟糕。 - Display Name
1对于没有使用过pulseaudio的人来说,该部分并不是自解释的。我到底应该改变什么,才能禁用通过HDMI传输音频? - David Faure
方法2的最后一步是“查找这个部分,它相当容易理解”。查看那个部分对系统有什么影响呢? - Jerome

我在Launchpad上找到了这个建议

该建议指出您应该编辑pulseaudio设置

sudo nano /etc/pulse/default.pa

#set-default-sink output替换为:set-default-sink {您的设备名称}

设备名称可以通过查看pactl list输出中的Card部分的name字段找到。

我已经检查过,这种方法在10.10版本仍然有效。


你如何确切地知道要使用哪个设备名称? - einpoklum

找到了更好的选择

按照下面描述的方法使用systemd可以在启动时工作,但是在将设备插入到已经运行的系统中时却不起作用。

要在热插拔和启动时忽略音频,udev规则是更好的选择。

改编自使用udev告诉PulseAudio忽略USB设备

  1. 使用lsusb命令来识别你想要忽略的设备的供应商/产品ID。

    $ lsusb
    总线 006 设备 003: ID 17e9:4307 DisplayLink LAPDOCK
    # <其他我不关心的设备>
    

    ID部分给出了我们需要的魔术数字。

  2. 创建一个udev规则文件,例如/etc/udev/rules.d/80-ignore-audio-cards.rules,为pulse audio设置一个环境变量。

    对我来说,这个文件看起来像是:

    ATTRS{idVendor}=="17e9", ATTRS{idProduct}=="4307", ENV{PULSE_IGNORE}="1"
    

    我随意选择了80-作为文件名的前缀。如果你有任何与pulseaudio相关的规则,请确保你的新文件以较低的数字开头。

  3. 重新启动以确保生效。

有了udev规则,pulseaudio完全忽略该设备。

之前的回答:

遇到了同样的问题,给出的答案在重新启动后对我没有起作用。我认为我的问题是卡片的延迟检测;当pulseaudio启动时,它没有看到所有的卡片,而且module-switch-on-connectmodule-switch-on-port-available的某种组合总是重置我的选择。

我通过创建一个systemd用户单元来解决这个问题,在我登录时运行pactl set_card_profile "$MY_CARD_NAME" off

  1. 找到你不想要的卡的名称;希望名称足够告诉你是哪一张卡:

    $ pactl list cards | grep -E '(Card|Name:)'
    Card #0
        Name: alsa_card.usb-DisplayLink_LAPDOCK_U3D2338486250-02
    Card #1
        Name: alsa_card.pci-0000_01_00.1
    Card #2
        Name: alsa_card.usb-Plantronics_Plantronics_Blackwire_5220_Series_2961D11C621649939CED8BF57E910BA5-00
    Card #3
        Name: alsa_card.usb-HD_Web_Camera_HD_Web_Camera_Ucamera001-02
    Card #4
        Name: alsa_card.pci-0000_00_1f.3
    

    对我来说,是"LAPDOCK"一直在抢走我的音频。

  2. 创建systemd单元,调用pactl并禁用该卡:

    $ mkdir -p ~/.config/systemd/user
    $ nano ~/.config/systemd/user/disable-cards.service
    

    添加以下内容,将ExecStart行更改为所需删除的卡的引用:

    [Unit]
    Description=禁用卡
    
    [Service]
    Type=simple
    Restart=on-failure
    ExecStart=pactl set-card-profile "alsa_card.usb-DisplayLink_LAPDOCK_U3D2338486250-02" off
    
    [Install]
    WantedBy=default.target
    
  3. 启用服务:systemctl --user enable disable-cards

现在,当您重新启动时,systemd 将继续尝试断开该卡,直到成功为止。可能有更好的 systemd 配置可以在监视器插入后运行此配置;每个设备都显示为“单元”(例如,在 systemctl --user 的输出中),因此可以改进为在插入/拔出设备时工作。
另一种选择是更改您的 /etc/pulse/default.pa 以使用 module-switch-on-connect blacklist="REGEX_MATCHING_THE_CARD_NAME",但这对我没有起作用;没有办法自定义 module-switch-on-port-available,我认为那就是为我选择它的原因。

作为一种解决方法,请通过编辑/etc/pulse/default.pa来禁用该功能,并注释掉(使用#)或删除以下内容:
load-module module-switch-on-port-available

重启系统。