Top

数码相框

目录:

基于debian

以前用树莓派接显示器实现过一个简单的数码相框,可以利用sftp客户端通过WiFi上传要显示的照片,而树莓派使用fbi将这些照片以幻灯片的形式显示在显示器上。
fbi —— linux framebuffer imageviewer,不依赖图形界面,比如xorg。可以在字符界面下直接显示图片。
fbi必须要在本地执行,不能从远程ssh客户端执行。
后来fbi进化为fim —— fbi improved。
fim可以从远程ssh执行,它会检测主机能用的视频输出。

以下命令可以从远程ssh执行,在数码相框显示图片:
nohup fim -aqu -c 'while(1){sleep 1;next;}' img/ >/dev/null 2>&1 &
img/是存放图片的目录,此处可以有斜杠,也可以没有,可以用img/*,效果相同。
使用jobs可以查看当前后台正在执行的进程;用fg number命令可以将后台进程移到前台。然后按Ctrl+c就可以结束该进程了。
例如:
lidapeng@x61s:~$ nohup fim -aqu -c 'while(1){sleep 1;next;}' img/ >/dev/null 2>&1 &
[1] 3486
lidapeng@x61s:~$ jobs
[1]+  运行中               nohup fim -aqu -c 'while(1){sleep 1;next;}' img/ > /dev/null 2>&1 &
lidapeng@x61s:~$ fg 1
nohup fim -c 'while(1){sleep 1;next;}' img/ > /dev/null 2>&1
^C
将此命令加入服务,使得系统启动后自动开始显示指定目录的照片:
首先编辑/etc/rc.local文件(默认没有,需要创建)。
加入以下行:
#! /bin/bash
nohup fim -aqu -c 'while(1){sleep 1;next;}' /home/lidapeng/img/ >/dev/null 2>&1 &
exit 0
赋予此文件可执行权限:
chmod +x /etc/rc.local
启动rc-local服务:
systemctl start rc-local
系统重启后不需要登录任何账号即可显示指定目录中的图片。
若要终止,可以登录系统后执行以下命令:
systemctl stop rc-local
注意,此时显示屏还会继续显示图片,从登录到执行命令,基本属于盲打。
以上,也可以使用service rc-local stop|start|restart命令

以nohup方式执行此命令时有个问题需要解决:显示图片时会有个光标一直在闪,应该是登录提示符的下划线。 如果用户登录的话,可以设置shell变量来隐藏光标:
PS1="\[\033[?25l"
export PS1

对于fbi,则必须在主机本地执行:
fbi -a -t 1 -noverbose -u /home/pi/img/*
且fbi不会去搜索目录,如果将img/*换成img或img/都会显示空黑页面。
尝试将以上命令加入到/etc/rc.local中,启动时提示:
ioctl VT_GETSTATE: Inappropriate ioctl for device(not a linux console?)
故而将其加入到某个用户的.bashrc文件中,然后再设定该用户自动登录,即可达到开机自动显示指定目录中的图片的效果。
如果图片文件有增减,可以使用以下命令强行将指定用户登出:
root@raspberrypi:/home/lidapeng# w
 11:24:53 up 5 min,  2 users,  load average: 0.49, 0.34, 0.16
USER     TTY      来自           LOGIN@   IDLE   JCPU   PCPU WHAT
pi       tty1     -                11:24    5:42  12.93s 12.46s fbi -a -t 1 --noverbose /home/pi/img/172
lidapeng pts/0    192.168.11.131   11:20    1.00s  1.57s  1.06s sshd: lidapeng [priv]
root@raspberrypi:/home/lidapeng# pkill -t tty1
在树莓派的raspbian中,如果用raspi-config设置某个用户自动登录,那么按照上述方法将其踢出的话该用户还会自动登录。
这间接实现了fbi刷新目录的目的。

按esc键可以退出图片显示。
实际上如果设置了指定用户自动登录,可以在该用户的~/.bashrc文件中写入以下两行中的任意一行:
fbi -a -t 1 -noverbose -u /home/lidapeng/img/*                    按Esc退出
fim -aqu -c 'while(1){sleep 1;next;}' /home/lidapeng/img/        按Ctrl+c退出,实际是打破while循环

基于FreeBSD

由于FreeBSD下并没有类似fbi的软件,也就是说,在纯文本界面下无法显示图片,只能在图形界面下显示图片。
目前想到的方法是利用slim自动登录进一个用户,然后在该用户的~/.xinit文件中调用feh播放图片。
此方法需要安装的软件有: 以上完成后,开机过程结束就会开始播放照片。
远程登录重启slim服务可以重新播放照片。指定目录中照片有变更时可用此方法完成刷新动作。
在本地可以按Ctrl+Alt+F1~F8进入console模式(有一定概率不成功,可能需要多试几次),按Ctrl+Alt+F9返回播放模式。

但是FreeBSD不能识别树莓派的无线网卡,解决方法是使用有线,或者FreeBSD可识别的USB无线网卡。
综上,个人认为还是raspbian + fim的方式更适合做数码相框。

feh有趣的选项

feh的默认模式为幻灯片(slideshow)模式。
蒙太奇模式从文件列表中形成蒙太奇。生成的图像可以查看或保存,其大小可以受高度、宽度或两者的限制。
索引模式从文件列表中形成索引打印。图像缩略图与文件名、大小和尺寸一起显示。
缩略图模式类似于索引模式,但可以单机迷你图像并在新窗口打开选定的图像。
多窗口模式在多个窗口中显示图像。不要与大型文件列表一起使用。
列表模式不显示图片。它输出文件列表中文件的ls样式列表,包括图片信息,比如大小、像素、类型等。


手册中的示例:
在许多桌面环境中,feh也可以用作背景设置器。
除非您传递--no-fehbg选项,否则它将编写一个脚本,将当前背景设置为~/.fehbg
因此,要在每次启动X时恢复背景,可以将“~/.fehbg &”添加到X启动脚本中(例如~/.xinitrc)。
注意,写入~/.fehbg的命令行始终包括--no-fehbg选项,以确保它不会因X11屏幕布局或类似内容的差异而意外更改。
feh不支持设置GNOME shell桌面的壁纸。

对于--bg-center、--bg-fill和--bg-max,可以使用--geometry指定距屏幕一侧的偏移量,而不是将图像居中。
正值将从左侧/顶部偏移,负值将从底部/右侧偏移。+0和-0都是有效且不同的值。
请注意,除--bg-tile之外的所有选项都支持Xinerama。
例如,如果您连接了多个屏幕并使用例如--bg-center,feh将在每个屏幕上居中或适当偏移图像。
您甚至可以指定多个文件,在这种情况下,第一个文件在屏幕0上设置,第二个在屏幕1上设置,依此类推。
设置壁纸时,使用--no-xinerama将整个X显示屏视为一个屏幕。
您还可以使用--xinerama-index将feh用作特定屏幕的背景设置器。

大概意思是创建一个~/.fehbg文件,里面包含feh命令即相关选项(必须包含--no-fehbg选项)。例如:
feh --no-fehbg -zFD1 ~/Picitures
然后在~/.xinitrc中加上以下行调用~/.fehbg文件:
~/.fehbg &
以上可以实现每秒更换一张桌面背景,但按ESC键会退出feh播放模式,显示原桌面背景。
另外,还需要设置slim以daemon方式运行,否则feh显示的图片会在最前台,无法对电脑进行任何操作。
修改/usr/local/etc/slim.conf文件,取消以下行的注释,然后重启slim服务:
deamon yes

debian下xorg禁用屏幕保护的方法

以下方法来自Disable suspend and hibernation

/etc/xorg.conf(默认没有此文件)

Section "ServerFlags"
  Option "BlankTime" "0"
  Option "StandbyTime" "0"
  Option "SuspendTime" "0"
  Option "OffTime" "0"
EndSection
重启xorg后登录系统,执行xset q命令可以看到:
DPMS (Energy Star):
  Standby:0    Suspend:0    Off:0
  DPMS is Enable
  Monitor is On
亲测可用。

屏蔽相关服务

# systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
登录系统后执行xset q命令可以看到:
DPMS (Energy Star):
  Standby:600    Suspend:600    Off:600
  DPMS is Enable
  Monitor is On
不确定可用。
要启用以上服务,可以将上述命令中的mask更改为unmask。

修改/etc/systemd/sleep.conf

此方法适用于Debian10和更新版本。
[Sleep]
AllowSuspend=no
AllowHibernation=no
AllowSuspendThenHibernate=no
AllowHybridSleep=no
此方法似乎无效