如何通过HDMI为7.1环绕声配置PulseAudio?


10

我的机器通过HDMI连接到接收器。但是,当我尝试在PulseAudio中使用两个以上的通道时,我只会得到两个。pacmd list cards显示卡,但不显示具有两个以上频道的HDMI配置文件。

我已经确认7.1声音可以通过ALSA起作用:

pasuspender -- speaker-test -D hdmi -c 8 -m FL,FC,FR,RR,RRC,RLC,RL,LFE

产生在房间周围散布的静电。

Answers:


20

在PulseAudio中,每个声卡都有与之关联的配置文件集。一个配置文件集包含多个配置文件,这些是列出卡时(或在各种PulseAudio GUI中查看时)看到的配置文件。

有一个default配置文件,主要包含对模拟声音输出有用的内容。还有一个extra-hdmi配置文件会自动应用于某些HDMI输出,并提供高达5.1的选项。不幸的是/usr/share/pulseaudio/alsa-mixer/profile-sets,这两个配置文件都在中,因此您无法真正对其进行编辑(我已将其提交给Debug Bug736708。)根据文档,您可以禁用基于udev的自动发现,并手动配置所有内容-让我们指定个人资料的完整路径。但是事实证明,虽然没有记录,但udev也可以指定完整路径。

设置udev规则以分配配置文件集

您可以通过设置PULSE_PROFILE_SETudev环境变量来在udev规则中分配配置文件集。据记录,该文件只能在上述/usr子目录中使用文件,但完整路径也可以使用。就我而言,我创建了以下规则:

# cat /etc/udev/rules.d/95-local-pulseaudio.rules 
ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1c20", ENV{PULSE_PROFILE_SET}="/etc/pulse/my-hdmi.conf"

您将需要使用适当的PCI供应商和设备编号,可以从中轻松获得lspci -nn

