代码化的运动设计
首先询问用户
- 格式和时长(例如:Reel 9:16 1080×1920 30fps),以及将在哪里发布。
- 品牌色、字体、Logo,以及哪些元素不可修改(Logo必须原样使用)。
- 参考风格(一个视频或图片),以及是否包含文字或仅为图形。
- 最终剪辑是否由用户自己完成(Premiere/After Effects):如果是,则交付独立的片段,而非单一视频。
引擎
- Node +
@napi-rs/canvas 进行绘制,ffmpeg 进行编码。
- 每一帧都是时间的纯函数
draw(ctx, t):帧之间无状态,因此任何时刻都可以重新生成、检查或并行渲染。
- 文件分离:库(调色板、字体、缓动、弹簧)、序列、背景、渲染、contact sheet、分析。
- 在 Windows 上,Python 命令为
py。
运动
- 弹簧(阻尼弹簧的闭式响应)用于入场和位移:起始果断、到达柔和、超调仅轻微可感知。保留 3–4 个预设(标准、快速用于退场、慢速用于大位移、柔和),而不是分散的值。
- 柔和的 缓入缓出 用于形状变形和线条绘制。
- 运动模糊:4 个子帧,180 度快门角度,取平均值。会减慢渲染速度:提供一个无模糊选项用于预览。
- 序列元素之间偏移 0.05–0.15 秒。
- 如果风格优雅,则避免卡通式弹跳;保持放松的节奏,动作之间留有空间。
连续性
- 采用“形状变形”风格:每个场景从上一场景的几何体演变而来,没有生硬的切换。
- 元素不会在变换过程中消失后又重新出现:当新元素诞生的同一帧内,原始元素停止绘制,且位置、大小和颜色保持一致。
- 两个互换的形状在互换瞬间共享旋转、缩放和颜色;淡入淡出效果叠加(永远不要出现空帧或双重帧)。
- 大的白色填充:从中心以实心方式生长,而不是通过淡入(淡入会显得发灰)。
- 如果风格需要,不要有静止元素:加入呼吸感、缓慢旋转、漂浮、轻微的摄像机推进。
控制
- 在完整渲染之前,生成 contact sheet(帧缩略图)。
- 一个分析脚本,每 0.5 秒测量图像变化:找出静止片段和突变部分。
- 使用
ffprobe 验证最终文件的时长、分辨率和帧率。
导出
- 预览/社交:MP4 H.264
-crf 14 -pix_fmt yuv420p。
- 剪辑:MOV ProRes 422 HQ 10 位。
- 音频随后添加:
ffmpeg -i video.mp4 -i audio.wav -map 0:v -map 1:a -c:v copy -c:a aac -b:a 256k -shortest finale.mp4
Instagram Reel
- 图形中心位于 (540, 960);可用宽度最大约 900 px。
- 个人主页网格将中心裁剪为 4:5 (1080×1350) 和 3:4:关键内容位于 y≈420 至 y≈1500 之间。
- 底部和右侧有 app 的说明文字和按钮:请留出空间。
- 其他导出尺寸请参见
grafica 插件。