HDMI Ubuntu 20.04 上没有声音

Luc*_*cas 17 sound pulseaudio hdmi alsa 20.04

我刚刚在我的笔记本电脑上安装了 Ubuntu 20.04,它有点过时了:

  • CPU:Intel Core i5 CPU M 480 @ 2.67GHz
  • 内存:4GB
  • 显卡:GeForce GT 420M
  • 音频:GF108 高清音频控制器 NVIDIA 和 Audio 5 系列/3400 系列芯片组 高清音频 HD 500GB

总体而言,系统运行良好,但我在 HDMI 音频方面遇到了大问题。HDMI 上的显示效果很好,但音频根本不起作用。

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

升级到 20.04 后 HDMI 声音不起作用

Ubuntu 18.04:除非我在输出之间切换,否则音频不起作用

没有检测到我的声卡 HDMI

另外我再次下载了 Ubuntu 20.04 iso 并重新安装了系统,但它不起作用。

当我在用 Ubuntu 替换它之前使用 Windows 10 时,HDMI 工作得很好。

当我运行时,aplay -l我有这些结果:

播放硬件设备

当我运行时,lspci我有这些结果:

设备

设置->声音->输出->输出设备中,我只有两个选项可供选择:

  • 扬声器内置音频
  • 数字输出(S/PDIF)-内置音频

在 Pulseaudio > Configuration 上显示:GF108 High Definition Audio Controller and Built-in Audio

并且在这两个选项中,所有带有 HDMI 的选项都显示为 (unplugged)(unavailable)。

最后,声音只适用于我的笔记本电脑,如果我连接 HDMI 电缆,它可以正确显示,但声音会保留在我的笔记本电脑上。

小智 10

从 Ubuntu 18.04 升级到 20.04 后,我注意到在我登录后打开电视时,pulseaudio 将不再检测到 HDMI 音频输出(插入到 nVidia 显卡)。HDMI 输出不再在声音设置中列出。这曾经在 18.04 中起作用。

我发现一种解决方法是打开控制台并在打开电视后键入以下命令:

pulseaudio -k
Run Code Online (Sandbox Code Playgroud)


Niv*_*ven 10

这是一个老问题,所以也许您已经解决了您的问题。但如果您还没有,或者其他人遇到这个问题并且没有找到适合他们的解决方案(就像我最近的情况一样),这是人们可以尝试的另一件事。

这主要取自此处的建议,但略有扩展/修改。PulseAudio 似乎有一个错误,可能会导致它无法自动检测 hdmi 音频输出(在其语言中为“接收器”),因此您可以通过手动告诉它有关您的 hdmi 设备的信息来修复问题。

第 1 步:确保 PulseAudio尚未检测到您的 hdmi 接收器

您可以使用 列出加载到 PulseAudio 中的所有接收器pactl list short sinks。这应该产生以下形式的事物列表

0   alsa_output.pci-0000_06_00.6.HiFi__hw_Generic__sink module-alsa-card.c  s16le 2ch 48000HzIDLE
Run Code Online (Sandbox Code Playgroud)

如果您的 HDMI 音频没有出现在您的列表中,那么我们可能已经发现了问题,所以请继续阅读。如果您不确定是否有效,您还可以运行pactl list sinks | grep description以获取有关检测到的设备的更多人类可读的描述。我认为 hdmi 接收器将具有“blah High Definition Audio Controller”形式的描述,而非 hdmi 接收器可能具有“blah blah blah 扬声器 + 耳机”之类的描述。

步骤 2:确保您的计算机可以将音频输出到 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
Run Code Online (Sandbox Code Playgroud)

特别是,有多种 HDMI 设备可用。我们想要找到与您插入电缆的 HDMI 端口实际对应的端口。

首先要做的是运行alsamixer以确保您的 HDMI 设备没有静音。您应该会看到如下所示的屏幕。

在此输入图像描述

用于F6选择正确的声卡。如果您MM在任何插槽中看到 ,则表示它已静音。选择它并按M取消静音。Esc完成后点击。

实际上,您可能只需要取消其中一个插槽的静音(实际上与您的 hdmi 端口关联的插槽可能是第一个),但将它们全部取消静音也没什么坏处。

处理完毕后,我们现在可以测试您的音频。跑步

speaker-test --channels 2 --test wav --device hw:[card],[device]
Run Code Online (Sandbox Code Playgroud)

其中 [card],[device] 指的是 输出中的数字aplay -l,例如我首先使用hw:0,3。您将对前面列出的每个 HDMI 硬件设备执行此操作,直到其中一个设备实际发出可听见的声音。

步骤 3:将 HDMI 接收器添加到 PulseAudio 并确保其正常工作(如果需要,可以跳过)

现在您已经确定了与您的 hdmi 端口关联的卡和设备号,只需运行

pactl load-module module-alsa-sink device=hw:[card],[device]
Run Code Online (Sandbox Code Playgroud)

