昨天清理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把这些字符提取出来没那么简单,因为它没有提供直接输出文本的选项,所以得换个思路,如下

  1. 先用mplayer来把视频的每一帧保存为图像,mplayer支持png和jpg输出,经过测试,png不压缩体积巨大,压缩速度又慢,反正这里的视频本来就是黑白的,不用那么高要求,jpg就够了,体积也很理想。
  2. 然后再用其它工具来把图像转换ascii文本,这里找到一个,是LDCN,通过manpage,发现也是用libaa库,连选项都是跟mplayer的一样。
  3. 再把转换后的文本合并为一个。
  4. 用Vim来打开合并后文件,编写脚本实现自动翻页。
  1. 准备工作

  2. 先建立一个空的临时文件夹,把flv文件复制进去,源视频用flashgot从抓下来的,用smplayer看一下flv的信息

    • 文件名:“bad_apple.flv”
    • 大小:6m
    • 分辨率:448×336
    • 帧速:15fps

    文件不算大,还是黑白的,更方便转成ascii了。接下来的都是终端操作了,先建立几个工作目录。

  3. 提取图像

  4. 执行下面的命令,所有帧都会输出为jpg放到“jpg”目录下

    转换也很快,不过{zh0}不要打开文件管理器来看啊哈,几千文件在里面。转换后3283个文件共20.6 MB。

  5. 转换为pgm

  6. 把图像转换为ascii文本的工具是aview,就在“aview”这个包里,在安装(这时还不需要安装)后用asciiview来查看图像。

    为什么不是用“aview”呢?那是因为aview只支持pnm、pgm、pbm、ppm的格式,对于常见的png和jpg不支持,怎么办呢?转换一下咯,所以就有了asciiview这个脚本,它的作用就是先把图像转换成pgm格式再调用aview来显示。它用的是imagemagick的convert命令,但这里不用asciiview了,直接自己先转换好了。继续在“jpg”目录下执行

    经过漫长的等待后,在“pgm”目录出现一堆pgm文件了,图像变成灰阶图形,体积增大至471.3MB。

  7. 转换成ascii

  8. 这时候就能把pgm转换成ascii文本了,郁闷的是aview不支持直接在命令行直接输出结果,我翻遍它的文档都找不到相应的选项,所以如果你想保存结果,得用aview打开,按“s”键,然后答几个问题,如保存高宽度啊,字体啊,文件名啊这些问题。娘啊,我可是有3千多个要转换啊,手动保存得何年何月啊?

    这里省略千字的折腾过程,{zh1}我是下载源码来修改aview来实现这个功能的,改过的aview命名为“aview-mod”。用aview-mod来把pgm转换为txt,执行下面命令

    那堆txt齐刷刷地放到“txt”文件夹下,一共6.3 MB。

  9. 合并文本

  10. 无难度

  11. Vim翻页脚本

  12. 需要写一个脚本来实现自动翻页,在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()
  13. 运行脚本

  14. 用vim打开“bad_apple.txt”,执行两条ex命令

    就可以欣赏了,哇哈哈哈,一种无法抵挡装逼感油然而生。

一些补充

  • 当然你也可以用gvim来看,可惜刷新太慢,像放幻灯片。而在终端下vim翻页可是嗖嗖的,非常流畅。
  • 其实也不一定用vim来看,也可以是其它程序,只要它能实现定时自动翻页,刷新够流畅就可以。
  • 这里用的是终端默认大小,即80×25,当然也可以更大,但你的硬盘也得够大,libaa也有不少参数可选。
  • 这里用的例子视频默认是黑白的,如果是彩色的,有个东西叫,GIMP有这个功能,把彩色图像换成失真度较低的黑白图像是个体力活。