Нет звука по HDMI в linux. Решение проблемы.


Звук по HDMI — одна из самых частых проблем в Ubuntu. Причины бывают разные: от банально не выбранного устройства вывода до регрессий в ядре и проблем с драйверами видеокарты.

Сегодня многие дистрибутивы linux внедряют работу аудио через PipeWire и зачастую именно это и становится причиной отсутствия вывода звука по кабелю HDMI.

PipeWire — это современный мультимедийный фреймворк для Linux, который управляет аудио‑ и видеопотоками с минимальной задержкой. Он задумывался как замена PulseAudio и JACK, при этом сохраняя совместимость с их клиентами.

Попробуем устранить эту проблему. Конечно откатываться с PipeWire обратно на PulseAudio мы не будем, но протестируем вывод звука и настроим PipeWire пошагово.

Шаг № 1.

Сначала вам нужно узнать точное название и аппаратный адрес вашего аудиовыхода HDMI (приемника). В терминале вводим следующую команду, чтобы вывести список всех аудиоприемников:

pactl list sinks

Мы должны увидеть нечто подобное:

pactl list sinks

В этом списке нам нужно найти и запомнить (записать) следующее:

  • Имя устройства. (В нашем случае это "alsa_output.pci-0000_00_1f.3.hdmi-stereo")
  • alsa.card (В нашем случае - это 0)
  • alsa.device (В нашем случае - это 3)

Шаг №2

Далее мы обойдем PipeWire, чтобы найти формат, поддерживаемый вашим оборудованием. Мы протестируем как 16-битный (`S16_LE`), так и 32-битный (`S32_LE`) форматы, поскольку один из них, скорее всего, будет работать.

Для этого нам необходим пакет speaker-test`, который входит в пакет `alsa-utils. При необходимости его можно установить командой:

sudo apt install alsa-utils

Запустите `speaker-test`, используя номера карты и устройства, которые вы нашли на шаге 1.

 - Тестирование в 16-битном формате:

speaker-test -c 2 -D hw:0,3 -F S16_LE

- Тестирование в 32-битном формате:

speaker-test -c 2 -D hw:0,3 -F S32_LE

Прислушайтесь к звуку из динамиков вашего дисплея. Когда вы услышите звук (шипение), то запомните, какой формат (`S16_LE` или `S32_LE`) сработал.

Шаг №3

 

Теперь мы создадим правило, которое заставит PipeWire использовать тот формат, который сработал.

- Создайте необходимый каталог и новый файл конфигурации:

         mkdir -p ~/.config/wireplumber/wireplumber.conf.d/
         touch ~/.config/wireplumber/wireplumber.conf.d/99-hdmi-format-fix.conf

- Откройте файл (`99-hdmi-format-fix.conf`) в своем любимом редакторе (например nano)

nano ~/.config/wireplumber/wireplumber.conf.d/99-hdmi-format-fix.conf

В открывшемся редакторе введите следующее:

monitor.alsa.rules = [
{
matches = [
{
node.name = "alsa_output.pci-0000_00_1f.3.hdmi-stereo"
}
]
actions = {
update-props = {
audio.format = "S16LE"
audio.channels = 2
audio.position = "FL,FR"
}
}
}
]

Важно !!! 

- В поле node.name необходимо ввести имя устройства, которое мы определили на 1 шаге (в нашем случае - это "alsa_output.pci-0000_00_1f.3.hdmi-stereo").

- Измените `audio.format` на значение, которое сработало для вас на шаге 2.

Шаг №4

Теперь необходимо перезапустить аудиосервисы, чтобы загрузить новое правило. Можно либо перезагрузить компьютер, либо ввести в терминале следующие команды:

- Перезапустите PipeWire и WirePlumber:

systemctl --user restart pipewire pipewire-pulse wireplumber

- Проверьте статус, чтобы убедиться, что перезапуск прошел успешно:

systemctl --user status pipewire pipewire-pulse wireplumber

- Убедитесь, что новое свойство было применено. Замените название устройства своим:

pw-cli list-objects | grep -A 30 "alsa_output.pci-0000_00_1f.3.hdmi-stereo"

В выводе для вашего устройства вы должны увидеть `audio.format = "S16LE"` (или любой другой формат, который вы установили).

Теперь звук через HDMI должен работать во всей системе.

 



Вернуться назад