Ubuntu 20.04上HDMI没有声音。

我刚在我的有些过时的笔记本上安装了Ubuntu 20.04:

  • CPU:Intel Core i5 CPU M 480 @ 2.67GHz
  • 内存:4GB
  • 显卡:GeForce GT 420M
  • 音频:GF108 High Definition Audio Controller NVIDIA和 Audio 5 Series/3400 Series Chipset High Definition Audio HD 500GB

整体而言,系统工作得很好,但是HDMI音频存在一个大问题。HDMI上的显示完美运行,但音频根本不工作。

我尝试了很多Ask Ubuntu上的解决方案,但问题仍然存在。我尝试过的一些解决方案可以在以下链接找到:

升级到20.04后HDMI音频不工作

Ubuntu 18.04:除非我在输出之间切换,否则音频无法工作

无法检测到我的声卡HDMI

此外,我已经重新下载了Ubuntu 20.04的iso文件并重新安装了系统,但仍然无效。

在我替换为Ubuntu之前,HDMI在使用Windows 10时运行得非常完美。

当我运行aplay -l时,我得到以下结果:

Playback hardware Devices

当我运行 lspci 命令时,我得到了以下结果:

Devices

在“设置”->“声音”->“输出”->“输出设备”中,我只有两个选项可供选择:
- 内置扬声器音频 - 数字输出(S/PDIF)-内置音频
在Pulseaudio > 配置中显示: GF108高清晰度音频控制器 和 内置音频
而且,在这两个选项中,所有带有HDMI的选项都显示为(未插入)(不可用)。
最后,声音只能在我的笔记本电脑上工作,如果我连接HDMI电缆,它会正确显示,但声音仍然在我的笔记本电脑上。

我也遇到了这个问题。这是一个bug吗?有人能够确认它是否与下面提到的bug有关吗?顺便说一下,你的英文很好。 - Chaim Eliyah
9个回答

升级从Ubuntu 18.04到20.04后,我注意到当我登录后打开电视时,pulseaudio不再检测到HDMI音频输出(插在nVidia显卡上)。声音设置中不再列出HDMI输出。这在18.04中曾经有效。 我找到的解决方法是,在打开电视后打开控制台并输入以下命令:
pulseaudio -k

这在KDE上非常好用,但我已经手动选择了输出。谢谢! - Fathy
对于我在Ubuntu 22.10上,这个错误信息是:E: [pulseaudio] main.c: Failed to kill daemon: No such process - user643722
@user643722 我也是。 - undefined

这是一个老问题,也许你已经解决了你的问题。但是如果你还没有解决,或者其他人遇到了这个问题并且找不到适合他们的解决方案(就像我最近遇到的情况一样),那么这里有另一种可以尝试的方法。
这主要是从这里的建议中提取出来的,但稍微扩展/修改了一下。似乎PulseAudio存在一个bug,可能导致它无法自动检测hdmi音频输出(在其语言中称为“sinks”),因此您可以通过手动告诉它您的hdmi设备来修复问题。
步骤1:确保PulseAudio没有检测到您的hdmi sink
您可以使用pactl list short sinks列出加载到PulseAudio中的所有sink。这应该会产生一系列形式的东西。
0   alsa_output.pci-0000_06_00.6.HiFi__hw_Generic__sink module-alsa-card.c  s16le 2ch 48000HzIDLE

如果您的HDMI音频在列表中没有显示出来,那么我们可能已经找到了问题,请继续阅读。如果您不确定是否有显示,您也可以运行pactl list sinks | grep description以获取更多可读性强的设备描述信息。我认为HDMI输出将具有形如"blah High Definition Audio Controller"的描述,而非HDMI输出可能会有类似"blah blah blah Speaker + Headphone"的描述。
第二步:确保您的计算机能够将音频输出到HDMI
运行aplay -l以获取硬件播放设备列表。对我来说,输出看起来像是这样的:
**** List of PLAYBACK Hardware Devices ****
card 0: NVidia [HDA NVidia], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: NVidia [HDA NVidia], device 7: HDMI 1 [HDMI 1]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 0: NVidia [HDA NVidia], device 8: HDMI 2 [HDMI 2]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: NVidia [HDA NVidia], device 9: HDMI 3 [HDMI 3]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: NVidia [HDA NVidia], device 10: HDMI 4 [HDMI 4]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: NVidia [HDA NVidia], device 11: HDMI 5 [HDMI 5]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: Generic [HD-Audio Generic], device 0: ALC245 Analog [ALC245 Analog]
  Subdevices: 0/1
  Subdevice #0: subdevice #0

