Remotion 故事演绎视频
把「一个故事」变成一支 1080p 演绎成片:通读故事 → 提炼主题气质 → 为这个主题设计专属的视觉语言 → 拆成"段(章节)→ 镜(画面节拍)" → 逐镜设计与情节情绪一致的场景动画 → 文字卡点演绎 → 渲染 → 抽检。
第一原则:风格服务于主题,没有固定模板
流水线和方法论是通用的,视觉风格必须按主题重新设计。
- 每个新故事先做「主题气质分析」:这个故事的关键词是什么(怀旧?热血?悬疑?童话?科技?)→ 推导配色、字体气质、动效节奏、场景画风
- 例证(仅作思路参考,不是规范):温情回忆向 → 衬线宋体 + 米白/金 + 慢节奏柔光;热血竞技向 → 无衬线粗体 + 高饱和红黑 + 快切重拍;科幻向 → 冷色 + 等宽字 + 故障/扫描线动效;童话向 → 圆体 + 马卡龙色 + 弹跳动效
- 不要把上一个项目的风格带进下一个项目;用户没有明确指定时,先给出 1–2 个风格方案让用户选
核心理念
- 画面讲故事:每一镜的画面必须与该句情节的情绪和动作一致(地震句配摇晃的教室、欢呼句配挥旗人群、排队句配护栏长队)——错配(悲伤配喜庆)是最大忌讳
- 场景用程序化动画(人物剪影/几何图形 + sin 相位错开的运动,逐帧驱动),不用静态贴图;动画密度按主题定(柔情题材少而缓,热血题材多而快)
- 排版是表演的一部分:字体气质、字号层级、关键词强调色都从主题推导
流水线(五步,顺序固定)
- 风格推导:主题关键词 → 配色板 / 字体气质 / 动效节奏 / 场景画风 →(未指定时给用户选)
- 故事拆解:按情节弧拆段(章节)→ 镜(1–2 行一镜);每段结尾提炼短金句做总结卡;行尾清标点(
clean_tail()通用清理) - 时间轴
gen_assets.py→ timeline.json(镜头起止/版式/卡点;MIN_SHOT 3.5s 慢切保底可按主题调) - 断言审计 + 同步
check_views.py(映射覆盖/越界)+verify_timeline.py(行尾标点=0 / 最短镜头≥3.0s / 总结卡时长 / 年龄标签,阈值可按主题调)——任一失败禁止渲染 →sync-timeline.mjs - 渲染 + 抽检
npx remotion render→ ffmpeg 抽关键帧复核(场景情绪/文字层级/动画时序)
硬性规则(与主题无关,永远成立)
- 行尾一律无标点(含破折号):通用清理函数 + 断言 = 0
- 画面与台词情绪严格匹配;SHOT_VIEW 映射表改分镜必重跑审计
- 嵌套 Sequence 里子组件的动画原点 = 其所在镜头起始帧(传 startFrame),否则入场动画被静默跳过
- 政治符号规范画法(国旗 = 红底 + 一大四小金星),禁止任何近似涂鸦
- 换真人配音:放 wav 重跑 gen_assets 自动重排时间轴
已有资产(参考实现,可复用可改造)
templates/ 来自定稿项目「90 后年代志」(温情回忆主题:衬线宋体 + 米白金 + 慢节奏 + 人群剪影群像)——它是主题推导的一个实例,不是默认风格:
- 可直接复用的骨架:gen_assets.py(文案→时间轴结构)/ check_views.py(映射审计)/ verify_timeline.py(综合断言)/ sync-timeline.mjs / fit.ts(折行)/ beat.ts(拍点)
- 按主题重写的视觉层:theme.ts(配色/字号)/ serif.ts(字体)/ scenes.tsx(场景动画)/ TitleCard.tsx / Era.tsx / Intro.tsx(版式)
- 8 个群像动画技法可迁移:人群挥旗、围观电视、地震教室、排队、口罩行人、追孩子喂饭、烟花、灯笼(换配色换画风即是新场景)
详细参数
references/spec.md:上述参考实现的完整参数(字号五档/入场四向/景深/慢渐显时长/剪影色阶),新主题可对照调整量级,不必照抄数值。