Запустите фальшивый / минимальный сеанс X для Pulseaudio / dbus

13

Я использую Pulseaudio для обмена аудио между рабочим столом и Raspberry Pi.

Однако для Pulseaudio нужен dbus, а для dbus - сеанс X. Без графического сеанса Pulseaudio может работать только в системном режиме, который официально не рекомендуется.

Помимо Raspberry Pi, стоимость сеанса X очень высока, поэтому я бы хотел избавиться от него самым эффективным (менее затратным) способом.

Как я могу начать самый маленький сеанс X для Pulseaudio?

kursus
источник
Удеву определенно не нужен X. Я не знаю о Pulseaudio: что терпит неудачу в отсутствие X? Это связано с D-Bus?
Жиль "ТАК - перестань быть злым"
Ну, я читал это, но это может быть только Pulseaudio. В отсутствие X Pulseaudio запускается в общесистемном режиме, что означает отсутствие сеанса для каждого пользователя, что плохо, как говорит официальный сайт: freedesktop.org/wiki/Software/PulseAudio/Documentation/User/…
kursus
Извините, я смешал udev и dbus, отредактировал.
Курсус

Ответы:

11

Вы можете использовать Xvfb , который является X-сервером с виртуальным кадровым буфером, то есть X-сервером, который отображается только в памяти и не подключается к какому-либо оборудованию. Вам не нужно запускать какой-либо клиент, который вам не нужен, на этом сервере, в частности, нет рабочего стола или оконного менеджера.

Xvfb :1 -screen 0 1x1x8 &

После этого:

DISPLAY=:1 dbus-launch
DISPLAY=:1 pulseaudio --start

Вам нужно немного подождать после запуска, Xvfbчтобы дисплей был доступен. Вы можете использовать xinitдля запуска X-сервера, а затем запускать клиенты, когда он будет готов. Поместите команды, которые вы хотите выполнить, в скрипт (обратите внимание, что при выходе из скрипта X-сервер завершается):

#!/bin/sh
dbus-launch
pulseaudio --start
sleep 99999999

Запустите виртуальный X-сервер с

xinit /path/to/client.script -- /usr/bin/Xvfb :1 -screen 0 1x1x8

Если вы хотите запустить его во время загрузки, вы можете запустить его из cron. Запустите crontab -e(как ваш пользователь, а не как root) и добавьте строку

@reboot xinit /path/to/client.script -- Xvfb :1 -screen 0 1x1x8

Если вы хотите убить этот сеанс, убейте xinitпроцесс.

Жиль "ТАК - перестань быть злым"
источник
Извините, что беспокою, я изо всех сил пытаюсь автоматически выполнить команду pulseaudio start (4-я строка вашего примера) при загрузке. Интересно, это свойство DISPLAY. Я пробовал rc.local, /etc/init.d, rcS, но скрипт никогда не запускает pulseaudio. Когда я запускаю свой скрипт через SSH, он работает отлично. Я был бы рад, если бы вы могли посоветовать.
Курсус
Xvfb должен выполнить некоторые настройки, прежде чем он будет готов принять X-соединения, поэтому, если более поздние команды выполняются слишком рано, вы можете обнаружить, что они не могут подключиться к X-серверу. Возможно, вы захотите изучить использование xinit для запуска Xvfb и поместить эти команды в .xinitrc, чтобы xinit запускал их только тогда, когда Xvfb готов к ним.
Alanc
Извините, я не выздоровел. Нужно ли запускать Xvfb с .xinitrc? Прямо сейчас это запускается с rc.local. Если да, то куда мне поставить команду PA? Я попытался запустить команду PA в .xinitrc, но не повезло, я что-то упустил.
Курсус
@kursus Вам нужно запускать все эти команды как пользователь. Вы можете сделать это из crontab с @reboot. Кроме того, все в порядке, после запуска Xvfb должна быть задержка, и xinit решает эту проблему. Смотрите мое редактирование.
Жиль "ТАК - перестань быть злым"
Спасибо за редактирование, теперь все понятно. Однако я получаю нераспознанную опцию: Xvfb при запуске команды xinit, с вызовом сценария или без него.
Курсус
1

Вчера у меня возникла та же проблема: при использовании Pulse Audio для Rasberrypi 0 Вт с DBus в безголовой среде, создавайте с помощью yocto без x11 и без systemd, вам нужно запустить и экспортировать dbus перед запуском pulseaudio.

if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
     echo "Starting dbus" 
     export $(dbus-launch)
fi

В etc / pulse / client.conf включите allow-autospawn-for-root = yes

Запустите, pulseaudio -vчтобы проверить, есть ли другая проблема в вашей конфигурации. Не используйте --systemпереключатель, потому что он не будет правильным.

pulseaudio -D --disallow-exit
Д-р Шериф Омран
источник
0

Существует более элегантный способ предотвратить достижение сценария EOF, чем использование sleep 99999999!

Используйте sleep infinityвместо этого. Он делает то, что говорит ...

Jost
источник