特别是,有许多种类的HDMI设备可供选择。我们想找到与您插入电缆的HDMI端口实际对应的设备。
首先要做的是运行“alsamixer”以确保您的HDMI设备没有静音。您应该会看到一个类似下面的屏幕。

enter image description here

使用 F6 选择正确的声卡。如果在任何插槽中看到 MM,那意味着它被静音了。选择它并按下 M 取消静音。完成后按下 Esc
实际上,你可能只需要取消静音其中一个插槽(与你的 HDMI 端口相关联的插槽,通常是第一个),但取消静音所有插槽也无妨。
处理完这些后,我们现在可以测试你的音频。运行
speaker-test --channels 2 --test wav --device hw:[card],[device]

其中 [card],[device] 是指从 aplay -l 的输出中得到的数字,例如,我会首先使用 hw:0,3。你需要对之前列出的每个 HDMI 硬件设备都进行这样的操作,直到其中一个能够发出可听的声音为止。

第三步:将 HDMI 输出添加到 PulseAudio 并确保其正常工作(如果不需要可以跳过)

现在,你已经确定了与你的 HDMI 端口相关联的卡和设备号码,只需运行以下命令:

pactl load-module module-alsa-sink device=hw:[card],[device]

你现在应该能够进入声音设置并看到一个新的可选输出设备(我的叫做“TU116高清音频控制器”)。选择它,然后查看你的HDMI音频是否正常工作。如果不行,我无法帮助你。但如果可以,恭喜你。
第四步:使这个更改(几乎)永久化
目前,如果你重新启动电脑,你需要再次运行这个“load_module”命令才能让HDMI再次工作。为了让事情变得更好一点,以root身份编辑“/etc/pulse/default.pa”文件,并在文件末尾添加以下行:
load-module module-alsa-sink device=hw:[card],[device]

在这之后(尤其是如果你跳过了第三步),你可能想要运行。
rm -r ~/.config/pulse
killall pulseaudio
pulseaudio --start

重新启动PulseAudio。

最后,有几个小问题/备注

  • 对我来说,即使在执行此操作之后,重启计算机后仍然需要运行killall pulseaudio; pulseaudio --start才能加载hdmi音频输出。我不知道如何解决这个问题。
  • 对我来说,即使没有插入HDMI线缆,Ubuntu的声音设置中仍然会列出HDMI设备作为选项。我不知道如何解决这个问题。
  • 本答案开头的链接提到了一个脚本,可以在插入HDMI线缆时自动切换到HDMI音频输出。我对Linux了解不多,无法理解该脚本的具体内容,所以我自己没有尝试过。

编辑:一个执行本答案的Bash脚本

针对上面的最后一个要点,我最近写了一个bash脚本,可以自动执行这里描述的步骤。你可以在github上找到它。与参考链接中的脚本相比,我写的这个脚本(尝试)对运行它的机器做出更少的假设;特别是,它不假设PulseAudio已经(手动)配置好以检测你的HDMI电缆。如果还没有进行这样的配置,它会运行上述过程,然后将音频切换到HDMI。
这个脚本可以通过使用udev在插入或拔出HDMI电缆时自动运行。要实现这一点,在文件夹/etc/udev/rules.d中添加一个包含以下行的文件。
KERNEL=="card*", SUBSYSTEM=="drm", ACTION=="change", RUN+="[path-to-script]"

(在我的机器上,我将脚本保存在/usr/local/bin/hdmi.sh中)。创建完这个文件后,运行udevadm control --reload-rules。完成这些步骤后,你只需插入HDMI电缆,一切应该正常工作。当你拔掉电缆时,音频应该自动切换回电脑。

