Звук в браузере: как выбрать источник и переключить
Если Firefox играет в колонки, а ты хочешь в наушники, менять системный вывод ради этого не нужно: в PipeWire у каждого приложения свой поток, и его можно перетащить на другое устройство одним кликом. Ниже — как найти поток браузера, почему он иногда не виден в списке вообще и что делать, если переключение не срабатывает.
Как устроен звук браузера в PipeWire?
Firefox начиная с версии 141 умеет писать прямо в PipeWire — в about:config у него стоит media.cubeb.backend = pipewire, то есть нативный бэкенд, а не обёртка. Chrome и Chromium на Linux до сих пор ходят через PulseAudio API, а его на свежих Arch уже обслуживает мост pipewire-pulse. Разница только в обвязке, и она важна: оба браузера попадают в одну очередь — потоки воспроизведения, которые pactl называет sink-input, а в терминах PipeWire это просто входные потоки приёмника.
Второй момент, который регулярно сбивает с толку: Firefox создаёт отдельный поток для каждого процесса контента, и в списке ты увидишь не «Firefox», а несколько «Firefox Web Content». Chrome тоже дробит потоки по процессам, и один и тот же браузер легко даёт три-четыре строки. Запомни это, прежде чем искать, что переключать.
Проверить, с кем вообще говорит браузер, можно так:
pactl info | grep -E "Server Name|Server Version"
pactl list short sink-inputs
Вторая команда даёт строки вида индекс приёмника, индекс потока, медиа-строка, имя приложения. Имя и есть то, по чему ты ищешь браузер.
Где найти поток браузера?
В wpctl status смотри две секции: Clients — это воспроизведение, Stream — это запись с микрофона. Firefox и Chrome при обычном просмотре видео появляются именно в Clients, вместе с номером узла:
wpctl status | sed -n '/Clients/,/^$/p'
Если в списке его нет, но звук идёт, значит поток живёт в другой ветке. Тогда смотри список целиком, без фильтра:
pactl list sink-inputs | grep -E "Sink Input|application.name|Sink:"
Строка Sink: 0 — это номер текущего приёмника потока. Он же понадобится для ручного переключения.
Как переключить вывод у одного приложения?
Самый быстрый путь — pavucontrol. Открой вкладку «Playback» («Воспроизведение»): там перечислены все потоки, а в колонке «Устройство» у каждого стоит выпадающий список. Выбираешь наушники — поток уезжает туда мгновенно, перезапускать браузер не нужно. На вкладке «Applications» («Приложения») ты увидишь те же потоки сеткой «приложение — устройство», и там же меняется громкость отдельно от системной.
То же самое из терминала, если вкладки с графикой под рукой нет:
pactl list short sink-inputs
# 41 0 protocol-native.c Firefox Web Content protocol-native.c module-stream-restore
# 43 0 protocol-native.c chrome protocol-native.c module-stream-restore
pactl list short sinks
# 0 alsa_output.pci-0000_00_1f.3.analog-stereo module-alsa-card
# 1 bluez_output.AC_12_2F_9B_00_11.1 module-bluetooth-discover
pactl move-sink-input 41 1
move-sink-input меняет приёмник потока на лету. Громкость и mute конкретного потока живут отдельными командами: pactl set-sink-input-volume 41 40% и pactl set-sink-input-mute 41 1.
Если ты переключаешь один и тот же браузер постоянно, есть способ запомнить выбор. В /etc/wireplumber/wireplumber.conf есть секция wireplanner с параметром restore-streams = true, которая заставляет WirePlumber восстанавливать привязку потока к приёмнику после перезапуска источника. Подробности — в man 5 wireplumber.conf.
Почему браузера нет в списке?
Разбираем по частоте. Первое и самое частое: ты ищешь «Firefox», а поток называется «Firefox Web Content», и фильтр по имени его отсекает. Второе: браузер запустился раньше, чем поднялась звуковая сессия, и подхватил приёмник-заглушку auto_null — звука не слышно, поток есть, но он никуда не выводится. Проверь это:
pactl list short sinks | grep auto_null
pactl get-default-sink
Если дефолтный приёмник вдруг auto_null, значит система звука ещё не поднялась или упала. Третье: браузер запущен как Flatpak или Snap, у которого нет доступа к звуковому сокету, — тогда он пойдёт через портал, и поток получит имя вроде Chromium с другим application.process.binary. Четвёртое, банальное: поток есть, но у него нулевая громкость или mute, и в некоторых сборках pavucontrol такие строки прячет вниз списка.
Универсальный ответ на «не вижу потока»: закрой браузер полностью, убедись, что дефолтный приёмник настоящий, и запусти его снова.
Как заставить Firefox говорить с PipeWire напрямую?
Открой about:config и проверь префы с префиксом media.cubeb:
media.cubeb.backend = pipewire
media.cubeb.output_device = <имя устройства>
media.cubeb.input_device = <имя устройства>
Значение pipewire в media.cubeb.backend включает нативный бэкенд; alsa и pulse оставят браузер на старой обвязке. Пустой media.cubeb.output_device означает «устройство по умолчанию», а явное имя прибивает браузер к конкретному приёмнику — удобно, когда у тебя два наушника. Любой из этих префов требует полного перезапуска браузера, а не перезагрузки вкладки. Диагностическая страница about:webrtc показывает, какой бэкенд реально подхватился и какие устройства он видит.
У Chrome выбор приёмника для вывода в настройках отсутствует: на Linux он следует системному дефолту, поэтому через него проблему с «не тем» выводом не решить. Права на микрофон и камеру живут в chrome://settings/content.
Как выбрать микрофон в браузере?
В Firefox открой about:preferences#privacy, раздел «Permissions», строка «Микрофон» → «Settings». Там можно задать микрофон по умолчанию или заставить браузер спрашивать каждый раз. Кто именно держит микрофон прямо сейчас, видно на панели значков расширений: иконка микрофона → вкладка «Запись» со списком активных сайтов. У Chrome похожий список на странице `chrome://settings/content/microphone», а в самом Chrome на панели сайта есть тумблер «Микрофон».
Если микрофон не появляется вообще, проверь портал — он нужен песочницам Flatpak и Snap:
ps -ef | grep -E "xdg-desktop-portal|pipewire" | grep -v grep
Подробности о связке с PulseAudio-совместимостью и о том, почему при смене провайдера слетают потоки, я разбирал в заметке про PipeWire и KDE Plasma с PulseAudio. Симптомы «пропал звук после обновления» там описаны с другой стороны — если у тебя именно такое, иди сначала туда.
Что делать, если звук не переключается вообще?
Когда перетаскивание потока не помогает, указывай дефолтный приёмник до запуска браузера. Имя приёмника берётся из pactl list short sinks:
pactl set-default-sink bluez_output.AC_12_2F_9B_00_11.1
firefox &
Так браузер сразу подхватит нужное устройство, а не первое попавшееся. Проверить права на устройство и membership в группе аудио тоже полезно: без них вообще ничего не заработает.
ls -l /dev/snd
id -nG | tr ' ' '\n' | grep -E "^(audio|video|lp)$"
Если потоки не появляются вообще, посмотри, что происходит в PipeWire прямо сейчас:
pw-cli ls Node
pw-top
systemctl --user status pipewire wireplumber --no-pager
journalctl --user -u wireplumber -b --no-pager | tail -30
pw-cli ls Node покажет узлы и их состояния, pw-top — живые потоки с уровнями сигнала, а журнал WirePlumber объяснит, почему поток не привязался.
Частые вопросы
Firefox не показывается в wpctl status, хотя звук идёт. Что делать?
Скорее всего, браузер говорит через PulseAudio-совместимость, и его поток виден только в pactl list sink-inputs, но не в нативной секции Clients. Это нормально для старых версий Firefox и для Chromium. Переключать такой поток можно командой pactl move-sink-input.
Воспроизведение работает, микрофон в браузере молчит.
Проверь, что микрофон вообще виден системе: pactl list short sources. Если источник есть, а в браузере нет, проверь разрешения сайта в about:preferences#privacy и перезапусти вкладку — правка микрофона применяется к процессу, а не к странице мгновенно.
Можно ли сделать так, чтобы один браузер всегда выбирал наушники?
Да, через скрипт, который после запуска браузера переносит его поток на нужный приёмник. Более чистый путь — правило WirePlumber с restore-streams = true, оно запоминает привязку потока и возвращает её после перезапуска звуковой сессии.
Почему браузер продолжает играть в старые наушники после их отключения?
Поток привязан к конкретному приёмнику, и пока ты не перетащишь его руками, он продолжит туда стримить, даже если устройство пропало. pactl move-sink-input или смена pactl set-default-sink с перезапуском браузера решают вопрос.
Полезные ресурсы
- PipeWire в ArchWiki — устройства, сессии, узлы.
- PulseAudio в ArchWiki — команды
pactlи модули совместимости. - PipeWire не запускается: конфликт с PulseAudio — разбор типичных конфликтов.
- Нет звука после установки WirePlumber — если поток не появляется в списке вообще.
Заключение
Браузер в PipeWire — обычное приложение с обычным потоком, а не особый случай: sink-input находится, переключается и запоминается. Держи под рукой pactl list sink-inputs для диагностики и move-sink-input для ручного переключения, а если поток не появляется — начни с проверки дефолтного приёмника и полного перезапуска браузера.
Не получилось? Поможем настроить
Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Комментарии