Запись звука с аудиокарты: loopback в PipeWire
Если тебе нужно записать именно тот звук, который слышно в наушниках или колонках, обычный микрофон не поможет: он слышит воздух, а не цифровой поток. В PipeWire такую задачу закрывает утилита pw-loopback из пакета pipewire — она создаёт виртуальный источник и копирует в него звук с выхода. Дальше его можно записать в файл через ffmpeg, подключить как микрофон в OBS или в KDE Plasma. Ниже — рабочие команды и способ не словить обратную связь.
Зачем нужен pw-loopback и как он работает?
В PipeWire звук живёт в графе узлов. У карты есть узел-приёмник (sink), куда приложения сливают свои потоки, и узел-источник (source), откуда берут запись. Приложение никогда не пишет прямо в железку, поэтому «снять» то, что слышно, можно только до колонок — из графа.
pw-loopback строит виртуальный узел с двумя концами. Один конец помечается как Audio/Sink — это вход, куда можно перенаправить приложение. Второй помечается как Audio/Source — это выход, откуда берут запись. По умолчанию целью копирования становятся все sink’и системы, поэтому в источник попадает всё, что играет в колонки.
sudo pacman -S pipewire wireplumber ffmpeg
Сразу посмотри, что есть в системе:
pactl list short sinks
pactl list short sources
Вторая команда важнее первой: у каждого sink’а обычно есть пара «приёмник + его monitor». Monitor — это тот же сигнал, что уходит в наушники, но поданный как источник.
Как записать системный звук через ffmpeg?
Рабочих путей два, и оба короткие.
Путь первый — monitor. PipeWire-Pulse отдаёт каждому sink’у источник с именем вида <sink>.monitor, поэтому достаточно одной команды:
ffmpeg -f pulse -i default.monitor -vn -c:a flac zapis.flac
Это самый быстрый способ, когда писать нужно весь системный микшер и разделять приложения не требуется.
Путь второй — pw-loopback. Запускаешь виртуальный узел, а во второй вкладке терминала пишешь в него:
pw-loopback --capture-props="{ media.class=Audio/Source node.name=loopback-src node.description=LoopbackSRC }" \
--playback-props="{ media.class=Audio/Sink node.name=loopback-out node.description=LoopbackOUT }"
ffmpeg -f pulse -i loopback-src -vn -c:a flac zapis.flac
Узел живёт столько же, сколько открытый терминал, — для разовых записей это удобно, а для постоянного виртуального микрофона его лучше завернуть в systemd-юнит или в конфиг WirePlumber.
Нужно писать только с одной карты? Добавь --target с именем узла из pactl list short sinks:
pw-loopback --target=alsa_output.pci-0000_00_1f.3.analog-stereo \
--capture-props="{ media.class=Audio/Source node.name=loopback-src }" \
--playback-props="{ media.class=Audio/Sink node.name=loopback-out }"
Как сделать из loopback виртуальный микрофон?
Схема простая: приложение играет в виртуальный sink, а OBS или мессенджер берёт звук с виртуального source. Так можно писать приложения по отдельности и не трогать системный микшер.
pw-loopback \
--capture-props="{ media.class=Audio/Source node.name=VirtualMic node.description=VirtualMic device.api=pw-loopback }" \
--playback-props="{ media.class=Audio/Sink node.name=VirtualOut node.description=VirtualOut device.api=pw-loopback }"
Дальше три шага. В pavucontrol на вкладке с потоками воспроизведения у нужного приложения смени устройство вывода на VirtualOut. В OBS добавь источник «Аудиовход» (Audio Input Device) и укажи VirtualMic. В KDE Plasma виртуальные устройства видны в «Параметры системы → Звук»; если в системе загружен модуль ksnake, там же появляется его виртуальный вход.
Если же в системе вообще нет звука после установки WirePlumber, начни с разбора этой поломки — без живой звуковой сессии виртуальный узел просто не появится в списке: что делать, когда пропал звук.
Как записать одну игру, а не весь системный микшер?
Создай отдельный приёмник для игры и нацель pw-loopback на него. Так в запись попадёт только игра, а системные звуки останутся в стороне.
pactl load-module module-null-sink sink_name=GameSink sink_properties=device.description=Game
В настройках игры укажи выводом устройство GameSink, затем подними захват:
pw-loopback --target=GameSink \
--capture-props="{ media.class=Audio/Source node.name=game-capture }" \
--playback-props="{ media.class=Audio/Sink node.name=game-mix }"
ffmpeg -f pulse -i game-capture -vn -c:a flac igra.flac
Схема работает и без pw-loopback: маршрутизация на отдельный sink плюс запись его monitor’а. Но явный захват удобнее, когда нужно поймать ещё и звук из вкладки браузера, подключённой к тому же приёмнику.
Почему при записи слышно эхо и как его избежать?
Эхо — это петля, в которой сигнал возвращается в себя. На практике встречаются две.
Первая — акустическая: микрофон слышит колонки. Если писать микрофоном и слушать запись через те же колонки, часть звука возвращается в капсюль и петля замыкается сама. Лечится наушниками или выносом колонок из зоны слыха.
Вторая — графовая: цель --target совпадает с тем, через что ты слушаешь ушами. Каждый фрагмент попадает в запись дважды. Правило простое: не пиши в тот же микшер, из которого берётся запись, и не отправляй игру в приёмник, который слушаешь в колонках.
Проверяется петля без расчётов: в pavucontrol открой вкладку с потоками записи и посмотри, сколько потоков реально попадает в источник. Один поток — петли нет, два — есть, и видно, кто лишний.
Как проверить, что виртуальный источник появился?
wpctl status
pw-cli ls Node
wpctl status показывает sink’и и source’ы с полными именами — именно эти имена нужны ffmpeg. pw-cli ls Node выводит весь граф, включая только что созданный узел.
Если источника нет в списке, проверь имя и сервер:
pactl list short sources
pactl info | grep -i "server name"
ffmpeg -f pulse -i loopback-src -t 1 /dev/null
Последняя команда делает пробную запись секунды в никуда — быстрый способ отделить проблему ffmpeg от проблемы PipeWire. Имя узла в ffmpeg должно совпадать с node.name, а не с подписью, которую показывает панель. Если в pactl info сервером окажется не PipeWire-Pulse, а отдельный PulseAudio, ffmpeg будет работать совсем с другим списком устройств: разбор конфликта PulseAudio и PipeWire.
Какие опции ffmpeg помогут получить готовый клип?
# MP3 для клипа
ffmpeg -f pulse -i loopback-src -vn -c:a libmp3lame -b:a 192k klip.mp3
# AAC — универсальный вариант для OBS и соцсетей
ffmpeg -f pulse -i loopback-src -vn -c:a aac -b:a 256k klip.m4a
# FLAC без потерь, если планируешь монтировать
ffmpeg -f pulse -i loopback-src -vn -c:a flac -ar 48000 klip.flac
# Ограничить запись десятью минутами
ffmpeg -f pulse -i loopback-src -vn -t 600 -c:a flac klip.flac
Ключевые флаги: -vn отключает попытку писать видео, -ar 48000 приравнивает частоту к системной (её показывает pactl info | grep -i "sample spec"), -t ограничивает длительность. Если клип пойдёт в монтаж или на площадку с нормализацией громкости, добавь loudnorm:
ffmpeg -f pulse -i loopback-src -vn -af "loudnorm=I=-16:LRA=11:TP=-1.5" -c:a flac klip.flac
Хочется на ходу добавить компрессор или эквалайзер прямо в запись — проще пропустить поток через EasyEffects, про него разбор фильтров: эквалайзер и фильтры EasyEffects.
Частые вопросы
Можно ли записать звук, не создавая виртуальный микрофон?
Да, и это самый частый случай. Monitor снимает поток после микшера, но до усилителя — ровно то, что уходит в наушники. Команда ffmpeg -f pulse -i default.monitor -c:a flac zapis.flac работает сразу, ничего запускать в фоне не нужно.
Нужен ли pw-loopback, если есть monitor?
pw-loopback нужен в трёх случаях: пишешь один поток из многих, нужен стабильный виртуальный микрофон для OBS или мессенджера, который не зависит от активного устройства вывода, или не хочется трогать конфигурацию Pulse-совместимого слоя. Monitor удобнее, когда пишешь весь системный микшер и не возишься с виртуальными устройствами.
Почему в панели звука нет нового источника?
Чаще всего процесс pw-loopback завершился вместе с терминалом — узел исчез из графа. Второй момент: в pavucontrol и в панели Plasma виртуальный источник лежит на вкладке с микрофонами, а не среди устройств вывода. И если источника нет в pactl list short sources, дело не в панели, а в самом процессе — смотри его вывод.
Что делать, если ffmpeg не видит источник pw-loopback?
Сначала сверь имя: ffmpeg ждёт node.name, а не текст подписи в панели. Затем проверь pactl info | grep -i "server name" — при живом PulseAudio ffmpeg получит чужой список устройств. И сделай пробную запись в /dev/null на секунду: если файл пустой, проблема в маршрутизации, а не в кодеке.
Полезные ресурсы
- ArchWiki: PipeWire — устройства, маршрутизация, работа с графом узлов.
- ArchWiki: FFmpeg — параметры кодирования и захвата с устройств.
Заключение
Запись того, что слышно, в PipeWire делается в пару команд: monitor для быстрой записи всего микшера или pw-loopback для отдельных приложений и виртуального микрофона. Проверяй результат вкладкой с потоками записи и держи запись в наушниках — тогда обратная связь не появится, а готовый файл сразу уходит в монтаж или в OBS.
Не получилось? Поможем настроить
Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Комментарии