视频转 ASCII 不只是”把像素换成字符”——帧率、字符集、密度三个参数共同决定最终效果。调对了,一段黑白电影能有意想不到的艺术质感;调错了,输出的字符就是一团噪点。
工作原理:从像素到字符
第一步:灰度化
彩色帧 → 灰度图。每个像素用亮度 0-255 表示(0=纯黑,255=纯白)。
标准灰度公式(ITU-R BT.601):
亮度 = 0.299 × R + 0.587 × G + 0.114 × B
绿色权重最高(人眼对绿色最敏感),蓝色权重最低。
第二步:缩放到字符分辨率
假设目标 120 列 × 60 行,原始帧 1920×1080:
- x 方向:每 16 像素 → 1 字符
- y 方向:每 18 像素 → 1 字符(字符高宽比约 2:1,需要更多像素才对应一行)
每个”字符格”内的像素亮度取平均值,得到该格的亮度代表值。
第三步:亮度 → 字符映射
把亮度 0-255 映射到字符串的索引位置:
字符串(从亮到暗):" .:-=+*#%@"(10 个字符)
亮度 0 → 索引 9 → '@'(最暗)
亮度 128 → 索引 5 → '*'(中间)
亮度 255 → 索引 0 → ' '(最亮)
字符串越长,灰度层次越细腻;字符串越短,对比度越强烈(更像素描)。
三个关键参数
参数一:字符密度(列数)
| 列数 | 适用场景 | 文件大小(1分钟视频参考) |
|---|---|---|
| 40-60 | 艺术风格、低保真 | 较小 |
| 80-120 | 终端展示、通用 | 中等 |
| 160-200 | 细节丰富、网页展示 | 较大 |
| 200+ | 高保真、接近原图 | 大 |
高宽比修正:等宽字体的字符高约为宽的 2 倍。120 列 ASCII 图像若不修正行数,显示时纵向会被拉伸。正确做法:
行数 = 列数 × (原始帧高 / 原始帧宽) × 0.5
参数二:帧率
| 帧率 | 主观效果 | 适用场景 |
|---|---|---|
| 5 FPS | 明显卡顿,幻灯片感 | 强调像素格感时 |
| 10 FPS | 基本流畅 | 大多数场景 |
| 15 FPS | 流畅,接近视频感 | 动作较多时 |
| 24 FPS | 与原视频同步,但文件体积大 | 音频同步场景 |
建议从 10 FPS 开始,如果动作场景卡顿明显再提升到 15 FPS。
参数三:字符集
| 字符集 | 特点 | 适用场景 |
|---|---|---|
" .:-=+*#%@" | 短,对比强烈,素描感 | 人脸、轮廓清晰的素材 |
| ASCII 全集 70 字符 | 细腻,灰度层次多 | 细节丰富、需要写实感 |
纯数字 0-9 | 科技感,可读性差 | 赛博朋克风格 |
纯方块 █▓▒░ | 接近像素画,无字母感 | 像素艺术风格 |
| 汉字集 | 中文字符做字符画 | 特殊艺术表达 |
素材选择建议
效果最好的素材类型:
✅ 黑白电影经典片段
✅ 人脸特写(五官轮廓清晰)
✅ 卡通/动漫(色块分明)
✅ 剪影素材(极高对比度)
✅ 慢动作(每帧细节稳定)
效果较差的素材:
❌ 森林、草地(过多细碎细节)
❌ 低光或高噪点视频
❌ 快速摇镜(运动模糊严重)
❌ 大面积纯色背景(字符全是空格,无内容感)
预判技巧:截取视频中间帧,先用图片转 ASCII测试静态效果。静态满意,视频效果不会差。
输出格式选择
| 输出格式 | 优点 | 缺点 | 适用 |
|---|---|---|---|
| HTML | 浏览器直接播放,支持彩色 | 文件较大 | 网页展示 |
| GIF | 通用,可发朋友圈/推特 | 体积大,帧率受限 | 社交媒体分享 |
| 终端 ANSI | 最小体积,技术感强 | 只能在终端播放 | 开发者演示 |
| MP4 | 可添加音轨,清晰度可控 | 需要渲染步骤 | 配音视频 |