Ubuntu HDMI输出声音

Ubuntu无法通过HDMI输出声音且设置中输出设备无HDMI的解决办法

https://blog.csdn.net/ZehShin/article/details/105859388

30/10/2020 Update

It seems like the problem is fixed in Ubuntu 20.04. If there still exits the problem, this method works anyway.

问题背景

Ubuntu系统经常出现没有声音的情况,大部分问题都可以在目前的中文网络上找到相对应的文章并进行解决。其中HDMI无法输出声音的问题,通常都可以通过:在“Settings-Sounds”切换输出设备、安装pavucontrol切换配置文件、运行alsamixer取消mute,这几个方法进行解决。

但是,笔者17年购入了目前所使用的Thinkpad P51(i7+M1200,联想官方声称该机型通过了ubuntu认证)并安装了Ubuntu 16.04,就遇到了通过HDMI接口外接显示器(或电视)后,无法通过显示器(或电视)端的声音设备输出声音的问题,且在尝试上述的三种解决方法时都无法找到切换为HDMI的选项,HDMI的声音输出选项仿佛在电脑中消失了。系统更新为18.04后该问题依然存在。

该问题长期悬而未决,终于近日(3年后的昨天)让笔者在Nvidia的开发者社区和freedesktop上找到了解决方法,记录在此供将来重装系统参考。

问题描述

事实上,这个问题14年就在freedesktop上被报告🔗,报告者用的是一台Dell XPS 15(GT 540M显卡),在Windows下正常使用,在Ubuntu下无法识别HDMI声音设备。1

17年9月再次出现在Nvidia的开发者社区🔗,这次报告者用的一块GTX1080显卡。同样是无法通过HDMI输出声音。2

可以通过下列三种方式来共同查看该问题的特征。

查看声卡

命令:

aplay -l

 

输出:

