PipeWire (Русский)
PipeWire это новый низкоуровневый мультимедийный фреймворк. Он предназначен для захвата и воспроизведения аудио и видео с минимальной задержкой и поддерживает PulseAudio (Русский), JACK, ALSA и приложения, использующие GStreamer.
Данный фреймворк может быть использован как звуковой сервер (с поддержкой функционала PulseAudio и JACK), так и для захвата экрана.
PipeWire также поддерживает контейнеры по типу Flatpak и не зависит от пользовательских групп audio и video, а использует модель безопасности основанную на Polkit для запроса у Flatpak или Wayland разрешений для записи экрана или захвата звука.
Установка
Установите pipewire из официальных репозиториев.
PipeWire использует systemd/User (Русский) для управления сервером и автоматической активации сокетов.
Опционально, вы можете установить pipewire-docs для просмотра документации. Другие пакеты, такие как pipewire-alsa, pipewire-pulse, и pipewire-jack используются PipeWire для управления вместо PulseAudio/JACK. Так же доступны 32-битные библиотеки lib32-pipewire и lib32-pipewire-jack.
GUI
- Helvum — GTK обёртка для pipewire, вдохновленная подобным инструментом для JACK catia.
Использование
Демонстрация экрана WebRTC
Большинство браузеров для работы WebRTC и захвата рабочего стола или отдельных приложений используют X11. На Wayland используется подход, основанный на механизме разрешений.
Для этого требуются пакет xdg-desktop-portal и один из следующий бэкэндов:
- xdg-desktop-portal-gtk для GNOME.
- xdg-desktop-portal-kde для KDE.
- xdg-desktop-portal-wlr для оболочек, использующих композитор wlroots (напр. Sway, dwl)
Firefox (84+) поддерживает данный механизм по умолчанию. Для Chromium (73+) нужно активировать поддержку вручную включением экспериментального флага:
chrome://flags/#enable-webrtc-pipewire-capturer
Для работы xdg-desktop-portal-wlr
требуется установить pipewire-media-session [1] и удостовериться, что указаны переменные окружения XDG_CURRENT_DESKTOP=sway
[2] и XDG_SESSION_TYPE=wayland
[3].
xdg-desktop-portal-wlr
необходимо использовать параметр --output=Monitor
путем редактирования строки ExecStart=
в юните systemd. Пример такой строки: ExecStart=@libexecdir@/xdg-desktop-portal-wlr --output=eDP-1
Обратите внимание, что захват поддерживается только демонстрация экрана, а не для отдельного окна/приложения [5][6].
Видео
Несмотря на то, что PipeWire не является стандартным средством, вы можете без опасения использовать его, например для захвата с вебкамеры. Так как большинство приложений используют GStreamer для этих целей, вы можете использовать плагин GStreamer#PipeWire.
Аудио
PipeWire может быть использован как звуковой сервер наподобие PulseAudio и JACK. Он нацелен их на полную замену путем предоставления реализации PulseAudio-совместимого сервера и ABI-совместимых библиотек для клиентов JACK. Подробнее смотерть здесь.
Поддержка ALSA/Legacy
Установите pipewire-alsa для перенаправления приложений, использующих ALSA API, через PipeWire.
Поддержка PulseAudio
Установите pipewire-pulse. Этот пакет заменит установленные pulseaudio и pulseaudio-bluetooth. Необходимо перезагрузиться или выполнить systemctl start --user pipewire-pulse.service
для работы.
Как правило, этого достаточно для дальнейшей работы, так как сервис pipewire-pulse.socket
должен быть автоматически включен. Для проверки работоспособности, выполните следующую команду и изучите вывод:
$ pactl info
... Server Name: PulseAudio (on PipeWire 0.3.16) ...
Если PipeWire не работает после запуска системы, убедитесь что systemd/User (Русский) сервисы pipewire-pulse.service
, pipewire.service
, и pipewire-media-session.service
включены и работают. Имейте в виду, что pipewire-pulse.service
и pipewire-pulse.socket
используют ConditionUser
, а не работают под рут пользователем.
Поддержка JACK
Установите pipewire-jack и используйте pw-jack
для запуска JACK-совместимых приложений заместо libjack*
:
pw-jack application
Также вы можете использовать другой размер буфера путем установления нужного соотношения размера буфера и частоты дискретизации (что равно задержке в секнудах):
PIPEWIRE_LATENCY="128/48000" pw-jack application
В качестве альтернативы, вы можете установить pipewire-jack-dropinAUR или удалить jackAUR/jack2 для автоматического использования библиотек приложениями использующими JACK.
Выполните ldd
для проверки правильности линковки библиотек:
$ ldd /usr/bin/qjackctl | grep -i libjack
libjack.so.0 => /usr/lib/pipewire-0.3/jack/libjack.so.0 (0x00007f7e5080a000)
Bluetooth устройства
Для управления Bluetooth audio устройствами PipeWire использует pipewire-pulse. Говоря более конкретно, сервис PipeWire проверяет наличие /etc/pipewire/media-session.d/with-pulseaudio
и подключает модуль bluez5
автоматически, если он установлен в системе.
Работа PipeWire поверх JACK
PipeWire также может работать как клиент JACK, если это необходимо. Подробнее смотреть здесь
Постобработка аудио
EasyEffects
EasyEffects (ранее PulseEffects) это GTK утилита предоставляющая большой набор аудио эффектов и фильтров для использования в потоках отдельных приложений и микрофона. Присутствуют большинство основных эффектов, таких как эквалайзер, выравнивание громкости, усиления низких частот, дэ-эссер и подавления шумов. Полный список эффектов и фильтров можно посмотреть на GitHub.
Для использования установите easyeffects. Так же можете посмотреть коллекцию пользовательских пресетов для настройки.
NoiseTorch
NoiseTorch это альтернативный способ для шумоподавления. Для использования установите noisetorchAUR, либо одну из этих версий пакета noisetorch-binAUR noisetorch-gitAUR
После запуска модуля требуется выбрать нужный микрофон. Имеется возможность выбора нужного порога активации. Для того, что бы не фильтровать голос, установите максимальный уровень.
Плагины LADSPA, LV2 и VST
Если вы хотите использовать плагины LADSPA, LV2 и VST, вы можете применить их используя виртуальный аудиовход Pulseaudio и хост Jack Carla. Установите pipewire-pulse, pipewire-jack и carla. Для начала создайте новый аудиовход в Pulseaudio под названием default_null_sink
.
pactl load-module module-null-sink object.linger=1 media.class=Audio/Sink sink_name=default_null_sink channel_map=FL,FR
Запустите Carla через PipeWire pw-jack carla-rack
. Во вкладке Rack добавьте плагины по желанию. Удостоверьтесь, что они имеют тип stereo. Вы можете поменять их очередность, в которой они будут работать, начиная с верха списка. После этого переместитесь во вкладку Patchbay и подключите default_null_sink
к вводу Carla, а вывод Carla к нужному устройству воспроизведения (наушники, колонки, HDMI и т.п.). Сохраните конфигурацию в домашнюю директорию, напр. в ~/Documents/carla_sink_effects.carxp
.
Вы можете протестировать эффекты в любом медиа приложение, производящем звук, например просмотром видео в браузере. Есть два способа сделать это. Открыть в Carla вкладку Patchbay, и перенаправить соединения нужного приложения к default_null_sink
. Второй способ через pavucontrol, так же перенаправить аудио поток нужного приложения к аудиовходу default_null_sink
(Этот способ запомнит перенаправление, поэтому последующие экземпляры приложения автоматически перенаправится на default_null_sink
).
Для применения вышеописанных настроек, необходимо создать два пользовательских systemd юнита:
~/.config/systemd/user/jack-carla-rack.service
[Unit] Description=Load Carla Rack JACK host [Service] PassEnvironment="PIPEWIRE_LINK_PASSIVE=true" Type=exec ExecStart=/usr/bin/pw-jack carla-rack -n [Install] WantedBy=default.target
~/.config/systemd/user/pulseaudio-null-sink@.service
[Unit] Description=Load %i Pulseaudio null sink Before=jack-carla-rack.service After=pipewire-pulse.service [Service] Type=oneshot ExecStart=/usr/bin/pactl load-module module-null-sink object.linger=1 media.class=Audio/Sink sink_name=%i channel_map=FL,FR ExecStop=/usr/bin/pactl unload-module module-null-sink RemainAfterExit=yes [Install] WantedBy=default.target
Затем измените сервис jack-carla-rack, указав полный путь к вашему сохраненному файлу конфигурации в строке Environment:
~/.config/systemd/user/jack-carla-rack.service.d/override.conf
Environment="CARLA_CONFIG_FILE=/home/username/Documents/carla_sink_effects.carxp" ExecStart= ExecStart=/usr/bin/pw-jack carla-rack -n $CARLA_CONFIG_FILE
И наконец, включите созданные сервисы, указав default_null_sink
как аргумент для сервиса pulseaudio-null-sink:
systemctl --user enable pulseaudio-null-sink@default_null_sink.service systemctl --user enable jack-carla-rack.service
Обратите внимание, если вы установите default_null_sink
как устройство по умолчанию, все приложения будут автоматически перенаправляться к этому аудиовходу и клавиши громкости будут менять его уровень, а не громкость устройств воспроизведения. Для того, чтобы изменять клавишами уровень громкости устройства, необходимо оставить его по умолчанию и перенаправлять аудиопоток приложения к default_null_sink
через pavucontrol. (PipeWire запомнит перенаправление и использует его для последующих экземпляров приложений).
Шумоподавление для голоса
Установите noise-suppression-for-voiceAUR и смотрите https://github.com/werman/noise-suppression-for-voice#pipewire для настройки. После, установите источник подавления шумов по умолчанию в настройках аудио. Возможно потребуется перезапустить приложение.
Решение проблем
PipeWire не видит микрофон
Модуль alsa-monitor
по умолчанию использует alsa-card-profiles для обнаружения устройств. Если этот метод не работает, попробуйте выключить api.alsa.use-acp
и/или включить api.alsa.use-ucm
в /etc/pipewire/media-session.d/alsa-monitor.conf
, под строкой rules
-> первое правило -> actions
-> update-props
:
... update-props = { api.alsa.use-acp = false ...
Затем перезапустите pipewire и проверьте доступные устройства:
$ pw-record --list-targets
Available targets ("*" denotes default): 62 58: description="Built-in Audio" prio=1872 60: description="Built-in Audio" prio=2000 * 62: description="Built-in Audio (Loopback PCM)" prio=1984
Нет звука после подключения Bluetooth устройства
По состоянию на 12-07-2020, если у вас нет звука после подключения Bluetooth устройства, вам скорее всего потребуется переключить стандартный аудиопоток или перенаправить его к требуемому. Воспользуйтесь pactl list sinks
для просмотра доступных потоков и pactl set-default-sink
для смены стандартного потока на bluetooth устройство. Можно автоматизировать через udev используя данный скрипт как пример.
Обсуждение данной проблемы можно посмотреть здесь. По словам автора скрипта, профиль гарнитуры (HSP) все еще может иметь проблемы.
Маленькая громкость
После замены PulseAudio на Pipewire громкость была как задумано, но после перезагрузки звук невыносимо тихий.
Откройте alsamixer
, нажимайте F6
для выбора нужной звуковой карты и удостоверьтесь, что уровень громкости стоит на 100%. alsactl
должен сохранить настройки после перезагрузки.
Увеличение RLIMIT_MEMLOCK
Dec 13 11:11:11 HOST pipewire-pulse[99999]: Failed to mlock memory 0x7f4f659d8000 32832: This is not a problem but for best performance, consider increasing RLIMIT_MEMLOCK
Установите realtime-privileges и добавьте пользователя в группу realtime
.
Также, увеличение memlock с 64кБ до 128кБ должно хватить для решение проблемы. Если вы запускаете pipewire-pulse
через systemd/User (Русский), допишите:
имя_пользователя soft memlock 64 имя_пользователя hard memlock 128
в /etc/security/limits.d/username.conf
Изменение частоты дискретизации
По умолчанию PipeWire глобально устанавливает частоту дискретизации равную 48КГц. Если вы хотите изменить ее (например если ваш ЦАП поддерживает более высокое значение) редактированием строки default.clock.rate = 48000
в файле конфигурации /etc/pipewire/pipewire.conf
. Например, если вы хотите частоту дискретизации в 192КГц, раскомментируйте строку и поменяйте значение 48000
на default.clock.rate = 192000
.
Внешняя звуковая карта не включается после переподключения
Проверьте ~/.config/pipewire-media-session/default-profile
. Если присутствуют значения с стандартным профилем "off", удалите их. Если же это не поможет, удалите все файлы из ~/.config/pipewire-media-session/
и перезапустите PipeWire используя systemctl --user restart pipewire.service
.
Нет звука или pactl info показывает Failure: Connection refused
Эта ошибка говорит о том, что приложение не может присоединиться к службе PipeWire-Pulse, удостоверьтесь что /etc/pipewire/pipewire-pulse.conf
существует и файл не пустой, а после перезапустите PipeWire-Pulse используя systemctl --user restart pipewire-pulse.service
.
Если этот способ не исправит ошибку, запустите strace -f -o /tmp/pipe.txt pactl info
для дебага и используйте /tmp/pipe.txt
для помощи в IRC чате #pipewire или списках рассылки.
Низкое качество звука через Bluetooth
В случае, если звук через Bluetooth заикается, проверьте pipewire.service
используя systemctl --user status pipewire.service
. Если у вас есть ошибки по типу:
Feb 17 18:23:01 HOST pipewire[249297]: (bluez_input.18:54:CF:04:00:56.a2dp-sink-60) client too slow! rate:512/48000 pos:370688 status:triggered
проверьте используемый кодек командой pactl list sinks
и попробуйте поменять его изменением bluez5.codecs
на один из следующих sbc aac ldac aptx aptx_hd
в
/etc/pipewire/media-session.d/bluez-monitor.conf
... properties = { ... bluez5.codecs = [sbc] ...
Также попробуйте включить поддержку mSBC (исправляет проблему с микрофоном на Sony 1000XM3):
/etc/pipewire/media-session.d/bluez-monitor.conf
... rules = [ ... actions = { ... update-props = { ... bluez5.msbc-support = true ...
Перезапустите PipeWire командой systemctl --user restart pipewire.service
для применения изменений.
Нет обнаруженных устройств после обновления PipeWire и его перезагрузки (git / >=0.3.23)
В коммите 012a68f8[7] была добавлена новая служба, которая отключена по умолчанию. Что приводит к тому что pipewire-media-session
не запускается после старта системы. Чтобы активировать службу, используйте команду systemctl --user enable --now pipewire-media-session.service
Если пользователь или пакетный менеджер не исправил конфигурационные файлы после обновления, то скорее всего другой экземпляр pipewire-media-session
запущен в pipewire.service. Чтобы проверить это, используйте: systemctl --user status pipewire.service
Если вывод говорит о том, что pipewire и pipewire-media-session запущены, обновите системные и/или пользовательские конфигурации:
/etc/pipewire/pipewire.conf and/or ~/.config/pipewire/pipewire.conf
context.exec = { ... # Line below should be commented out #"/usr/bin/pipewire-media-session" = { args = "" } ... }
Заметная задержка звука при воспроизведении
Обычно это происходит после отключения узла в период неактивности. Плановое отключение можно отключить, отредактировав /etc/pipewire/media-session.d/*-monitor.conf
в зависимости от того, где происходит задержка, заменив значение на 0 или экспериментами с другими значениями. Либо же закомментируйте строку suspend-node
в /etc/pipewire/media-session.d/media-session.conf
. После перезагрузите службы pipewire
и pipewire-pulse
для применения изменений, или перезагрузитесь.
Проподание звука при проигрывании других потоков
Обычно проблему можно диагностировать командой journalctl --user -b -u pipewire-pulse
и присутствуют такие строки:
pipewire-pulse[21740]: pulse-server 0x56009b9d5de0: [Nightly] UNDERFLOW channel:0 offset:370676 underrun:940
Согласно официальному гайду PipeWire по решению проблем, нужно отредактировать /etc/pipewire/media-session.d/alsa-monitor.conf
, раскомментировать строку api.alsa.headroom = 0
и поменять значение на 1024
.
Искаженный звук
- Для микрофонов, найдите проблемную звуковую карту в
alsamixer
и уменьшите уровень "Mic Boost" или "Internal Mic Boost". - Раскомментируйте строку
default.clock.rate = 48000
в/etc/pipewire/pipewire.conf
и уменьшите значение до44100
.
Различные проблемы после простоя
Если звук пропал или исказился после пробуждения системы после сна, возможно потребуется реинициализировать ALSA:
# alsactl init
Смотреть также
- Wiki — PipeWire вики на Freedesktop GitLab
- Pipewire Update Blog Post — Пост в блоге от января 2018 с описанием состояния разработки на тот момент
- PipeWire Late Summer Update 2020 — Пост в блоге от сентября 2020