背景
我的Linux服务器以文本模式运行,没有安装X。我打算使用DirectFB向监视器(实际上是电视(展示视频和图像。我已经安装了VLC-Nox,如果在默认控制台(物理键盘(中调用它,则可以按预期运行。
问题
通过SSH运行它时,没有显示视频,但是音频还可以。错误如下:
directfb vout显示错误:无法创建主表面FB Vout显示错误:无法获得终端模式(设备不适当的IOCTL(核心视频输出错误:视频输出创建失败核心解码器错误:无法创建视频输出
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的方式是什么?
我终于有一个解决方案,所以我在这里发布了它,以防有人有同样的问题。
我的理解是,VLC需要在真正的TTY下运行,而不是伪TTY。我的解决方案由两个部分组成。
第1部分:让VLC以守护程序模式运行。
- 为守护程序创建用户并分配音频和视频特权。
#useradd -c "VLC daemon" -d / -G audio,video -M -p ! -r -s /bin/false -u 75 -U vlcd
- 使用TTY1 在启动时运行VLC
我已经在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
中,它将绕过默认的盖蒂服务,否则应由#systemctrl disable getty@tty1
手动禁用。 - 在
ExecStart
中,请勿使用-D开关,这意味着它将继续运行和占用VT 1,该VT 1被 alt> Alt - f1 激活。-rc
启用远程连接接口。 - 在
StandardInput/Output
中,将tty
指定为输入和输出设备。
第2部分:与守护程序的远程交谈,让它播放文件。
当--rc-host
指定本地端口时,我们需要先向服务器ssh。然后,使用telnet与VLC进行交互(添加,播放,暂停(。
telnet 127.0.0.1 8080
add /path/to/video/file