返回列表 上一主题 | 下一主题    

[推荐] 用“编辑器之神”的Vim播放动画

昨天清理Google Reader未读,看到这篇文章,类似的效果我看过Word,Excel版,不过用记事本是第一次看到,有点意思,当然记事本没有宏功能,它的翻页功能肯定使用其它程序控制的。
8 D, M  h" o6 v- S% N; b连Windows那个简陋的记事本也能放动画了,作为“编辑器之神”的Vim不可能不行吧,于是我蛋疼起来就折腾一下,做了个Vim版,猛击这个链接来看视频。- w+ ~" D! ]# R' J# _% I
( k: `. ?: }6 V0 `* b
1.png
2010-1-11 09:30
- ]& C" w, `$ r+ e% _. ?. c$ C
& z7 \3 d3 G$ O! L- B6 v1 `& _
MPlayer来播放其实把电影当成字符来播放根本就不是什么新玩意,mplayer早就有这个功能: f* p- R. [1 A" g0 Z
mplayer -vo aa -monitorpixelaspect 0.5 filename+ C4 w! `4 }9 l

( \4 J  \- L5 W9 E9 j因为aa输出驱动不能保持正确比例(mplayer的“-aspect”参数),改用“-monitorpixelaspect 0.5”后比例比较正常。它也有一些快捷键6 |  V7 d8 W* W' M$ e1 j! e0 I
  • 1、2键为控制对比度
  • 3、4键控制亮度
  • 5键切换快速渲染
  • 6键切换抖动方式
  • 7键反转效果
  • a键则是切换回mplayer控制方式
把“aa”换成“caca”就是彩色输出。不过Ubuntu 9.10自带的mplayer没有把这个“aa”视频输出驱动编译进去,medibuntu的版本就有,用ubuntu-tweak添加个第三方源更新下mplayer就行。
# H- W$ M4 @: H) J6 h) i1 i/ o
2.png
2010-1-11 09:30
# W7 x- A7 l/ B8 K) F
! U6 B  B* |- B5 B6 z4 y$ m7 N
mplayer使用的是aa-project项目的aalib库(在Ubuntu名字改成“libaa”),看看更新历史,1998年3月10日第一版,最后更新2001年4月25日,这东西是非常非常古老的,那个年代的hacker玩ascii-art真是想多变态就能玩多变态。这玩意是Linuxer装逼必备的,各位装逼犯们,有兴趣想知道怎么做继续看下去。% j; G4 b6 K" m
注意:下面的写的都是在Linux下完成的,只用到mplayer、aview和一些linux命令,windows用户需要自找代替工具,但原理是一样的。额外使用的工具、代码和最终结果文本可以猛击这里下载。( [5 j& ^& e$ G9 D# K# l4 [) E' L
Vim来播放mplayer的播放原理不难理解,mplayer解码视频,把每一帧传给libaa来生成ascii文本,再把ascii文本转换成图像传给X显示出来。现在不用mplayer转换图像来播放了,把libaa转换过后的ascii文本弄出来,用Vim来播放。& N$ I( l# u8 K+ w" C
可是想通过mplayer把这些字符提取出来没那么简单,因为它没有提供直接输出文本的选项,所以得换个思路,如下
4 I- H: y4 I$ L  R  U
  • 先用mplayer来把视频的每一帧保存为图像,mplayer支持png和jpg输出,经过测试,png不压缩体积巨大,压缩速度又慢,反正这里的视频本来就是黑白的,不用那么高要求,jpg就够了,体积也很理想。
  • 然后再用其它工具来把图像转换ascii文本,这里找到一个,是LDCN介绍过aview,通过manpage,发现也是用libaa库,连选项都是跟mplayer的一样。
  • 再把转换后的文本合并为一个。
  • 用Vim来打开合并后文件,编写脚本实现自动翻页。
  • 准备工作先建立一个空的临时文件夹,把flv文件复制进去,源视频用flashgot从这个页面抓下来的,用smplayer看一下flv的信息
    ) i$ B( {) M( F% c9 x
    • 文件名:“bad_apple.flv”
    • 大小:6m
    • 分辨率:448×336
    • 帧速:15fps
    文件不算大,还是黑白的,更方便转成ascii了。接下来的都是终端操作了,先建立几个工作目录。
    6 H3 R! U2 V/ G$ \7 \! M$ i4 `6 Z! x9 nmkdir jpg pgm txt
    # g: ~. Y7 f( |8 L. L' j& G) @3 @) C
    $ Q# v! v% k- \" U5 C) c
  • 提取图像执行下面的命令,所有帧都会输出为jpg放到“jpg”目录下
    - x" E4 ]- a9 O3 J; Y) \cd jpg mplayer -vo jpeg ../bad_apple.flv9 O4 P. s; x+ x( e( P8 K

    # d' r4 E( g3 F' ]3 w9 @转换也很快,不过最好不要打开文件管理器来看啊哈,几千文件在里面。转换后3283个文件共20.6 MB。( @( p( \% _. C! Y7 x4 j
  • 转换为pgm把图像转换为ascii文本的工具是aview,就在“aview”这个包里,在安装(这时还不需要安装)后用asciiview来查看图像。7 ^( ]/ |0 N) M) u5 ]5 E: S; e% `6 v
    为什么不是用“aview”呢?那是因为aview只支持pnm、pgm、pbm、ppm的格式,对于常见的png和jpg不支持,怎么办呢?转换一下咯,所以就有了asciiview这个脚本,它的作用就是先把图像转换成pgm格式再调用aview来显示。它用的是imagemagick的convert命令,但这里不用asciiview了,直接自己先转换好了。继续在“jpg”目录下执行
    $ ~: K1 W" s, D& i6 c- yfor i in *.jpg; do convert -colorspace gray $i ../pgm/${i%.jpg}.pgm; done
    & T& `/ i1 B# I! Y2 n' P+ t6 e( h/ g. w( d+ Q9 z. D
    经过漫长的等待后,在“pgm”目录出现一堆pgm文件了,图像变成灰阶图形,体积增大至471.3MB。+ q+ U3 a3 g+ ~* K, P
  • 转换成ascii这时候就能把pgm转换成ascii文本了,郁闷的是aview不支持直接在命令行直接输出结果,我翻遍它的文档都找不到相应的选项,所以如果你想保存结果,得用aview打开,按“s”键,然后答几个问题,如保存高宽度啊,字体啊,文件名啊这些问题。娘啊,我可是有3千多个要转换啊,手动保存得何年何月啊?
    ! o7 u/ C! ^2 b% A3 D( e这里省略千字的折腾过程,最后我是下载源码来修改aview来实现这个功能的,改过的aview命名为“aview-mod”。用aview-mod来把pgm转换为txt,执行下面命令. f; r" o- f) u9 [
    cd ../pgm for i in *.pgm; do aview-mod -driver stdout -contrast 32 $i | sed '$d' > ../txt/${i%.pgm}.txt; done
    ! [4 E0 B2 L6 k! J
    & b4 N! W& b) o/ |那堆txt齐刷刷地放到“txt”文件夹下,一共6.3 MB。
    " T" P2 V* U" l
  • 合并文本无难度+ H) z( x' Y, d) c
    cd ../txt cat *.txt > ../bad_apple.txt5 U$ s- h8 G* I* {$ A: j4 Z' W

    & g5 g1 k0 ?' S6 r& {4 g2 b0 A
  • Vim翻页脚本需要写一个脚本来实现自动翻页,在Vim的丰富文档帮助下,不用研究多久就写出来了。每隔67毫秒向下移动25行,因为1000ms/15fps=67,一共有3283个txt。脚本名为“ascii_player.vim”。: E" l& \) c2 N6 V4 W( F/ D
    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()% M) a% w) R# U
    7 B0 c: k5 o5 z0 b2 P
  • 运行脚本用vim打开“bad_apple.txt”,执行两条ex命令
    5 `1 |% s) R2 k, b& A' N& l:source ascii_player.vim :AsciiPlayer% K; q/ U) w4 s0 u$ j; f3 Y

    8 E2 V) [4 d' B8 Y; W0 W就可以欣赏了,哇哈哈哈,一种无法抵挡装逼感油然而生。 ' ]" W4 J. h2 E2 A+ D
一些补充
  • 当然你也可以用gvim来看,可惜刷新太慢,像放幻灯片。而在终端下vim翻页可是嗖嗖的,非常流畅。
  • 其实也不一定用vim来看,也可以是其它程序,只要它能实现定时自动翻页,刷新够流畅就可以。
  • 这里用的是终端默认大小,即80×25,当然也可以更大,但你的硬盘也得够大,libaa也有不少参数可选。
  • 这里用的例子视频默认是黑白的,如果是彩色的,有个东西叫二值化,GIMP有这个功能,把彩色图像换成失真度较低的黑白图像是个体力活。
我不是故意的。。
返回列表