/RTVP

Bad Apple playing in WOW Chat Window

Primary LanguageLuaMIT LicenseMIT

English version click here!

WOW聊天框的Bad Apple

10.0上线整了个烂活,用WOW自带聊天框播放转换成文字的Bad Apple视频帧。

用法太长不看版

  1. !RTVP 文件夹是插件本体,复制到该复制到的地方
  2. 进入游戏之后新建一个叫 RTVP 的聊天窗口,建议手动取消所有频道和系统消息
  3. 不出意外的话,重载一下界面 /reload 然后敲命令 /rtvp stage
  4. 此时在 RTVP 聊天窗口应该出现了黑白相间的方块文字,调整聊天框大小,让文字刚好形成一行黑一行白的样式
  5. 使用 /rtvp play 命令开始播放。备注:没有自带音乐,你需要自己在后台开个音乐

原理

WOW的聊天框有两个基础功能:

  • ChatFrame:AddMessage(msg):往聊天窗口显示文字,支持调整文字颜色,就暴雪那个格式 |cFFFF0000红色文字|r
  • ChatFrame:Clear():清空聊天窗口。

有这两个基础功能,就可以依次先清屏再显示图片转成的文字,只要速度够快看起来就是视频了。

实现

根据测试,WOW的聊天框拖到最大能显示22行文字,由于Bad Apple影绘原视频是4:3,所以选取了28x21的分辨率。

由于WOW聊天框行距比较宽,所以显示方块(■)字符的中间得插个空格。

再由于实际上分辨率太低,帧率高低影响不是很大,最终选取了折衷的15fps(原视频是30fps),三千多个视频帧,不少了。

因为Bad Apple影绘是黑白的,所以决定把像素设置成4种颜色,白色、浅灰(#212121)、深灰(#424242)、黑色,对应0~255以64分段的灰度。

视频转换图片

tools 文件夹里就是用来生成原始视频数据的脚本。ffmpeg 和Bad Apple的视频没有自带在里面,如果你想自己转,记得把 ffmpeg.exe 和视频放进去。

video_to_image.bat 就是用来以15fps帧速率将视频转换成28x21黑白图片的脚本。双击即可。

其实就是 ffmpeg -vf scale=28:21,fps=15,hue=s=0 而已。

图片转换文本

generate_frames.py 是利用 Pillow 库将图片转换成文字的脚本,原理也很简单,就读取每个像素的灰度,然后0~255按64分四段,分别对应一种颜色。

因为哪怕28x21也有快600个字符了,所以画蛇添足搞了个压缩:因为每个像素只有四种颜色,三个像素有4x4x4一共64种组合,分别用A-Z、a-z、0-9和符号来三个三个分组对应表示(伪Base64……)。这样每个视频帧就压缩到了大约200个字符,方便看。

双击运行之后会自动生成一个 generated_frames.lua ,里面一大堆的 table.insert 覆盖到 video_frames.lua 的对应位置就哦了。

插件本体

就是读取这些帧,把压缩后的文字还原成像素,把像素替换成对应颜色的方框,然后按照每帧的时间戳依次在对应的聊天框里显示。