北京代理记账公司 哪家:用“编辑器之神”的Vim播放动画

来源:百度文库 编辑:偶看新闻 时间:2024/04/30 05:56:15
昨天清理Google Reader未读,看到这篇文章,类似的效果我看过Word,Excel版,不过用记事本是第一次看到,有点意思,当然记事本没有宏功能,它的翻页功能肯定使用其它程序控制的。
. v/ ]2 ?" P: Z& @5 _连Windows那个简陋的记事本也能放动画了,作为“编辑器之神”的Vim不可能不行吧,于是我蛋疼起来就折腾一下,做了个Vim版,猛击这个链接来看视频。+ ?  k5 q. l7 H
# K+ i. {  ]  b1 T# n
下载 (57.23 KB)
2010-1-11 09:30
: C; c" e+ l" g, s- L" b1 M, g! s# l' [" v- |3 r
MPlayer来播放其实把电影当成字符来播放根本就不是什么新玩意,mplayer早就有这个功能, a. d4 f/ E% \  n% W3 d
mplayer -vo aa -monitorpixelaspect 0.5 filename
0 m3 n3 h1 v/ ^2 j5 |7 W6 c" m/ z, V. Z
因为aa输出驱动不能保持正确比例(mplayer的“-aspect”参数),改用“-monitorpixelaspect 0.5”后比例比较正常。它也有一些快捷键* ~9 ]4 D0 W0 T% k8 X, P8 m9 B# v
  • 1、2键为控制对比度
  • 3、4键控制亮度
  • 5键切换快速渲染
  • 6键切换抖动方式
  • 7键反转效果
  • a键则是切换回mplayer控制方式
