javascript 版 Bad Apple 字符动画
作者:阿伍 来源:51js 发布时间:2010-01-28 12:19:00
前一段时间,一个流行的东方系列mv 《bad apple》 带来一股奇怪的风潮: 各种技术狂人纷纷把这段mv在一些匪夷所思的地方重现出来。目前知道的版本有:Excel 版、Word版、命令行版(多种语言)、War3地图版… 等等。(不知道东方系列的请百度 东方project)
花了点时间搞了js的, 字符版本。 速度目前还可以,兼容所有浏览器(吧…)
因为js没法操作2进制,所以视频的编码是用as3解析出来的,呵呵。
一、获取视频编码
这是最重要的一步,没有源,其他东西就无从谈起。
虽然as3有flv播放器,不过为了节省时间,我直接创建了一个fla,把flv拖进去转换为了swf动画。
之后如代码所示,用bitmapdata每隔一段时间将swf的像素捕捉出来。这里设置了跳帧处理,否则生成的文件将很巨大。
这个mv基本由黑白色组成,还有少量灰色。为了简化数据体积,以及之后的压缩算法,必须将其过滤为黑白两色。这个判断很简单,只要判断每个像素是否大于0x888888即可。
private function onEnterFrame(e: Event): void
{
var t: int = getTimer();
if(t > startTime && t < endTime)
{
if(this.pointer ++ < this.waitFrame)
{
return;
}
else
{
this.pointer = 0;
}
this.bmd.draw(loader );
this.bmp.bitmapData = bmd;
outPut();
}
// this.bmd.draw(source, matrix, colorTransform, blendMode, clipRect, smoothing)
}
private function outPut(): void
{
var d: String = "";
for(var h: int = 0;h < this.bmd.height; h ++)
{
for(var w: int = 0;w < this.bmd.width; w ++)
{
d += this.bmd.getPixel(w, h ) > 0x888888 ? "1":"0";
}
d += "n";
}
this.dataArr.push(d );
trace("解码完成,共获得 " + this.dataArr .length + " 帧" );
}
二、javascript播放
得到源,就很好办了。我们现在有很多办法可以让这堆数字动起来,不过最快的方式,应该还是纯字符。
所以我用css简单调节了一下,然后编写一段简单的js脚本让一个div不断刷新文本,即实现了动画。
三、压缩
现在可以播放了,效果流畅,ie6下cpu占用只有20%左右。但是我发现10秒的动画就需要3M的数据文件。很明显若完整复刻长达3分38秒的bad apple 是需要特别压缩的。
但是js没有2进制压缩,所以只能依靠取巧的办法了。 思考了下,决定采用封包形式,即头+身的结构。这也是2进制里常用的方式。
压缩后的动画数据大大降低了,虽然远不及2进制压缩,不过估计也是纯文本压缩的极限了吧。
目前完整还原3分38秒的动画数据大小为2M多点,可以接受范围。
整个过程大约消耗了3小时,重新温习了js,收获了快乐。
------ 1月24号 ------
今天多谢编程浪子提供新的思路,让影片数据的体积下降一半左右。(2.16M -> 1.09M @ 分辨率 90*63)
之前的压缩格式:[长度]_[值] [长度]_[值] [长度]_[值] …
这样的结构,理论上可以支持16灰度,这样可以表现更为优质的画面,并且可以拓展。浪子的思路是放弃多级灰度(实际上,之前的影片也没用上),从而在压缩格式的内部省略了[值]这一部分(和两条分割线)。
本想就此结束的,但今天早上所想到的新压缩算法正好可以在浪子的思路上进行改进。
原本每行都会记录一个回车符(即换行),但其实只需要在头部记录好影片的宽高,那么回车符完全可以动态插入。 去掉回车符并不仅仅只是少了回换行那么简单,这个提升是质的。 因为这让每行都连接起来,段落变少了。
于是,我开始动手修改编码提取器和js播放器,大约1小时后,理论变为现实。 现在的大小再次明显的降低: 1M -> 795k @ 分辨率 90*63)
这时候,可以适当提高分辨率了,因为新算法的压缩比率是越大越明显的。
现在放上 145*104的版本, 视频数据为1.44 M 。 看上去似乎更清楚一点了
附一个测试地址:http://kinkikinki.521066.com/jsMc/test.htm
原始视频: http://www.tudou.com/playlist/playindex.do?lid=7759251
下载地址:Awu_Js_BadApple_NewZip_High.rar.rar (378.69 KB)


猜你喜欢
- IP合法性校验是开发中非常常用的,看起来很简单的判断,作用确很大,写起来比较容易出错,今天我们来总结一下,看一下3种常用的IP地址合法性校验
- 前言 日益增长的分布式应用需求要求实现更好分布式的软件环境,不断推动着分布式技术的进步。Oracle数据复制是实现分布式数据环境的一种技术,
- 利用空闲几天把《JavaScript权威指南》安静的读了一篇。真是一本好书呀!呵呵,这句话见的太多了。好在什么地方呢?听我慢慢道来。从开始接
- socket接口是实际上是操作系统提供的系统调用。socket的使用并不局限于Python语言,你可以用C或者Java来写出同样的socke
- pycharm是一款高效的python IDE工具,它非常强大,且可以跨平台,是新手首选工具!下面我给第一次使用这款软件的朋友做一个简单的使
- 在使用SQL*LOADER装载数据时,由于平面文件的多样化和数据格式问题总会遇到形形色色的一些小问题,下面是工作中累积、整理记录的遇到的一些
- 单神经元引论对于如花,大美,小明三个因素是如何影响小强这个因素的。这里用到的是多元的线性回归,比较基础from numpy import a
- 前言 作者: 罗昭成PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://note.youdao.com/not
- pinyinEngine ™v0.1JavaScript拼音搜索引擎应用场景:可对本地缓存数据进行拼音匹配,如SNS网站好友快速查找、地区匹
- 这种方案是通过对代码进行加密,然后利用C语音写解密的PHP扩展。破解难度会有提升,但依然是会被破解的。 从网上找过各种代码加密的开源方案。
- Qt Designer用于像VC++的MFC一样拖放、设计控件PyUIC用于将Qt Designer生成的.ui文件转换成.py文件Qt D
- 1、jsp页面,携带值跳转到新页 original.jsp var btnClick = {'click .showne
- python数据分析工具pandas中DataFrame和Series作为主要的数据结构.本文主要是介绍如何对DataFrame数据进行操作
- 本文为大家分享了mysql 8.0.15 winx64压缩包安装配置方法,供大家参考,具体内容如下1、在官网下载压缩包2、解压缩包3、增加配
- 基本设置class Map3D( # 初始化配置项,参考 `global_options.InitOpts` &n
- 前提环境准备python3+pillow+pyautogui先提前安装好python3以及pillow和pyautogui模块这里介绍一下模
- 废话不多说了,直接上代码吧:#Copyright (c)2017, 东北大学软件学院学生# All rightsreserved#文件名称:
- 编译安装全是坑……第一遍装完无法使用pip,报错找不到ssl模块。各种报错:pip is configured with locations
- 1.如何引入在vue-cli里,引入文件有几钟方法一种是用npm或者cnpm指令去下载对应的插件,然后在main.js里用import方法引
- 快速掌握 Mysql数据库对文件操作的封装在查看Mysql对文件的操作中,它在不同的操作系统上对文件的操作,除了使用标准C运行库函数,包括o