Звук по HDMI — одна из самых частых проблем в Ubuntu. Причины бывают разные: от банально не выбранного устройства вывода до регрессий в ядре и проблем с драйверами видеокарты.
Сегодня многие дистрибутивы linux внедряют работу аудио через PipeWire и зачастую именно это и становится причиной отсутствия вывода звука по кабелю HDMI.
PipeWire — это современный мультимедийный фреймворк для Linux, который управляет аудио‑ и видеопотоками с минимальной задержкой. Он задумывался как замена PulseAudio и JACK, при этом сохраняя совместимость с их клиентами.
Попробуем устранить эту проблему. Конечно откатываться с PipeWire обратно на PulseAudio мы не будем, но протестируем вывод звука и настроим PipeWire пошагово.
Шаг № 1.
Сначала вам нужно узнать точное название и аппаратный адрес вашего аудиовыхода HDMI (приемника). В терминале вводим следующую команду, чтобы вывести список всех аудиоприемников:
pactl list sinks
Мы должны увидеть нечто подобное:
В этом списке нам нужно найти и запомнить (записать) следующее:
Шаг №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 должен работать во всей системе.