昨天清理Google Reader未读,看到,类似的效果我看过Word,Excel版,不过用记事本是{dy}次看到,有点意思,当然记事本没有宏功能,它的翻页功能肯定使用其它程序控制的。
连Windows那个简陋的记事本也能放动画了,作为“编辑器之神”的Vim不可能不行吧,于是我蛋疼起来就折腾一下,做了个Vim版,猛击来看视频。
MPlayer来播放
其实把电影当成字符来播放根本就不是什么新玩意,mplayer早就有这个功能
因为aa输出驱动不能保持正确比例(mplayer的“-aspect”参数),改用“-monitorpixelaspect 0.5”后比例比较正常。它也有一些快捷键
- 1、2键为控制对比度
- 3、4键控制亮度
- 5键切换快速渲染
- 6键切换抖动方式
- 7键反转效果
- a键则是切换回mplayer控制方式
把“aa”换成“caca”就是彩色输出。不过Ubuntu 9.10自带的mplayer没有把这个“aa”视频输出驱动编译进去,medibuntu的版本就有,用ubuntu-tweak添加个第三方源更新下mplayer就行。
mplayer使用的是的aalib库(在Ubuntu名字改成“libaa”),看看更新历史,1998年3月10日{dy}版,{zh1}更新2001年4月25日,这东西是非常非常古老的,那个年代的hacker玩ascii-art真是想多变态就能玩多变态。这玩意是Linuxer装逼必备的,各位装逼犯们,有兴趣想知道怎么做继续看下去。
注意:下面的写的都是在Linux下完成的,只用到mplayer、aview和一些linux命令,windows用户需要自找代替工具,但原理是一样的。额外使用的工具、代码和最终结果文本可以下载。
Vim来播放
mplayer的播放原理不难理解,mplayer解码视频,把每一帧传给libaa来生成ascii文本,再把ascii文本转换成图像传给X显示出来。现在不用mplayer转换图像来播放了,把libaa转换过后的ascii文本弄出来,用Vim来播放。
可是想通过mplayer把这些字符提取出来没那么简单,因为它没有提供直接输出文本的选项,所以得换个思路,如下
- 先用mplayer来把视频的每一帧保存为图像,mplayer支持png和jpg输出,经过测试,png不压缩体积巨大,压缩速度又慢,反正这里的视频本来就是黑白的,不用那么高要求,jpg就够了,体积也很理想。
- 然后再用其它工具来把图像转换ascii文本,这里找到一个,是LDCN,通过manpage,发现也是用libaa库,连选项都是跟mplayer的一样。
- 再把转换后的文本合并为一个。
- 用Vim来打开合并后文件,编写脚本实现自动翻页。
-
准备工作
- 文件名:“bad_apple.flv”
- 大小:6m
- 分辨率:448×336
- 帧速:15fps
-
提取图像
-
转换为pgm
-
转换成ascii
-
合并文本
-
Vim翻页脚本
-
运行脚本
先建立一个空的临时文件夹,把flv文件复制进去,源视频用flashgot从抓下来的,用smplayer看一下flv的信息
文件不算大,还是黑白的,更方便转成ascii了。接下来的都是终端操作了,先建立几个工作目录。
执行下面的命令,所有帧都会输出为jpg放到“jpg”目录下
转换也很快,不过{zh0}不要打开文件管理器来看啊哈,几千文件在里面。转换后3283个文件共20.6 MB。
把图像转换为ascii文本的工具是aview,就在“aview”这个包里,在安装(这时还不需要安装)后用asciiview来查看图像。
为什么不是用“aview”呢?那是因为aview只支持pnm、pgm、pbm、ppm的格式,对于常见的png和jpg不支持,怎么办呢?转换一下咯,所以就有了asciiview这个脚本,它的作用就是先把图像转换成pgm格式再调用aview来显示。它用的是imagemagick的convert命令,但这里不用asciiview了,直接自己先转换好了。继续在“jpg”目录下执行
经过漫长的等待后,在“pgm”目录出现一堆pgm文件了,图像变成灰阶图形,体积增大至471.3MB。
这时候就能把pgm转换成ascii文本了,郁闷的是aview不支持直接在命令行直接输出结果,我翻遍它的文档都找不到相应的选项,所以如果你想保存结果,得用aview打开,按“s”键,然后答几个问题,如保存高宽度啊,字体啊,文件名啊这些问题。娘啊,我可是有3千多个要转换啊,手动保存得何年何月啊?
这里省略千字的折腾过程,{zh1}我是下载源码来修改aview来实现这个功能的,改过的aview命名为“aview-mod”。用aview-mod来把pgm转换为txt,执行下面命令
那堆txt齐刷刷地放到“txt”文件夹下,一共6.3 MB。
无难度
需要写一个脚本来实现自动翻页,在Vim的丰富文档帮助下,不用研究多久就写出来了。每隔67毫秒向下移动25行,因为1000ms/15fps=67,一共有3283个txt。脚本名为“ascii_player.vim”。
function! AsciiPlayer() set nowrap set scrolloff=0 set columns=80 set lines=26 normal gg let i = 1 while i < 3283 execute "normal 25\<CR>zt" redraw let i = i + 1 sleep 67m endwhile endfunction command! AsciiPlayer call AsciiPlayer()
用vim打开“bad_apple.txt”,执行两条ex命令
就可以欣赏了,哇哈哈哈,一种无法抵挡装逼感油然而生。
一些补充
- 当然你也可以用gvim来看,可惜刷新太慢,像放幻灯片。而在终端下vim翻页可是嗖嗖的,非常流畅。
- 其实也不一定用vim来看,也可以是其它程序,只要它能实现定时自动翻页,刷新够流畅就可以。
- 这里用的是终端默认大小,即80×25,当然也可以更大,但你的硬盘也得够大,libaa也有不少参数可选。
- 这里用的例子视频默认是黑白的,如果是彩色的,有个东西叫,GIMP有这个功能,把彩色图像换成失真度较低的黑白图像是个体力活。