新的问题/备注

  • 在第一次添加此udev规则后,您可能需要重新启动计算机一次,然后更改才能生效。
  • 如果udev规则表现不佳,您可以始终手动运行脚本。这样做虽然需要花费更多的精力,但更加可靠。
  • 对于我来说,如果我连续插拔HDMI电缆5次而不重新启动,则音频变得极度失真。我不知道是什么原因。
  • 该脚本实际上只是执行上述过程。特别是,在某些时候,它会运行speaker-test以确定要在PulseAudio中加载哪个卡/设备。因此,当运行时,您可能会听到可听的“左侧/右侧”声音(或speaker-test默认的任何声音)。
  • 在脚本中,有一个ENABLE_DESKTOP_NOTIFICATIONS变量。如果要每次运行时收到通知,请将其设置为1。

  • 谢谢 @Niven!这个 load-module 命令对我有用! - fccoelho
    我正在使用一张NVIDIA显卡作为我的唯一音频输出设备,我使用pactl set-default-sink alsa_output.hw_0_3命令来设置默认的音频输出设备。 - fedemengo

    我正在使用Mint 20.1与Xfce,这对我解决了问题:
    - 打开音频混音器(这里称为pavucontrol)。 - 切换到配置选项卡(最右边的选项卡)。 - 有一个下拉菜单用于选择内置音频设备的配置文件。 - 在这里,我可以选择HDMI配置文件,只需小心选择一个未标记为不可用的配置文件。 - 之后,通过HDMI的音频就正常工作了。
    我意识到这不完全是Ubuntu,但足够接近,我认为在Ubuntu上也应该有类似的解决方法。

    我正在测试这个,并将在使用Ubuntu 18.04后向您汇报我的结果。 - Jack
    好的,这确实有帮助,但对我来说并没有完全解决问题。如果我的机器进入睡眠状态,它仍然会忘记HDMI输出。一旦我打开pavucontrol,HDMI就恢复正常了。 - Jack
    pavucontrol救了我。我发现音量并没有静音,只是非常低。 - Shiplu Mokaddim

    我至少看到三个可能的原因:
    你的声音设备可能默认为静音状态 - 运行`alsamixer`并确保所有声音设备都取消静音。我假设你已经这样做了,因为在你发布的链接中提到了这一点。
    你可能需要为声音输出设置一个默认的“sink”。这里是一个过去帮助我解决Xfce问题的帖子。你可以尝试将声音播放到指定的输出,例如`aplay -D plughw:0,1 /usr/share/sounds/alsa/Noise.wav` - 根据`aplay -l`的输出尝试所有可能的组合,例如1,3或1,7等。 Linux内核问题。在最近安装的Arch Linux上,我发现HDMI音频不工作,原因是Linux内核中的一个回归错误。该错误在这里有记录:Bug 207223 - linux-5.6.x breaks NVidia HDMI audio。修复方法要么回退到<= 5.6的内核(2020-04-01版本),要么使用LTS内核(我选择了这个),这对我解决了问题。检查`uname -r`的输出以验证你的内核版本。

    你可以采取以下额外步骤:

    • 你提到使用了笔记本电脑,所以我理解你不能选择禁用主板上的内置声卡(可能你并不总是使用外部HDMI显示器)。这可能无法解决你的问题,但可以消除桌面PC上的一个不必要设备(目前它可能是默认设备)。
    • 另外一点:由于你有一个NVIDIA设备,你可以选择使用Nvidia的专有驱动程序或开源版本(nouveau),还有Optimus,我对此不太熟悉。请确认你正在使用哪个驱动程序。如果所有尝试都失败了,你可以尝试另一个驱动程序。但根据经验,nouveau应该完全能胜任,除非你的硬件非常新,尚未得到Linux的支持。

    我还推荐阅读Arch Linux维基:高级Linux音频架构。它在过去帮助我很多调试声音问题。


    匿名,谢谢你的关注。我按照你提供的步骤一一尝试了,但仍然没有解决问题。我将尝试重新安装系统,如果还是不行,我会寻找其他解决方案,可能选择另一个系统或者继续使用但关闭HDMI声音。 - Lucas
    我找到了正确的卡片、设备来播放声音,现在我该如何将其设置为默认的声音输出?我无法在选项中选择它。 - xinthose
    我没有足够的声望来评论,但我只是想补充一下,Kate的回答仍然适用于Ubuntu 22.04 / GNOME / X11。截至2023年03月04日的最新内核(5.19.0-35-generic)似乎存在类似的错误,使用之前可用的内核版本(5.19.0-32-generic)可以恢复HDMI音频输出。 - banaanihillo

    这个问题可以通过应用程序pavucontrol 5.0来解决,它允许用户选择和锁定输出设备。不幸的是,该应用程序是特定于发行版的,所以Ubuntu用户必须等待Canonical将该应用程序添加到软件仓库中。

    这可能取决于HDMI设备(我在两台笔记本电脑上遇到了完全相同的问题,之前的解决方案都不起作用)。对我有效的方法是:
    • 在脉冲音频控制屏幕中禁用笔记本电脑的内置声音
    • 不知何故,显示器的声音会自动启用
    操作系统:Ubuntu 22 HDMI设备:带扬声器的三星智能显示器

    这帮助我 sudo alsa force-reload

    我认为,是 pavucontrol 配置上的问题。


    如果pulseaudio显示声音正在输出但仍然没有声音,将内核更新到最新版本将安装最新的驱动程序。
    这对我起作用了。

    只需升级到最新的内核:
    sudo apt-get update sudo apt-get dist-upgrade 然后进入“设置/声音”,选择可能由于某些回归而丢失的HDMI选项。