Как запустить vlc-nox через ssh на Linux-сервере, работающем в текстовом режиме?

Общие сведения
У меня есть сервер Linux, работающий в текстовом режиме, без установленного X. Я намерен показывать видео и изображения с помощью directfb на монитор (фактически телевизор). Я установил vlc-nox, и он работает должным образом, если он вызывается в консоли по умолчанию (физическая клавиатура).


Проблема
При запуске через SSH видео не отображается, но со звуком все в порядке. Ошибка следующая:

directfb vout display error: Cannot create primary surface
fb vout display error: cannot get terminal mode (Inappropriate ioctl for device)
core video output error: video output creation failed
core decoder error: failed to create video output


Путь ФБР
Я думаю, что ФБР также сталкивается с той же проблемой, так как это вызовет ошибку, как показано ниже:
ioctl VT_GETSTATE: Inappropriate ioctl for device (not a linux console?)
Но fbi предлагает решение для этого случая: -T -vt <arg> start on virtual console <arg>
Итак, sudo fbi -T 1 /path/to/image/file будет отображать изображение так, как ожидалось.


Вопрос. Как работает vlc?


person TerrenceSun    schedule 26.04.2017    source источник
comment
В конце концов я нашел способ и отмечу его как ответ.   -  person TerrenceSun    schedule 04.05.2017


Ответы (1)


Наконец-то у меня есть решение для этого, поэтому я публикую его здесь, если у кого-то возникнет такой же вопрос.

Насколько я понимаю, vlc должен работать под настоящим терминалом, а не под псевдотерминалом. Мое решение состоит из двух частей.

Часть 1. Пусть vlc работает в режиме демона.

  1. Создайте пользователя для демона и назначьте права доступа к аудио и видео.

#useradd -c "VLC daemon" -d / -G audio,video -M -p \! -r -s /bin/false -u 75 -U vlcd

  1. Запустите vlc при запуске, используя tty1

Я пробовал это с устройством под Ubuntu.

[Unit]
Description=VLC server
After=network.target auditd.service
[email protected]
[Service]
ExecStart=/usr/bin/vlc -I rc --rc-host 127.0.0.1:8080
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
User=vlcd
Type=simple
#StandardError=tty
StandardOutput=tty
StandardInput=tty
RemainAfterExit=yes 
[Install]
WantedBy=multi-user.target
Alias=vlc.service

Обратите внимание на части Conflicts, ExecStart, StandardInput и StandardOutput.

  • В Conflicts он будет обходить службу getty по умолчанию, в противном случае #systemctrl disable getty@tty1 должен отключить ее вручную.
  • В ExecStart не используйте ключ -d, что означает, что он будет продолжать работать и занимать VT 1, который активируется Alt-F1. -rc включает интерфейс удаленного подключения.
  • В StandardInput/Output укажите tty как устройство ввода и вывода.

Часть 2. Удаленный разговор с демоном, чтобы он мог воспроизвести файл.

Поскольку --rc-host указывает локальный порт, нам нужно сначала подключиться к серверу по ssh. Затем используйте telnet для взаимодействия (добавления, воспроизведения, паузы) с vlc.

telnet 127.0.0.1 8080
add /path/to/video/file
person TerrenceSun    schedule 03.05.2017