如何在 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 运行 作为守护进程模式。
- 为守护程序创建用户并分配音频和视频权限。
#useradd -c "VLC daemon" -d / -G audio,video -M -p \! -r -s /bin/false -u 75 -U vlcd
- 运行 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
请注意 Conflicts
、ExecStart
、StandardInput
和 StandardOutput
部分。
- 在
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
背景
我有一个 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 运行 作为守护进程模式。
- 为守护程序创建用户并分配音频和视频权限。
#useradd -c "VLC daemon" -d / -G audio,video -M -p \! -r -s /bin/false -u 75 -U vlcd
- 运行 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
请注意 Conflicts
、ExecStart
、StandardInput
和 StandardOutput
部分。
- 在
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