如何在 Linux 服务器 运行 中以文本模式通过 ssh 启动 vlc-nox?

How to start vlc-nox via ssh in a Linux server running in text mode?

背景
我有一个 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


fbi的方式
我认为 fbi 也面临同样的问题,因为它会引发如下错误:
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的方式是什么?

我终于找到了解决方案,所以我 post 在这里以防有人有同样的问题。

我的理解是,vlc 需要运行 在真正的 tty 下,而不是伪 tty。我的解决方案由两部分组成。

第 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
Conflicts=getty@tty1.service
[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

请注意 ConflictsExecStartStandardInputStandardOutput 部分。

  • Conflicts中会绕过默认的getty服务,否则应该通过#systemctrl disable getty@tty1手动禁用。
  • ExecStart中,不要使用-d开关,这意味着它会保持运行ning并占用VT 1,由Alt[=60激活=]-F1-rc 启用远程连接接口。
  • StandardInput/Output中,指定tty作为输入和输出设备。

第 2 部分:与守护进程远程对话,让它播放文件。

由于--rc-host指定了一个本地端口,我们需要先ssh到服务器。然后,使用telnet与vlc进行交互(添加、播放、暂停)。

telnet 127.0.0.1 8080
add /path/to/video/file