**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC298 Analog [ALC298 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 7: HDMI 1 [HDMI 1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 8: HDMI 2 [HDMI 2]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 9: HDMI 3 [HDMI 3]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 10: HDMI 4 [HDMI 4]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

 

只有PCH [HDA Intel PCH]一种,找不到NVidia相关信息。

查看音频相关的pci设备

命令:

lspci | grep -i audio

 

输出:

00:1f.3 Audio device: Intel Corporation CM238 HD Audio Controller (rev 31)

 

同样找不到NVIDIA相关信息。

直接硬件访问再次查看音频相关的pci设备

命令:

sudo lspci -H1| grep -i audio

 

输出:

00:1f.3 Audio device: Intel Corporation CM238 HD Audio Controller (rev 31)
01:00.1 Audio device: NVIDIA Corporation Device 0fbc (rev a1)

 

这次有了NVIDIA相关信息了,说明并没有硬件问题。

解决方法

经笔者个人测试,方法一、二欠佳,可只看方法三。

方法一:重新扫描声卡

在freedesktop的帖子🔗中,报告者自己尝试了去解决这个问题。经过他的检查,发现重新扫描后可以检测到声卡。1

  • Start the system, and stop the display manager (lightdm/gdm)
  • Load the nouveau module
  • Remove the Nvidia card from the PCI bus (echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove)
  • Rescan the PCI bus (echo “1” > /sys/bus/pci/rescan)

这个方法比较繁琐,不适合笔者这样的小白,而且并不能一劳永逸。

方法二:编写重扫脚本

Nvidia的开发者社区中帖子的2楼🔗提供了一个重扫脚本2

setpci -s 01:00.0 0x488.l=0x2000000:0x2000000
rmmod nvidia-drm nvidia-modeset nvidia
echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove
echo 1 > /sys/bus/pci/devices/0000:00:01.0/rescan
modprobe nvidia-drm
xinit -- -retro

 

略简单,但仍然不够自动化,且电脑每次开机或从睡眠、待机中恢复时仍需要重新运行。

方法三:安装控制模块

在freedesktop的帖子的36楼🔗,一位叫Maik Freudenberg的大神将参考了这个解决思路写成了一个模块,并发布在了GitHub上,项目名为nvhda🔗。这个模块以C编写,使用方法在README.md中写的很明确了。3

笔者使用的是Ubuntu 18.04,使用过程如下。

安装模块

命令:

git clone git://github.com/hhfeuer/nvhda.git
cd nvhda
make
sudo make install

 

加载模块

命令:

sudo modprobe nvhda

 

打开HDMI声卡

命令:

sudo tee /proc/acpi/nvhda <<<ON

 

这时,如果再运行此前的aplay -llspci | grep -i audio应该都可以看到NVIDIA的相关信息了。在Settings-Sounds中也可以看到以HDMI为声音输出的选项了。

配置模块自动加载及声卡自动开启

此时声音已经可以通过HDMI设备输出,但每次重启后或从睡眠、待机中恢复,都需要重新加载模块、打开声卡。如想开机自启动或从睡眠、待机中恢复时仍然保持的话,仍需一些其他步骤:

自动加载模块

将模块名称nvhda贴入/etc/modules文件即可。
命令:

sudo gedit /etc/modules

 

贴入内容:

nvhda

 

自动开启声卡

大神已经也已在scripts中提供了自动开启的相关脚本,只需要将相关脚本复制进/etc/systemd/system并设置其启动就可以了。

命令:

sudo cp /scripts/nvhda-start.service /etc/systemd/system
sudo systemctl enable nvhda-start
sudo cp /scripts/nvhda-resume.service /etc/systemd/system
sudo systemctl enable nvhda-resume

 

查看声卡状态

命令:

cat /proc/acpi/nvhda

 

ON为开启,OFF为关闭

关闭HDMI声卡

如果需要关闭HDMI声卡,则命令为:

sudo tee /proc/acpi/nvhda <<<OFF
  • 1

问题原因

Nvidia的开发者社区中帖子的2楼🔗提到,这是因为一些笔记本在启动时禁用了 GPU的PCI音频设备。2

For some reason, a lot of recent laptops are set up to boot with the GPU’s PCI audio function disabled. I haven’t done much investigation, but you can turn on the audio function and make the kernel see it by setting the appropriate PCI configuration bit and then telling the kernel to rescan the PCI bus on the PCI bridge the GPU is connected to.
Unfortunately, the kernel won’t see the audio function unless you remove the graphics function first, which temporarily breaks the console. Because of that, it works best if you write a script to do it so you don’t have to SSH into the system or try to type the commands into the console blind. Obviously, you have to stop the X server first so that you can unload the NVIDIA drivers.

 

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

https://qastack.cn/ubuntu/78174/play-sound-through-two-or-more-outputs-devices

有了paprefs你有机会获得一个虚拟的输出设备,使同时输出到所有连接声卡/设备:

sudo apt install paprefs 

然后在终端运行中paprefs,选择“同步输出”选项卡,然后选中“添加虚拟输出以在所有本地声卡上同时输出”。

纸浆

可以从Pulseaudio声音首选项菜单的“输出”选项卡中选择另外创建的用于同时输出的音频输出设备:

在此处输入图片说明

在此示例中,它显示为HDMI设备,但是一旦您的蓝牙设备被识别,它也将可用于同时输出。

更改可能需要重新启动Pulseaudio才能通过注销并重新登录到会话或pulseaudio -k在终端中运行来生效。

 

在Kubuntu 18.04中,paprefs不需要Plasma 5.12 ,因为已经存在类似的设置:

在此处输入图片说明

重新启动后,应该会提供一个新的输出选项,称为“同步输出”。

在此处输入图片说明

或在pavucontrol

在此处输入图片说明


在等离子5.13.5的18.10中,“同步输出”选项已被删除,因此aprefs是必需的。

 

为了补充Takkat的出色回答,我发现为新设备提供的默认名称过长,并且扭曲了“声音设置”对话框。为了简化该名称,我不得不另外执行以下命令:

gconftool --set --type string /system/pulseaudio/modules/combine/args0 sink_properties=device.description=Combined

组合设备的声音设置

 

由于需要用HDMI外接音频设备,故想要改变电脑输出,本人用的为Ubuntu14.04,开始在网上搜寻怎么更改,查到需在声音设置里面更改音频输出为HDMI,可当我打开声音设置,嗯?怎么我的这么简单,我以为是我安装的问题,又看了其他同学的电脑包括Ubuntu16.04的,也是这个样子,没有什么HDMI输出的选项(有知道为什么的求告知),于是放弃了,然后找到了另外一个特别简单实用的方法。

 

Ubuntu 安装 Sound Switcher Indicator

https://blog.csdn.net/qq_30460905/article/details/79031699?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.add_param_isCf

通过命令行安装Sound Switcher Indicator,这 是一款选择 Ubuntu 声音输入/输出的面板应用小程序。可以实现耳机、扬声器和 HDMI 音效输出之间切换,无需进入系统设置>声音来改变多种音效装置之间切换。打开终端输入下面几行命令即可,安装完重启电脑,就会在界面右上角发现一个天线的标志,那就OK了!

 

sudo apt-add-repository ppa:yktooo/ppa
sudo apt-get update
sudo apt-get install indicator-sound-switcher

界面如下,可随时切换