PipeWire (Русский)

From ArchWiki
Jump to navigation Jump to search
Состояние перевода: На этой странице представлен перевод статьи PipeWire. Дата последней синхронизации: 2 августа 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

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.
https://gitlab.freedesktop.org/ryuukyu/helvum || helvum или helvum-gitAUR

Использование

Демонстрация экрана WebRTC

Большинство браузеров для работы WebRTC и захвата рабочего стола или отдельных приложений используют X11. На Wayland используется подход, основанный на механизме разрешений.

Для этого требуются пакет xdg-desktop-portal и один из следующий бэкэндов:

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

Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

Reason: После внесения изменений в гит-репозитории следующее примечание, относящиеся к отдельным приложениям/демонстрации отдельных окон могут быть не действительны для xdg-desktop-portal-gtk. Подробнее можете узнать здесь [4]. (Discuss in Talk:PipeWire (Русский))

Обратите внимание, что захват поддерживается только демонстрация экрана, а не для отдельного окна/приложения [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. Так же можете посмотреть коллекцию пользовательских пресетов для настройки.

Примечание: Про легаси версию PulseEffects читать здесь PulseAudio#PulseEffects.

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 для настройки. После, установите источник подавления шумов по умолчанию в настройках аудио. Возможно потребуется перезапустить приложение.

Решение проблем

Tango-view-refresh-red.pngThis article or section is out of date.Tango-view-refresh-red.png

Reason: Стандартные конфигурационные фалы перемещены с /etc/pipewire в /usr/share/pipewire. Системные настройки все еще находятся в /etc/pipewire и пользовательские в $HOME/.config/pipewire/, но файлы должны быть скопированы с /usr/share/pipewire. Подробнее: https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/1609126bcd720304b7a4c81b87cc3e70ae91ff44 (Discuss in Talk: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

Смотреть также