创建udev规则后,您可以立即使用udevadm trigger -ssound。您可能还希望重建initramfs(update-initramfs -u

确认udev规则对生效udevadm info --query=all --path /sys/class/sound/card0(当然,请使用适当的卡号)。您应该E: PULSE_PROFILE_SET=/etc/pulse/my-hdmi.conf在输出中看到。如果没有,请不要继续。它不会工作。udev规则出了点问题(或者您可能没有触发它们-您可以随时尝试重新启动)。

创建/etc/pulse/my-hdmi.conf文件

注意:通道图显然是特定于系统的。您需要进行实验以使其适合您的系统。我很幸运,我的7.1布局仅涉及删除最终的项目以构建5.1、4.0等。说明如下。

大多数情况下,这是很多复制和粘贴。每个部分的区别在于(a)名称,(b)描述,(c)频道映射,(d)[可选]优先级。

[General]
auto-profiles = yes

[Mapping hdmi-stereo]
device-strings = hdmi:%f
channel-map = front-left,front-right
description = Digital Stereo (HDMI)
priority = 4
direction = output
paths-output = hdmi-output-0

[Mapping hdmi-surround-40]
device-strings = hdmi:%f
channel-map = front-left,front-right,rear-left,rear-right
description = Digital Quadrophonic (HDMI)
priority = 1
direction = output
paths-output = hdmi-output-0

[Mapping hdmi-surround-51]
device-strings = hdmi:%f
channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
description = Digital Surround 5.1 (HDMI)
priority = 2
direction = output
paths-output = hdmi-output-0

[Mapping hdmi-surround-71]
description = Digital Surround 7.1 (HDMI)
device-strings = hdmi:%f
channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right
priority = 3
direction = output
paths-output = hdmi-output-0

现在,测试一下:

  1. pulseaudio -k以普通用户的身份重新启动PulseAudio:,并假设您使用的是每用户守护程序(默认)。重新启动它,即使是简单的aplay -l也可以。
  2. 切换到7.1配置文件。就个人而言,我曾经pactl set-card-profile 0 "output:hdmi-surround-71"这样做过,但是GUI也可以很好地工作。
  3. 运行speaker-test -c 8 -t w。它应该开始宣布发言人姓名,希望能从每个发言人中选出正确的姓名。如果名称不是来自正确的扬声器,则必须更改通道图以使其正确。更改每个通道映射后,必须再次重新启动PulseAudio。

奖金!更有用的设置

在中/etc/pulse/daemon.conf,您可能需要更改一些设置:

enable-remixing—如果打开,则立体声信号的左声道将从所有三个左扬声器中播放,而右声道则从右扬声器中播放。如果关闭,它只会排在前两个。请注意,您还可以将配置文件更改为立体声(仅从HDMI端口发送立体声,并让接收器决定如何将其映射到扬声器)。

enable-lfe-remixing —类似,但用于混音至LFE(低音炮)通道。

default-sample-format—如果您的HDMI设置支持大于16位的音频,则可能需要将其增加到s32le(从默认值开始s16le)。

default-sample-ratealternate-sample-rate—如果您主要使用通常为48KHz的DVD来源的材料,则可能希望交换它们(甚至可能完全禁用44.1KHz)。或者,如果您的HDMI接收器支持它,则可以一直提高到192KHz。请注意,176KHz具有44.1和48KHz的偶数倍的良好特性。请参阅下文,了解如何确定您的接收器支持什么

default-sample-channels—似乎并不重要。个人资料可能会覆盖它...

自然,您必须在更改此文件后重新启动PulseAudio。

再次奖金!看看您的接收器支持什么

有些eld.*文件/proc/asound告诉您HDMI链接的另一端声称支持什么。例如:

# cat /proc/asound/card0/eld#3.0 
monitor_present         1
eld_valid               1
monitor_name            TX-SR606
connection_type         HDMI
eld_version             [0x2] CEA-861D or below
edid_version            [0x3] CEA-861-B, C or D
manufacture_id          0xcb3d
product_id              0x863
port_id                 0x0
support_hdcp            0
support_ai              1
audio_sync_delay        0
speakers                [0x4f] FL/FR LFE FC RL/RR RLC/RRC
sad_count               8
sad0_coding_type        [0x1] LPCM
sad0_channels           2
sad0_rates              [0x1ee0] 32000 44100 48000 88200 96000 176400 192000
sad0_bits               [0xe0000] 16 20 24
sad1_coding_type        [0x1] LPCM
sad1_channels           8
sad1_rates              [0x1ee0] 32000 44100 48000 88200 96000 176400 192000
sad1_bits               [0xe0000] 16 20 24
sad2_coding_type        [0x2] AC-3
sad2_channels           8
sad2_rates              [0xe0] 32000 44100 48000
sad2_max_bitrate        640000
sad3_coding_type        [0x7] DTS
sad3_channels           8
sad3_rates              [0xc0] 44100 48000
sad3_max_bitrate        1536000
sad4_coding_type        [0x9] DSD (One Bit Audio)
sad4_channels           6
sad4_rates              [0x40] 44100
sad5_coding_type        [0xa] E-AC-3/DD+ (Dolby Digital Plus)
sad5_channels           8
sad5_rates              [0xc0] 44100 48000
sad6_coding_type        [0xb] DTS-HD
sad6_channels           8
sad6_rates              [0x1ec0] 44100 48000 88200 96000 176400 192000
sad7_coding_type        [0xc] MLP (Dolby TrueHD)
sad7_channels           8
sad7_rates              [0x1480] 48000 96000 192000

因此,您可以看到我的接收器在多达8个通道,192KHz,24位声音的情况下支持LPCM(线性PCM,即未压缩的音频)。它还支持AC3,DTS,DSD,DD +,DTS-HD和Dolby TrueHD。因此,如果我使用这些文件编码,则可以传递那些格式(如果我的媒体播放器支持的话,当然mpv可以)。


感谢您为此付出的一百万美元,在安装过程中苦苦挣扎了一段时间。对我来说,udev规则并不首先适用,因此我必须重新启动PC。虽然有一个问题.. @derobert看来我无法通过X265、7.1音频流。我只需要使用PC对其进行解码并传输音频流。(尽管我的接收器是5.1),您有什么建议吗?谢谢!
dimuthu

@dimuthu H.265(x265)是视频编解码器,而不是音频编解码器。请注意,PulseAudio仅对传递具有有限的支持,需要将其启用(最容易在GUI中使用),并且可能需要将其设置为立体声(仅实现传递方式的实现细节,而不是对通道数的实际限制) )。我似乎记得Kodi Wiki上有详细信息的页面。
derobert

1
@dimuthu(对不起,第二条评论,SE应用程序正在尝试编辑时崩溃了……)我想5.1接收器仅支持AC3和DTS。不是,例如,AAC。除非它允许您在接收器上使用某些功能,否则您将无法通过多通道PCM使用该功能。至少没有通过HDMI。
derobert

是的,您是对的,实际上是通过将PulseAudio设置为“立体声HDMI”来传递音频。这是我可以将比特流音频发送到接收器的唯一方法。还对AAC进行了深入研究,即使Yahama并未在其规格上提及任何内容,但我在网上发现了一些证据表明它仅适用于高端型号。我是否通过使用HTPC进行解码而失去了太多细节?我将其设置为7.1Ch / 192KHz,24位。谢谢!
dimuthu

@dimuthu,只要您在PulseAudio中设置了合理的质量速率转换器,您在PC上进行解码就不会造成任何损失。好吧,除了一些CPU时间(尤其是在该采样率下,毫无疑问,这远远超过了原始资料),什么都没有
-derobert
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.