Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

Запись звука с аудиокарты: 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.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max