一个利用ascii拼成的谷歌街景地图! http://tllabs.io/asciistreetview/,看上去效果真不错!
除此之外,linux下面也有类似的ascii艺术,比如 aview/asciiview ,mplayer
其中mplayer的使用方法
1
|
mplayer -vo caca *.flv
|
http://blog.csdn.net/exbob/article/details/7321903
也许你还不知道AA是什么,但只看那牛逼哄哄的名字,就该知道它绝非善类。
没错。进入这个项目的主页:http://aa-project.sourceforge.net/ ,就能看到它的三个宏伟目标:
1.将所有的重要软件移植到AA-lib
2.将AA-lib移植到所有的可用平台
3.迫使IBM重新制造MDA卡
注:MDA(Monochrome Display Adapter ),单色字符显示适配卡,与单色字符显示器配接,它只支持字符显示功能,无图形功能,是一种相当古老的显卡。
如果你对技术不感兴趣,可用点击这里http://v.youku.com/v_show/id_XMzYwNTIyODY4.html,观看利用AA制作的一段动画,制作方法和源代码在文档的最后一节。
简单的说,它可用实现下面的效果,就是将图片转换为ASCII文本。
这个略显粗糙,如果将字体调小,增大分辨率,可显示更加逼真的图片,例如:
其实,这是一个由ASCII字符的狂热爱好者们开发的项目,最初的发起人叫Jan Hubicka,目的是将计算机上的一切都用ASCII字符来表现,包括图形和视频。
该项目提供了一个库——AA-lib,这是一个低级图形库,与其他的库的区别是它不需要图形设备,完全用ASCII字符描绘图形,它的API被设计得与其他库类似。还提提供一个演示程序——BB(这个名字更显另类),播放了一段完全由ASCII字符绘制的动画,其中有文字,图像,分形几何,还有一个3D效果。
下面在fedora12中安装它们。
1.安装AA-lib
下载aalib-1.2:
http://prdownloads.sourceforge.net/aa-project/aalib-1.2.tar.gz
最新版本是1.4,但是BB是基于1.2的,所有先安装1.2。
解压、编译、安装:
- tar xvzf aalib-1.2.tar.gz
- cd aalib-1.2
- ./configure
- make
- make install
默认安装在/usr/local下
2.安装bb
下载bb-1.2:
http://prdownloads.sourceforge.net/aa-project/bb-1.2.tar.gz
编译前需要设置一个环境变量,否则会找不到aa-lib:
- export CFLAGS=-I/usr/local/include
解压:
- tar xvzf bb-1.2.tar.gz
- cd aalib-1.2
编译时会报textform.c文件的错误,是因为该文件内定义的某些字符串太长,换行时没有用反斜杠,可以在后面加上反斜杠,或直接注释掉。然后编译:
- ./configure
- make
编译生成了可执行文件bb,直接执行即可看到一段演示。最好在文本模式下执行,否则可能会报错。
这段演示还可以添加音乐,在源码的mikunix目录下有音频的程序,直接make,然后执行strip ../bb_snd_server。但是我一直没有弄出声音,也许是虚拟机的问题。
3.安装aview
aview的作用是将pnm格式的图片转换为ASCII文本,并显示。aview只支持pnm、pgm、pbm和ppm格式的图片,所以需要将其他格式的图片转换,它提供了一个asciiview的脚本,利用convert转换图片格式,然后再传递给aview。
aview依赖于aalib-1.4,所有要先用1.4替换之前安装的1.2,安装方法与1.2相同。安装后下载aview:
http://prdownloads.sourceforge.net/aa-project/aview-1.3.0rc1.tar.gz
解压、编译、安装:
- tar xvzf aview-1.3.0rc1.tar.gz
- cd aview-1.3.0
- ./configure
- make
- make install
编译生成的aview程序可以将pbm、pgm或pnm图片用ASCII字符显示。但是不支持JPEG图片,所以它提供了一个shell脚本asciiview,先调用convert将JPEG图片转换为pgm图片,然后再用aview显示。
fedora12中没有convert命令,先用下面的命令安装:
- yum install ImageMagick
准备一张图片,例如1.jpg,用下面的命令就可以把它转换为ASCII文本:
- asciiview 1.jpg
4.Bad Apple
下面参考aview的源码,编写了一个程序,在Linux的终端下播放一段由ASCII字符绘制的动画:Bad Apple。原理比较简单,就是将视频逐帧截图,然后用程序按一定的时间间隔将图片依次转换为ASCII文本在终端上显示。动画视频在这里:http://v.youku.com/v_show/id_XMzYwNTIyODY4.html,动画中的卡顿是屏幕录像软件的问题,AA-lib本身是很流畅的。
制作步骤:
准备apple.flv,用kmplayer做每50毫秒截图,截图为jpeg格式,把它们都复制到/root/aa/img目录下。
用下面shell脚本将jpeg图片转化为pgm格式,共3202张,文件名为1.pgm到3202.pgm,全部放在pgm文件夹下。
- #!/bin/sh
- ls -l *.jpg > sort
- i=1
- while [ $i -le 3202 ]
- do
- filename=`sed -n ''$i'p' sort | awk '{print $8}'`
- echo $filename
- convert $filename ./pgm/$i.pgm
- i=`expr $i + 1`
- done
在pgm文件夹下执行程序:
- ./aviewdemo -contrast 20 -extended 1.pgm
程序源码在这里:http://download.csdn.net/detail/exbob/4112093
动画视频在这里:http://v.youku.com/v_show/id_XMzYwNTIyODY4.html
用 mplayer 来播放
其实把电影当成字符来播放根本就不是什么新玩意,mplayer 早就有这个功能
mplayer -vo aa -monitorpixelaspect 0.5 filename
因为 aa 输出驱动不能保持正确比例(mplayer 的 -aspect
参数),改用 -monitorpixelaspect 0.5
后比例比较正常。它也有一些快捷键
- 1、2 键为控制对比度
- 3、4 键控制亮度
- 5 键切换快速渲染
- 6 键切换抖动方式
- 7 键反转效果
- a 键则是切换回mplayer控制方式
把 aa
换成 caca
就是彩色输出。不过 Ubuntu 9.10 自带的 mplayer 没有把这个 aa 视频输出驱动编译进去,medibuntu 的版本就有,搞错,应该是 SMPlayer作者编译的版本。用 Ubuntu Tweak 添加个第三方源更新下 mplayer 就行,最版版本中名为「Mplayer」的源好像又被移除了,手动添加 ppa 源页面。
mplayer 使用的是 aa-project 项目 的 aalib 库(在 Ubuntu 字改成「libaa」),看看更新历史,1998 年 3 月 10 日第一版,最后更新 2001 年 4 月 25 日,这东西是非常非常古老的,那个年代的 hacker 玩 ascii-art 真是想多变态就能玩多变态。这玩意是 Linuxer 装逼必备的,各位装逼犯们,有兴趣想知道怎么做继续看下去。
注意: 下面的写的都是在 Linux 下完成的,只用到 mplayer、aview 和一些 Linux 命令,Windows 用户需要自找代替工具,但原理是一样的。额外使用的工具、代码和最终结果文本可以 猛击这里 下载。
更新: 留言中的 jiazhoulvke 同学 写了个 shell 脚本,自动完成下文的一系列操作,使用简单,不想理解原理来折腾的可以下载来看看,里面有使用说明。
Vim 来播放
mplayer 的播放原理不难理解,mplayer 解码视频,把每一帧传给 libaa 来生成 ascii 文本,再把 ascii 文本转换成图像传给 X 显示出来。现在不用 mplayer 转换图像来播放了,把 libaa 转换过后的 ascii 文本弄出来,用 Vim 来播放。
可是想通过 mplayer 把这些字符提取出来没那么简单,因为它没有提供直接输出文本的选项,所以得换个思路,如下
先用 mplayer 来把视频的每一帧保存为图像,mplayer 支持 png 和 jpg 输出,经过测试,png 不压缩体积巨大,压缩速度又慢,反正这里的视频本来就是黑白的,不用那么高要求,jpg 就够了,体积也很理想。
然后再用其它工具来把图像转换 ascii 文本,这里找到一个,是 LDCN 介绍过 aview ,通过 manpage,发现也是用 libaa 库,连选项都是跟 mplayer 的一样。
再把转换后的文本合并为一个。
用 Vim 来打开合并后文件,编写脚本实现自动翻页。
准备工作
先建立一个空的临时文件夹,把 flv 文件复制进去,源视频用 Flashgot 从 这个页面 抓下来的,用 SMPlayer 看一下 flv 的信息
- 文件名:bad_apple.flv
- 大小:6M
- 分辨率:448x336
- 帧速:15fps
文件不算大,还是黑白的,更方便转成 ASCII 了。接下来的都是终端操作了,先建立几个工作目录。
mkdir jpg pgm txt
提取图像
执行下面的命令,所有帧都会输出为 jpg 放到 jpg 目录下
cd jpg
mplayer -vo jpeg ../bad_apple.flv
转换也很快,不过最好不要打开文件管理器来看啊哈,几千文件在里面。转换后 3283 个文件共 20.6MB。
转换为 pgm
把图像转换为 ASCII 文本的工具是 aview,就在 aview 这个包里,在安装(这时还不需要安装)后用 asciiview 来查看图像。
为什么不是用 aview 呢?那是因为 aview 只支持 pnm、pgm、pbm、ppm 的格式,对于常见的 png 和 jpg 不支持,怎么办呢?转换一下咯,所以就有了 asciiview 这个脚本,它的作用就是先把图像转换成 pgm 格式再调用 aview 来显示。它用的是 imagemagick 的 convert 命令,但这里不用 asciiview 了,直接自己先转换好了。继续在 jpg 目录下执行
for i in *.jpg; do convert -colorspace gray $i ../pgm/${i%.jpg}.pgm; done
经过漫长的等待后,在 pgm 目录出现一堆 pgm 文件了,图像变成灰阶图形,体积增大至 471.3MB。
转换成 ASCII
这时候就能把 pgm 转换成 ascii 文本了,郁闷的是 aview 不支持直接在命令行直接输出结果,我翻遍它的文档都找不到相应的选项,所以如果你想保存结果,得用 aview 打开,按 s 键,然后答几个问题,如保存高宽度啊,字体啊,文件名啊这些问题。娘啊,我可是有 3 千多个要转换啊,手动保存得何年何月啊?
下面两个方法选一个
旧方法:修改aview源码重新编译
这里省略千字的折腾过程,最后我是下载源码来修改 aview 来实现这个功能的,改过的 aview 命名为 aview-mod。用 aview-mod 来把 pgm 转换为 txt,执行下面命令
cd ../pgm
for i in *.pgm; do aview-mod -driver stdout -contrast 32 $i | sed '$d' > ../txt/${i%.pgm}.txt; done
新方法: 脚本处理,推荐
其实 aview 也支持命令行输出,只不过用法比较诡异,而不是直接输出单张结果,而是一个空白页和 2 张 ASCII 页面,所以要配合 sed 再处理一下,截取其中一张
cd ../pgm
for i in *.pgm; do echo q | aview -driver stdout -kbddriver stdin -contrast 32 $i | sed -n '27,+24p' > ../txt/${i%.pgm}.txt; done
那堆 txt 齐刷刷地放到 txt 文件夹下,一共 6.3 MB。
合并文本
无难度
cd ../txt
cat *.txt > ../bad_apple.txt
Vim 翻页脚本
需要写一个脚本来实现自动翻页,在 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 命令
:source ascii_player.vim
:AsciiPlayer
就可以欣赏了,哇哈哈哈,一种无法抵挡装逼感油然而生。
一些补充
当然你也可以用 gvim 来看,可惜刷新太慢,像放幻灯片。而在终端下 vim 翻页可是嗖嗖的,非常流畅。
其实也不一定用 vim 来看,也可以是其它程序,只要它能实现定时自动翻页,刷新够流畅就可以。
这里用的是终端默认大小,即 80x25,当然也可以更大,但你的硬盘也得够大,libaa 也有不少参数可选。
这里用的例子视频默认是黑白的,如果是彩色的,有个东西叫 二值化 ,GIMP 有这个功能,把彩色图像换成失真度较低的黑白图像是个体力活。