把“aa”换成“caca”就是彩色输出。不过Ubuntu 9.10自带的mplayer没有把这个“aa”视频输出驱动编译进去,medibuntu的版本就有,用ubuntu-tweak添加个第三方源更新下mplayer就行。
4 r/ g5 B; \: c* p4 ? 下载 (16.62 KB)
2010-1-11 09:30
& b5 y: X: P7 [$ N+ T) P% V! z7 x# }" G
mplayer使用的是aa-project项目的aalib库(在Ubuntu名字改成“libaa”),看看更新历史,1998年3月10日第一版,最后更新2001年4月25日,这东西是非常非常古老的,那个年代的hacker玩ascii-art真是想多变态就能玩多变态。这玩意是Linuxer装逼必备的,各位装逼犯们,有兴趣想知道怎么做继续看下去。& a% x- Q5 i/ v- u) f9 P
注意:下面的写的都是在Linux下完成的,只用到mplayer、aview和一些linux命令,windows用户需要自找代替工具,但原理是一样的。额外使用的工具、代码和最终结果文本可以猛击这里下载。4 a# [5 ^; {: d& U4 b1 ~
Vim来播放mplayer的播放原理不难理解,mplayer解码视频,把每一帧传给libaa来生成ascii文本,再把ascii文本转换成图像传给X显示出来。现在不用mplayer转换图像来播放了,把libaa转换过后的ascii文本弄出来,用Vim来播放。% n4 w& r: H9 n, K* o
可是想通过mplayer把这些字符提取出来没那么简单,因为它没有提供直接输出文本的选项,所以得换个思路,如下- P- n+ B, r. c; G$ [1 S; J$ D
  • 先用mplayer来把视频的每一帧保存为图像,mplayer支持png和jpg输出,经过测试,png不压缩体积巨大,压缩速度又慢,反正这里的视频本来就是黑白的,不用那么高要求,jpg就够了,体积也很理想。
  • 然后再用其它工具来把图像转换ascii文本,这里找到一个,是LDCN介绍过aview,通过manpage,发现也是用libaa库,连选项都是跟mplayer的一样。
  • 再把转换后的文本合并为一个。
  • 用Vim来打开合并后文件,编写脚本实现自动翻页。
  • 准备工作先建立一个空的临时文件夹,把flv文件复制进去,源视频用flashgot从这个页面抓下来的,用smplayer看一下flv的信息8 b; }! w0 G+ `7 P% U/ t1 i
    • 文件名:“bad_apple.flv”
    • 大小:6m
    • 分辨率:448×336
    • 帧速:15fps
    文件不算大,还是黑白的,更方便转成ascii了。接下来的都是终端操作了,先建立几个工作目录。
    . \/ M/ \2 a# D. N' ~mkdir jpg pgm txt7 v8 f0 y/ K* ^5 n

    $ d2 k# N3 F/ q# I+ `- M$ @. q  Q$ k2 K
  • 提取图像执行下面的命令,所有帧都会输出为jpg放到“jpg”目录下
    " g* f( K$ t# i+ I7 Ccd jpg mplayer -vo jpeg ../bad_apple.flv
    & \6 f: S& W2 h& {2 `
    9 b& y6 \4 p% l6 T! k' e6 h转换也很快,不过最好不要打开文件管理器来看啊哈,几千文件在里面。转换后3283个文件共20.6 MB。/ \, N/ q* a3 K- w' y% N
  • 转换为pgm把图像转换为ascii文本的工具是aview,就在“aview”这个包里,在安装(这时还不需要安装)后用asciiview来查看图像。
    # i. U' C3 a) y为什么不是用“aview”呢?那是因为aview只支持pnm、pgm、pbm、ppm的格式,对于常见的png和jpg不支持,怎么办呢?转换一下咯,所以就有了asciiview这个脚本,它的作用就是先把图像转换成pgm格式再调用aview来显示。它用的是imagemagick的convert命令,但这里不用asciiview了,直接自己先转换好了。继续在“jpg”目录下执行
    3 c( m# T+ u( _' N, qfor i in *.jpg; do convert -colorspace gray $i ../pgm/${i%.jpg}.pgm; done0 c$ G8 L1 }, A3 R* ?; O
    3 W' E) e/ @0 p0 `
    经过漫长的等待后,在“pgm”目录出现一堆pgm文件了,图像变成灰阶图形,体积增大至471.3MB。; {4 ~* b- K, l% Y8 r( O
  • 转换成ascii这时候就能把pgm转换成ascii文本了,郁闷的是aview不支持直接在命令行直接输出结果,我翻遍它的文档都找不到相应的选项,所以如果你想保存结果,得用aview打开,按“s”键,然后答几个问题,如保存高宽度啊,字体啊,文件名啊这些问题。娘啊,我可是有3千多个要转换啊,手动保存得何年何月啊?, I/ {# T/ ?) V  d2 L, i3 b$ ]
    这里省略千字的折腾过程,最后我是下载源码来修改aview来实现这个功能的,改过的aview命名为“aview-mod”。用aview-mod来把pgm转换为txt,执行下面命令
    . f3 Z5 l4 x0 Q# V5 w4 ?cd ../pgm for i in *.pgm; do aview-mod -driver stdout -contrast 32 $i | sed '$d' > ../txt/${i%.pgm}.txt; done" c# Z7 u0 P! b/ f9 g
    & V/ n  l# H# h4 ?. j5 \
    那堆txt齐刷刷地放到“txt”文件夹下,一共6.3 MB。
    : e" v" Q2 R( b+ I
  • 合并文本无难度
    3 u* h( N# M' ^' ^7 m1 y/ t$ {cd ../txt cat *.txt > ../bad_apple.txt7 g( w1 q  s$ }5 M) ?. t
    # j6 Q8 s" g- l1 V$ W! }
  • Vim翻页脚本需要写一个脚本来实现自动翻页,在Vim的丰富文档帮助下,不用研究多久就写出来了。每隔67毫秒向下移动25行,因为1000ms/15fps=67,一共有3283个txt。脚本名为“ascii_player.vim”。. Y/ {$ ]  y: s/ k! c% ]( R
    function! AsciiPlayer() set nowrap set scrolloff=0 set columns=80 set lines=26 normal gg let i = 1 while i < 3283 execute "normal 25\zt" redraw let i = i + 1 sleep 67m endwhile endfunction command! AsciiPlayer call AsciiPlayer()
    % v4 u3 Z' k, i" g9 A+ G- [
    . U0 t# Q2 k' p# D! O. H$ n, ~
  • 运行脚本用vim打开“bad_apple.txt”,执行两条ex命令
    . g4 h' n) u: }9 M:source ascii_player.vim :AsciiPlayer
    1 T  d) j/ K. g, ^3 d' A7 D. X: u( d6 l2 }: X+ O
    就可以欣赏了,哇哈哈哈,一种无法抵挡装逼感油然而生。
    ! Y; {8 t* S& I9 }, F4 u4 a1 p
一些补充
  • 当然你也可以用gvim来看,可惜刷新太慢,像放幻灯片。而在终端下vim翻页可是嗖嗖的,非常流畅。
  • 其实也不一定用vim来看,也可以是其它程序,只要它能实现定时自动翻页,刷新够流畅就可以。
  • 这里用的是终端默认大小,即80×25,当然也可以更大,但你的硬盘也得够大,libaa也有不少参数可选。
  • 这里用的例子视频默认是黑白的,如果是彩色的,有个东西叫二值化,GIMP有这个功能,把彩色图像换成失真度较低的黑白图像是个体力活。