您现在应该能够转到声音设置并看到一个新的可选输出设备(我的称为TU116 High Definition Audio Controller)。选择它并查看您的 HDMI 音频现在是否正常工作。如果没有,我帮不了你。但如果确实如此,那么恭喜你。

第 4 步:使此更改(几乎)永久生效

目前,如果您重新启动计算机,则必须重新运行此load_module命令才能使 hdmi 再次工作。为了让事情变得更好一点,编辑“/etc/pulse/default.pa”(以 root 身份),并在文件末尾附近添加以下行

load-module module-alsa-sink device=hw:[card],[device]
Run Code Online (Sandbox Code Playgroud)

之后(特别是如果您跳过了步骤 3),您可能需要运行

rm -r ~/.config/pulse
killall pulseaudio
pulseaudio --start
Run Code Online (Sandbox Code Playgroud)

重新启动 PulseAudio。

最后,一些小问题/评论

  • 对我来说,即使在这样做之后,我仍然需要killall pulseaudio; pulseaudio --start在重新启动计算机后运行才能将 PulseAudio 加载到 hdmi 接收器中。我不知道如何解决这个问题。
  • 对我来说,即使我的电缆没有插入,hdmi 设备仍然在 Ubuntu 的声音设置中列为一个选项。我不知道如何解决这个问题。
  • 这个答案开头的链接提到了一个脚本,用于在插入电缆时自动切换到 hdmi 音频。我对 Linux 的了解不够,无法了解该脚本中发生的情况,所以我自己没有尝试过。

编辑:执行此答案的 Bash 脚本

为了响应上面的最后一个要点,我最近编写了一个 bash 脚本,它将自动执行此处描述的步骤。你可以在github上找到它。与引用链接中的脚本相比,我编写的脚本(尝试)对正在运行的机器做出更少的假设;特别是,它并不假设 PulseAudio 已(手动)配置为检测您的 HDMI 电缆。如果没有发生这种情况,它将运行上述过程,然后将音频切换到 hdmi。

可以使用 udev 配置此脚本,以便在插入或拔出 HDMI 电缆时运行。为此,请在文件夹中/etc/udev/rules.d添加一个包含以下行的文件

KERNEL=="card*", SUBSYSTEM=="drm", ACTION=="change", RUN+="[path-to-script]"
Run Code Online (Sandbox Code Playgroud)

(在我的机器上,我将脚本保存在/usr/local/bin/hdmi.sh)。创建此文件后,运行udevadm control --reload-rules. 完成此操作后,您应该能够插入 HDMI 电缆并让一切正常工作。当您拔下电缆时,音频应该切换回您的计算机。

新的问题/评论

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


小智 9

我正在使用 Mint 20.1 和 Xfce,这为我解决了这个问题:

  • 打开音频混合器(此处称为pavucontrol
  • 切换到“配置”选项卡(最右侧的选项卡),
  • 有一个下拉菜单用于选择内置音频设备的配置文件。
  • 在这里我可以选择一个 HDMI 配置文件,只是要小心选择一个没有标记为不可用的配置文件。
  • 之后,通过 HDMI 的音频工作正常。

我意识到这并不完全是 Ubuntu,但足够接近,我认为类似的事情在 Ubuntu 上也应该是可能的。


小智 6

我认为至少有三个可能的原因:

  1. 默认情况下,您的声音设备可能已静音- 运行alsamixer并确保所有声音设备均已取消静音。我认为您已经这样做了,因为您发布的链接之一提到了这一点。
  2. 您可能必须为声音输出设置默认“接收器”。是一篇过去帮助我使用 Xfce 的帖子。您可以尝试的一件事是向指定输出播放声音,例如aplay -D plughw:0,1 /usr/share/sounds/alsa/Noise.wav- 根据aplay -l例如 1,3 或 1,7 等的输出尝试所有可能的组合
  3. Linux 内核问题。在最近安装的 Arch Linux 中,我发现由于Linux 内核的回归, HDMI 音频无法工作。该错误记录在此处:Bug 207223 - linux-5.6.x 破坏 NVidia HDMI 音频。修复方法是恢复到内核 <= 5.6(版本 2020-04-01),或者使用 LTS 内核(我就是这么做的),这为我解决了这个问题。检查输出uname -r以验证您的内核版本。

您可以执行的其他步骤:

  • 您提到使用笔记本电脑,所以我认为禁用主板上的板载声卡不适合您(大概您不会总是使用外部 HDMI 显示器)。这可能无法解决您的问题,但会删除台式电脑上的一个不必要的设备(目前可能是默认设备)。
  • 另外:因为你有一个NVIDIA设备,你可以选择 Nvidia 的专有驱动程序或开源版本 ( nouveau ),还有我不熟悉的 Optimus。验证您使用的是哪一种。如果所有尝试都失败,您可以尝试其他驱动程序。但根据经验,nouveau 应该完全有能力,除非您拥有尚未支持 Linux 的最新硬件。

我还推荐 Arch Linux wiki:Advanced Linux Sound Architecture。它帮助我解决了当时的声音问题。