cont. (发现)在 Emacs 里运行毁灭战士
在Emacs里面播放Bad Apple?
我发现了这个9年前的项目 by y-usuzumi,它的原理是合成了一段ascii动画,在Emacs buffer里面刷新播放。
在考虑用Emacs玩doom(但不是走webkit支持)的时候,我一开始考虑的是把任意的X窗口同步刷到Emacs里面,我们不能没有对应的X窗口,不然程序无法运行。X支持窗口转发,因此我们可以捕捉窗口在任意时间的画面(有一个命令import
可以做这件事)。
剩下的问题就是怎么在Emacs里面展示窗口的状态。我有两个点子:
- 我知道一个非常棒的项目chafa,它可以把图片转换成多种字符画格式,而Emacs有一个高性能的内置终端的扩展vterm。这种方式的结果我已经在之前的帖子里展示过了,如果直接在终端里使用这种方式展示的话效果会更好,特别是当你的终端支持sixel的时候,看起来和真正的X窗口转发别无二致。
window="DOOM"
while true; do
xwd -name $window -silent |
magick xwd:- png:- |
chafa -
sleep 0.05
done
这个方式得到的动画帧率还可以,窗口输入有延迟,但是没有明显卡顿。关于为什么我觉得这不算在Emacs里玩doom:
- 因为Emacs支持显示图片,所以如果我们能够用一定的频率刷新图片,理论上就可以在Emacs里面实现定格动画的效果。那么Emacs最高支持多高的刷新频率呢?我在arm小板上实验的结果是:每秒2-3帧(参考以下给出的最小实现)。也许有更高效的实现?
input=/somewhere/badapple.mp4
output=/tmp/video.png
duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 $input)
interval=0.1
for t in $(seq 0 $interval $duration); do
ffmpeg -v quiet -i $input -ss $t -frames:v -y $output
done
(let* ((buf (get-buffer-create "*Bad Apple*"))
(img-file "/tmp/video.png"))
(with-current-buffer buf
(insert-image (create-image img-file))
(run-with-timer 0.5 1
(lambda () (clear-image-cache img-file))))
(switch-to-buffer buf))