Звук по HDMI не работает: переключаем sink на NVIDIA и AMD
Телевизор получает картинку, но молчит, а в aplay -l HDMI-карта прекрасно видна. Или наоборот: карты в списке нет, в wpctl пусто, а ты точно знаешь, что звук выведен через HDMI. Почти всегда причина одна из трёх: не выбран профиль карты, не активирован HDMI-порт или дефолтный sink у PipeWire остался на колонках 3.5 мм. Разбираемся шаг за шагом — от диагностики до рабочей конфигурации на карте NVIDIA или AMD.
Как проверить, видит ли система HDMI-звук?
Начинать надо не с настроек, а с опроса железа. Три команды покрывают почти все случаи:
aplay -l
aplay -L | grep -i hdmi
wpctl status
pactl list cards
В выводе aplay -l ищи строки вида HDA NVIDIA, HDMI 0, HDA ATI HDMI или HDA Intel PCH, HDMI 3. Это аудиофункция графического процессора — значит, драйвер поднял карту, и дальше вопрос только к настройке.
Дальше смотри wpctl status. В секции Sinks должен быть пункт с [vol] и, если он дефолтный, со звёздочкой. Если в списке только alsa_output.pci-0000_0c_00.0.analog-stereo — PipeWire не создал HDMI-sink, и это главный симптом.
pactl list cards даёт самое полезное: у каждой карты есть блок Profiles с параметром availability: yes или availability: no. Строка output:hdmi-stereo с availability: no — прямое указание, что монитор не сообщил системе о поддержке звука либо профиль не активирован.
Почему HDMI-карта молчит, если она есть в списке?
Карта может быть полностью рабочей, но без выбранного профиля PipeWire не создаёт для неё sink. У HDMI их обычно несколько: output:hdmi-stereo для стерео, output:hdmi-surround-51 для объёмного звука, output:hdmi-stereo+input:stereo если у монитора есть микрофон. Порт HDMI1/HDMI2 живут разными sink с разными профилями.
wpctl set-profile alsa_card.pci-0000_01_00.0 output:hdmi-stereo
wpctl status
Идентификатор карты берётся из wpctl status и aplay -l — часть после pci-. Имя можно сократить до уникального куска, например alsa_card.pci-0000_01_00, а профиль пишется строго как в pactl list cards, с двоеточием.
Вторая частая причина — порт. У одного sink бывает несколько портов (hdmi-output-0, hdmi-output-1), и активным считается только один:
pactl list sinks
pactl set-sink-port alsa_output.pci-0000_01_00.0-hdmi-stereo hdmi-output-0
Если в списке ты видишь Digital Output (S/PDIF) вместо HDMI, значит выбран цифровой выход, а HDMI-порт остался неактивным. Переключай туда и обратно, пока в pactl list sinks не появится нужный порт в состоянии active.
Почему звук уходит на 3.5 мм, а не в телевизор?
Самая частая жалоба: звук в HDMI работает, но в него играют только игры, а фильмы и музыка идут в наушники. Причина в том, что дефолтный sink у сессии не переключили:
wpctl status
wpctl set-default alsa_output.pci-0000_01_00.0-hdmi-stereo
wpctl set-volume alsa_output.pci-0000_01_00.0-hdmi-stereo 0.8
Команда меняет умолчание глобально — это то, что нужно, если HDMI используется постоянно. Для точечной маршрутизации удобнее pavucontrol: вкладка «Output Devices», там у каждой карты есть поле «Default Sink», а у каждого потока — свой список устройств. Это даёт картинку в HDMI, а звук в наушники без правки конфигов.
Когда правка нужна прямо из терминала, помогает перенос конкретного потока:
pactl list short sink-inputs
pactl move-sink-input 42 alsa_output.pci-0000_01_00.0-hdmi-stereo
Числовой ID берётся из первой команды. Способ рабочий, но ID живёт недолго: после перезапуска приложения он меняется, поэтому для постоянной схемы всё же лучше конфиг.
Что делать, если HDMI-звук скрыт на NVIDIA или AMD?
Обе карты отдают HDMI-аудио через один и тот же драйвер snd_hda_intel — в этом главная хорошая новость, логика настройки у них общая. Проверь, что модули вообще загружены:
lsmod | grep -E 'snd_hda|amdgpu|nvidia'
sudo modprobe snd_hda_intel
sudo modprobe snd_hda_codec_hdmi
Модуль snd_hda_codec_hdmi подгружается автоматически при обнаружении HDMI-кодека, но при ручной загрузке можно задать параметры модуля, которые иначе не применить:
# /etc/modprobe.d/99-hdmi-audio.conf
options snd_hda_intel power_save=0
options snd_hda_intel index=0
power_save=0 снимает классическую проблему, когда звук пропадал после нескольких минут бездействия и возвращался только перезагрузкой. index=0 управляет порядком нумерации карт: если у тебя встроенный звук и HDMI, индексы можно развести так, чтобы нужная карта всегда была первой — так проще запоминать имя sink.
На NVIDIA при этом нередко вылезает вторая проблема: карта есть, а звук HDMI не появляется совсем. Проверяй не только аудио, но и саму карту — если не отображается изображение, сначала почитай как поднять HDMI или DisplayPort на NVIDIA, а затем как устроен звук NVIDIA через PipeWire. Модуль nvidia сам по себе аудио не создаёт — карта появляется только после того, как в системе есть модуль NVIDIA.
На AMD amdgpu поднимает аудиофункцию автоматически, и если в aplay -l карта есть, а в wpctl пусто, проверь, не застрял ли профиль на Digital Output (S/PDIF) с пометкой off, и не отфильтровывает ли карту правило в /usr/share/wireplumber/. Быстрый способ понять, чьё это правило:
grep -rn "pci-0000_09_00" /usr/share/wireplumber/
Как подсунуть монитору EDID с аудио?
Если в pactl list cards у HDMI-профилей стоит availability: no, монитор не сообщил системе о поддержке звука. Чаще всего он просто в DPMS: разбуди экран, и профили появятся.
xset q
xset dpms force on
На Wayland управление питанием монитора живёт в композиторе, поэтому команда может не сработать — тогда просто уходи от компьютера на минуту и возвращайся, либо шевельни мышь у экрана.
Если монитор бодрствует, а EDID всё равно бедный, вытащи то, что система видит сейчас, и подставь свой:
sudo cat /sys/class/drm/card1-DP-1/edid > /tmp/edid.bin
edid-decode /tmp/edid.bin
Дальше правишь нужные байты (в edid-decode отредактируй секцию с аудио-дескрипторами) и закрепляешь файл модулем:
# /etc/modprobe.d/99-edid.conf
options amdgpu edid_firmware=0x1002:0x163c:/etc/edid/tv.bin
После правки модуль перечитывается только при перезагрузке или вручную:
sudo modprobe -r amdgpu
sudo modprobe amdgpu
Такой ручной EDID лечит и кейс, когда после установки WirePlumber звука нет вообще ни в одном приложении, — разбор этого сценария есть в заметке что делать, если пропал звук после установки WirePlumber.
Как закрепить HDMI в профиле WirePlumber и убрать рассинхрон?
Разовые команды живут до перезагрузки. Чтобы HDMI-карта поднималась с нужным профилем автоматически, добавь правило в конфиг сессии:
# /etc/wireplumber/20-wireplumber-rules.conf
monitor.alsa-card.pci-0000_01_00.0 {
profile = "output:hdmi-stereo"
available = true
}
node.nick = "sink"
node.name = "alsa_output.pci-0000_01_00.0-hdmi-stereo"
node.priority.driver = 100
Имена карты и sink копируй из wpctl status, придумывать их нельзя — правило просто не сработает. Файл 20-wireplumber-rules.conf загружается последним и потому перебивает дефолтные настройки. Если карта всё равно цепляет не тот профиль, посмотри как переключаются аудиопрофили в WirePlumber — там разобран механизм приоритетов.
Любые правки применяются без входа в графическую сессию:
systemctl --user restart wireplumber
wpctl status
Отдельная головная боль — рассинхрон: у телевизора есть собственная задержка, и картинка уезжает вперёд на десятки миллисекунд. Базовая компенсация делается одной командой:
pactl set-sink-latency alsa_output.pci-0000_01_00.0-hdmi-stereo 60000
Значение здесь в микросекундах, то есть 60 мс. Начинай с 50–70 мс и подбирай на глаз под конкретный телевизор — у дешёвых моделей задержка иногда достигает 150 мс.
Частые вопросы
Почему звук пропадает после пробуждения монитора?
Это сон карты, а не поломка. Звуковой движок уходит в энергосбережение вместе с HDMI-контроллером, а обратно не выходит, пока не сменится профиль. Помогает options snd_hda_intel power_save=0 в /etc/modprobe.d/ плюс перезагрузка. Как вторая мера — ручное пробуждение экрана через xset dpms force on.
Как понять, что устройство выбрано приложением, а не системой?
Открой wpctl status и найди секцию Streams: у каждого потока есть строка target: с тем sink, куда он идёт. Если там стоит не HDMI, значит маршрут задан приложением, и wpctl set-default его не перебьёт. В pavucontrol это видно прямо в списке потоков — колонка с устройством вывода редактируется кликом.
Можно ли оставить системный звук в наушниках, а HDMI отдать только играм?
Да, и это самый удобный вариант. Дефолтный sink остаётся аналоговым, а в настройках игры или в pavucontrol конкретному потоку назначается HDMI-sink. Плюс к этому в wireplumber.conf можно задать правила по application.name, чтобы аудиоигра всегда уходила в телевизор без ручной настройки.
Почему вместо HDMI в списке S/PDIF?
Цифровой выход S/PDIF и HDMI используют один и тот же кодек, и интерфейс выбирается профилем карты. Если в pactl list cards активен output:analog-stereo-digital, переключи на output:hdmi-stereo через wpctl set-profile. На ноутбуках с комбинированным выходом это иногда единственный способ получить звук в HDMI — через переключение профиля туда-обратно.
Звук в телевизоре есть, но игра отстаёт по времени
Сначала подними латенси командой pactl set-sink-latency, это безопасно. Если не помогло, проверь, не включены ли в самом приложении настройки типа «синхронизация с видео» или vsync с жёсткой привязкой аудио к видеопотоку. У Proton-игр на Wayland этот эффект лечится переменной окружения PROTON_ENABLE_WAYLAND=0 — тогда игра переходит на XWayland с более предсказуемой аудиосхемой.
Полезные ресурсы
- PipeWire — ArchWiki — устройства, профили, маршрутизация и правила в конфигах.
- Advanced Linux Sound Architecture — ArchWiki — уровень ALSA: карты, PCM, параметры модулей и работа с
aplay.
Заключение
Проблема «звук по HDMI не работает» почти всегда лечится на уровне профиля и порта, а не переустановкой системы. Начни с aplay -l и pactl list cards, чтобы понять, видит ли железо HDMI вообще, затем выставь output:hdmi-stereo через wpctl set-profile и назначь sink дефолтным. Если профиль недоступен, дело в DPMS или бедном EDID — буди монитор и, в крайнем случае, подставляй EDID вручную. Проверенные правила положи в wireplumber.conf, и HDMI перестанет ломаться после каждой перезагрузки.
Не получилось? Поможем настроить
Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Комментарии