2422
需用时 04:50
Bad Apple:技术宅的盛宴
/gkimage/yk/tk/99/yktk99.png
DIYer:艾斯昆
制作时间:从3小时到一天不等 因人而异
制作难度:★★★☆☆
GEEK指数:★★★★★

Bad Apple最初是作为日本同人游戏社团“上海爱莉丝幻乐团”所制作的“东方Project”系列游戏背景音乐出现的。后来在日本著名视频站点NicoVideo上有人萌发了为此系列制作MADMovie的想法,最后有了这段3D制作的影绘风格视频:

这段视频由不断变换的影绘风格游戏人物组成,完全黑白,视觉震撼力十足。此视频在网络上引发了一场宏大的运动,各种技术宅使用了各种方法来演奏这段三分多钟长的视频。

看完本文后,你将能做出如下效果的视频:


1   所需工具

● PC机一台
● Visual Studio 2010
● KMPlayer 3.0

2   思路原理

● 我们想要做的就是在Windows控制台(也就是命令提示符,俗称“DOS窗口”)下播放Bad Apple视频,视频的基本原理就是利用人眼的视觉暂留效果,快速在控制台输出字符-清屏-输出字符-清屏,达到“动画”的效果。

而输出的字符需要从原始视频获取,将原始视频压缩成一个较低的分辨率,再获取到每一帧上的所有像素点,转换成对应的字符串。


3   确定思路

● 首先要选定使用的语言,这个根据大家的爱好,随便C/C++、Java、Python等等绝大部分编程语言都可以实现,这里选用的是C#。
● 关于素材的来源,这个是难度最大的步骤。原始1080P视频素材在网上很容易下到,但要处理成我们需要的字符串形式。也就是在视频黑色像素的位置输出一个字符,白色像素的位置输出为空格,每一帧都依据像素排列位置输出成这种形式,如图:
/gkimage/ml/hj/63/mlhj63.png

● 获取字符图像大概有两个思路:
1. 根据视频格式(我下到的是H264编码方式的),读取二进制文件并进行转码;
2. 使用第三方工具或者类库,将视频的每一帧转换为图片格式,再将图片转换为所需字符串形式。
● 第一种方式需要研究视频编码的问题,而且比较复杂,因此我们选择取巧的方式。KMPlayer是个很好的视频播放软件,它的截图功能非常强大,可以将视频每一帧图像都保存为截图,完全能够满足我们的需要。

4   捕获图像

● 使用KMPlayer打开原始视频,点击右键选择“捕获”->“高级捕获”(如果没有捕获项,请勾选“设置”->“高级菜单”项),就可以了。
● 需要考虑的是分辨率与帧数的问题,Windows7下1366×768分辨率默认命令提示符窗口最大一行显示80个字符,最大44列,因此我们截取的视频分辨率应该小于等于这个值。当然还可以在后面过程中在调整分辨率,但要设计插值计算的问题,因此还是交给KMPlayer比较轻松一些。
● 另外命令提示符每个字符的上下间距与左右间距是不同的,上下间距要高上许多,如果按照视频原始宽高比截图的话最后输出的画面会有上下拉伸现象,因此截图的时候就要故意把视频截的“胖”一些。
● 最后综合考虑,决定一秒截25帧图像,图像分辨率为80×30。
/gkimage/x0/9a/ur/x09aur.png

● 这时还可以顺便将音频也用KMPlayer截取下来,以便保证视频与音频的同步(如果再如此折腾下还没有对此歌产生审美疲劳的话还可以丢进MP3里听)。音频比较简单,从头到尾录制,保存为mp3或者其他常见格式就可以,只要你使用的语言有可用的将它播放出来的库就可以。

● 截取的图片一共有3553张,保存在一个文件夹中。
/gkimage/zc/rw/iv/zcrwiv.png
● 其实这个时候就有一个简单的方法将这些静态图片播放出来了,只要使用Picasa附带的图片查看器打开第一帧图片,鼠标点中下一张,如何,动起来了吧?其他能够点种下一张不放就可以连续切换图片的查看器也能实现同样的效果。

5   编码

● 下面就可以开始编码了,思路很容易,依次读取每一张图片,遍历图片上每一个像素点,如果是黑色的话输出一个字符(这里用#字符,因为#块头比较大并且用的是C#),白色的话输出一个空格,将字符串保存在一个文本文件里。
● 仔细观察保存的图片时会发现一个问题,Bad Apple视频里并不是绝对的黑色与白色,还有少量的灰色作为渐变色彩,因此判断黑白的时候还是根据RGB值,只要其中一项大于200便当作黑色处理就好了。
● 第一次保存的时候发现数据量比较大,未压缩大概有将近10M大小,有些难以接受。因为保存的文本大部分字符都是重复的,因此压缩空间应该非常大,于是使用.net自带的Gzip压缩了一下,果然文件大小降至517KB了。
● 此时还可以用另外一种方法播放这段“文本视频”,只要用记事本打开数据文件,调整记事本窗口的宽度与高度(宽度大于一行80个字符,高度刚好每行30个字符),然后按下PageDown按钮,看到效果了吧~!

6   输出

● 剩下的工作就比较简单,只要读取这个文件,并在控制台不停的输出,每次输出30行(因为横向分辨率为30),然后清屏,继续输出。只要设定好每次输出时间的间隔,与截屏的间隔相符的话,动画就可以顺利的在控制台播放出来了。
● 只要仔细调节截屏的帧数、分辨率,控制台的宽度与高度、输出时间的间隔,就一定可以顺利播放出来,当然这个过程比较繁琐。
● 最后给程序添加上背景音乐,这里使用第三方的NAudio库来播放我们一开始截取的音频文件,只要你之前调节的参数没有问题,音频应该和动画达到神同步的境界的。让我们随着Bad Apple的旋律哼唱着“多少红颜为傻逼 多少傻逼不珍惜”来运行我们的程序吧!
/gkimage/7t/5h/o0/7t5ho0.png

7   作品展示

程序及源代码下载 (需要本机安装.net2.0或以上运行环境)

当然这是最简单的实现Bad Apple播放的方式,这里有技术宅达人们使用各种天马行空的方式实现Bad Apple,绝对会颠覆你之前的世界观:

由于版本实在太多,小编在推荐观看的版本前加上了☆号。最为推荐的是☆☆☆定格动画版,其次是☆☆中文填词的沙画版和☆☆彩色激光双屏投影版。

【以下是基于影绘版产生的版本】

7.1   ☆彩色3D重现版

根据影绘版本重构出来的彩色3D版


7.2   Excel版

原理和上面用记事本实现差不多,但是使用更多的单元格做像素可以让画面更加精细


7.5   魔兽争霸版

使用魔兽争霸3自带的地图编辑器 制作,这个比较强大

点击这里 下载地图


7.6   ☆扫雷版

这个很强,使用程序控制鼠标的位置,在相应地方按下右键点上小红旗,就可以实现动画效果了,最后作者用六个扫雷窗口播放Bad Apple


7.8   ☆沙画版

这个版本后面貌似是CG动画而不是沙画的定格...求鉴定


7.14   ☆☆☆定格动画版

这个无论是创意还是工作量都令人汗颜...动用了6566张纸片...


7.15   ☆苹果雕刻版

技术宅拯救世界啊!


7.16   围棋版

使用围棋拍摄的定格动画


7.18   ☆红白机版

出现了!出现了!编程使用红白机输出显示画面,并且使用FC做音源。从0:45开始。


7.22   九格对比版


【以下为脱离了影绘MV,仅基于《Bad Apple》音乐衍生的其他版本】

7.23   ☆☆中文神填词

词填的相当有水平


7.25   midi键盘游戏版

估计不可能有人能弹...两个人估计都完成不了...


7.30   单人分饰四声部...

这人也够神的了...自己演奏完四个声部以后自己剪辑合成...

The End

发布于2011-02-17, 本文版权属于果壳网(guokr.com),禁止转载。如有需要,请联系果壳

举报这篇文章

艾斯昆

程序员,科幻迷

pic