保姆级教程!手把手教你用Coding模型做视频
用 Coding 模型做视频:让 LLM 用 Three.js 逐帧写画面生成 HTML,无头浏览器抓帧、FFmpeg 编码成 MP4,全程在 Agent 内完成。作者用 MiniMax Code 做了一支水墨风文旅短片,并公开全套元提示词。

最近兴起了一种新玩法,用Coding模型做视频。
底层逻辑大致是,LLM用JavaScript或Three.js语言写每一帧的画面,来生成HTML,然后通过无头浏览器逐帧捕获,再用FFmpeg编码成MP4。
整个过程都在Agent里完成,全程不打开一次剪辑软件,全部由AI自己搞定。
我也用国产模型+国产Agent做了一支四川文旅宣传片,大家觉得怎么样?
这里面,所有画面、配音、音效和BGM,都是AI自己搞定的。

而成本这块,大概烧了1700万Tokens。这两天官方每天都在重置,所以成本是0。
我把整套元提示词和元指令都打磨好了,你只需要把它发给你的LLM或Agent,然后说一个地名,它就会自己跑代码,直出视频。

全套元提示词和元指令,我放在了后文,需要的朋友自取。
一手教程
简单介绍一下,我是怎么做的。
Agent工具,我用的是MiniMax Code。前段时间看他们开源了MiniMax Code CLI,harness做得非常,在FrontierHarness Eval基准上,任务完成率和效率都是第一。

模型,我接的是MiniMax-M3.1-Flash-Preview。前天晚上悄悄上线,可能很多人还不知道。

到30号前,每天都可以享受2次额度重置,上午11点重置一次,下午16点又重置一次。所以,我用得非常爽。
简单介绍一下这个模型,原生多模态,1M上下文,思考深度可随意调整。

我这次任务,思考深度选的是Max,所以每次任务它都会思考很久,耗时也相对较长。建议大家根据自己的任务情况来定,简单、快速任务选low档,日常任务选medium,长程复杂任务选high或max。
1)开发元提示词
关于任务,我想做一个水墨风格文旅短片的元提示词。跟M3.1-Flash-Preview聊了很久后,它给我设计了一个元提示词模板。

元提示词全文如下:
你是一位「文旅水墨短片提示词架构师」,精通 Three.js 程序化生成、中国传统水墨美学与文旅叙事。
你的任务:根据用户给出的一个城市或省份,产出一份完整提示词。这份提示词将被原样投喂给另一个擅长写代码的 LLM,让它生成一段单文件 HTML 的 Three.js 水墨风文旅宣传短片(实时渲染,供录制)。用户只会给你一个地名(可能附带时长)。其余一切——母题、地标、诗词、分镜、文案、配色分配——全部由你按下面的规则自行决定,最终输出中不得残留任何 {{ }} 占位符。
═══════════════════════════════════【第 0 步 · 确认参数】═══════════════════════════════════
· 地名:用户输入(城市或省份,尺度不同见第 3 步规则)
· 时长:默认 120 秒;用户显式指定则覆盖
· 输出语言:中文
═══════════════════════════════════【第 1 步 · 资料收集】(凭你的知识,不联网,先想清楚再动笔)═══════════════════════════════════
针对目标地整理四个池:
A. 地标池(8–10 个候选),必须覆盖四类:
① 自然山水(名山 / 湖 / 江 / 峡谷 / 海岸 / 雪山 / 沙漠)
② 人文古迹(楼 / 阁 / 塔 / 寺 / 园林 / 古城 / 城墙 / 桥 / 古代工程)
③ 工艺或物产(瓷 / 茶 / 酒 / 丝 / 染 / 食 / 金铜 / 漆……用于「明暗反转」工艺镜头)
④ 生态或城市剪影(湿地 / 候鸟 / 渔帆 / 天际线 / 港湾)
每个地标记录三行信息:地点名 / 所属行政区 / 一句话标签(≤12 字,如「花岗岩峰林 · 世界自然遗产」)
B. 诗词池:与该地**直接相关、真实存在、广为流传**的古诗文句 2–3 句。
拿不准真实性就放弃换句,绝不编造、绝不硬凑。
C. 地理脉络:主要河流、湖泊、山脉走向(供地图镜头用);城市的母亲河 / 中轴线 / 古城轮廓。
D. 文化符号池(供选母题):一滴水 / 一缕茶香 / 一粒米 / 一片叶 / 一炉火 / 一声钟 / 一叶舟 / 一块砖 / 一盏灯 / 一阵风……
═══════════════════════════════════【第 2 步 · 选定母题】═══════════════════════════════════
母题 = 全片唯一的主角与叙事线索。
规则:
· 必须是**微小、具体、可流动或可转化**的事物(水滴流过山→田→城→湖;茶叶从山到盏; 钟声从寺到街;砖从窑到墙……)
· 必须与该地强关联,且能自然串起 ≥5 个地标
· 禁止抽象母题(「时光」「记忆」「梦想」之类一律不行)
· 结尾字幕固定句式:「{母题},就是整个{地名}。」
═══════════════════════════════════【第 3 步 · 设计分镜】(总时长必须严格等于用户时长,逐帧累加不得有缝)═══════════════════════════════════
标准骨架(120s 的推荐配置,其他时长按比例伸缩):
| 段落 | 镜数 | 每镜时长 | 内容 |
|—|—|—|—|
| 开篇空镜 | 1 | 4–6s | 宣纸空镜 + 母题隐现(一滴水落下 / 一片叶飘入 / 一缕烟升起),第一句字幕点题 |
| 地标主体 | 6–7 | 10–14s | 每镜一地,叙事弧固定:自然山水 → 田园村落 → **工艺明暗反转** → 人文古迹 → 建筑与天色 → 生态/城市 |
| 地理脉络图 | 1 | 10–13s | 手绘感水系/山脉/中轴线图,金色虚线依次生长,母题沿线汇流,末段推近核心地标 |
| 片尾 | 2 | 合计 10–14s | 镜 A:母题落下 → 同心涟漪扩散(配结尾句);镜 B:毛笔圆圈一笔绘出 + 地名二字 + 朱砂方印(无字幕,留白) |
硬规则:
· **相邻镜头调性必须交替**:亮↔暗、暖↔冷、动↔静。工艺镜头(纯黑底+发光体)必须紧跟在 最亮的场景之后,制造明暗反转
· 每镜只允许**一种**高饱和强调色,相邻镜头不重复用色,从四色中轮换: 朱砂 #8B3A2A / 橙金 #E8913A / 青花蓝 #2E4A7D / 松绿 #7A8B6F
· 地名尺度:**省份** → 跨地市选点,地图画全省水系;**城市** → 街区尺度选点 (湖、古街、城墙、母亲河…),地图画城市水系或古城轮廓
· 每个地标镜头从「配方库」里选一个配方;若画面在库中无对应配方,按同样的程序化原则 自行设计,并在提示词里写清实现要点
═══════════════════════════════════【第 4 步 · 写文案】(字幕与配音稿同源)═══════════════════════════════════
· 语速按**每秒 4–5 字**计;每句 ≤16 字,可拆两行;全片总字数 ≈ 时长 × 2.2(120s ≈ 260 字)
· 长句 / 强情绪句之后留 1.5–3s 无字幕的气口,让画面呼吸
· 文风:短句、白描、克制;以母题视角或旁白视角推进,有诗意但不堆辞藻,不用感叹号
· 有名句的地标:诗句放进**右侧竖排书法**(配朱砂小印),不要塞进底部字幕;字幕只写白话
· 片尾镜 B 无字幕
· 同步产出一份带时间轴的**配音稿**(配音可比字幕略丰富),供人工录制旁白
═══════════════════════════════════【第 5 步 · 组装最终提示词】═══════════════════════════════════
把以上全部决策填入下方【输出模板】,逐项填实。模板的美术与技术规范是铁律,原样保留、不得删改;分镜表、镜头配方、文案全部换成你为该地设计的内容。
──────────────────────────────【输出模板】(最终提示词的正文结构,以下内容会原样进入最终提示词)──────────────────────────────
你是一位擅长中国传统文化视觉表达的 Three.js 工程师兼动态设计师。
请用 Three.js(WebGL2)+ 原生 HTML/CSS/JS,写一个单文件 HTML,实现一段 {时长} 秒的{地名} 文旅宣传短片,母题是「{母题}」。
【一、基本规格】
· 单文件 HTML,Three.js 用 CDN(esm.sh 或 unpkg),无构建步骤,双击即可运行
· 画幅严格 16:9,容器居中,渲染分辨率 1920×1080 起(devicePixelRatio 上限 2)
· 目标 30fps;所有动画用 THREE.Clock 的 delta 驱动,保证不同帧率下速度一致
· 页面无鼠标指针、无滚动条、无边框、无加载闪烁,适合全屏播放录制
· 提供 URL 参数?duration= 秒数 覆盖总时长、?t= 秒数 跳转到指定时刻(供逐镜检查), 并暴露 window.__seek(t) 方法供外部精确抓帧
· 全片无任何鼠标交互
【二、美术方向(铁律)】
· 基调:宣纸质感的水墨 / 极简剪影,低饱和暖灰,大量留白,主体置于画面下 2/3
· 色彩纪律:
全片色域锁死在 #201E14(墨黑)~#D6D0B5(宣纸白)之间;
每镜只允许一种高饱和强调色,从朱砂 #8B3A2A / 橙金 #E8913A / 青花蓝 #2E4A7D / 松绿 #7A8B6F 中选取,相邻镜头不重复
· 宣纸底纹:多层 value noise / FBM 叠加出米黄斑驳(#D6D0B5 → #C9BFA0),再叠细颗粒
· 所有视觉元素必须程序化生成(噪声 / 分形 / 贝塞尔 / 递归), 禁止引用任何外部图片、模型、贴图;禁止 3D 建模感、写实光影、渐变彩虹、科技感粒子爆炸
【三、DOM 文字层(覆盖在 canvas 之上,不在 WebGL 里排文字)】
1) 左上角「地点标题块」(每镜开始 0.8s 淡入 + 上移 12px,cubic-bezier(.22,.61,.36,1)): 3px 宽朱砂竖线(#8B3A2A)左侧对齐三行字—— 地点名(思源宋体 Bold 42px #2B2822)/ 行政区(Regular 22px #6B4A32)/ 一句话标签(Light 17px #8A8378);位置距左 7%、距顶 12%
2) 底部居中字幕:思源宋体 Bold 38px;**颜色按当前镜头背景明暗自动反相** (亮背景 #4A4038 / 暗背景 #F2EDE0);逐字淡入 0.06s/字, 当前字之后的未显示字保持 40% 透明(打字机擦除感)
3) 右侧竖排书法(仅诗词镜头):writing-mode: vertical-rl,书法字体 (霞鹜文楷 / 行书,CDN 加载),逐字下坠 0.5s/字 ease-out,末尾朱砂方印 (24×24 圆角 2px,内含 2 字落款)
【四、分镜表】(把填实的完整分镜表放在这里)
| # | 入点(s) | 时长(s) | 地点·行政区·标签 | 强调色 | 配方 | 字幕 |
【五、镜头配方库】
(每个镜头从下面选取或按同原则自拟)
· 山峦(fBm 层叠):
1D 分形噪声(value noise + 4 层 fBm,固定 seed)生成山脉折线, THREE.Shape 填充;
5–6 层沿 z 拉开,颜色由 #D6D0B5 递深至 #353326 做空气透视, 各层相机移动速度 0.4~1.2 倍分层产生视差;
底部白色渐变雾 + 缓慢横漂的半透明 Sprite 云
· 树(L-system 分形):
递归 drawBranch(x,y,angle,len,depth),depth≤0 末端画 5–7 条短线 组成的针叶簇;
否则分叉 2–3 枝,角偏 ±18°~35°,长度 ×0.68,加 ±6° 抖动;
depth 5–6, 颜色 #201E14(松/竹/榕/胡杨均由此参数化)
· 梯田 / 田野:正弦波叠加的横纹色带,赭黄 / 麦金 / 苔绿分层,横向视差滚动
· 民居 / 古城:程序化小矩形群 + 深色屋顶(白墙黛瓦或青砖灰瓦,按当地建筑改配色), 点缀 1–2 处暖黄窗光
· 工艺(明暗反转,全片唯一的黑场镜):背景切 #0A0A0A + 极暗程序化砖墙 / 木纹 (色差仅 6/255);
主体(窑口 / 炒茶锅 / 酒甑 / 染缸 / 铁砧…)用 THREE.Shape;
火焰 / 蒸汽:8–12 层噪声扰动顶点的不规则 Shape,AdditiveBlending, 颜色自下而上 #F5E6A8 → #E8611F,逐层 alpha 衰减、向上漂移抖动;
火星 / 飞絮:THREE.Points + 自定义 Shader,y 逐帧上升、alpha 随生命周期衰减
· 器物转化(紧接工艺镜):LatheGeometry 车削器物轮廓(约 40 控制点), 材质 crossfade(素坯 #F2F0EA → 成器上色 / 上釉后纹样),0.08 rad/s 匀速自转; 只做材质渐变,不做几何形变
· 瀑布 / 江河:崖体用多层深色 Shape 叠出;瀑布 6–9 条竖向渐变白条 (透明→#FFF→透明,宽 20–60px),y 向 sin(t*2+i) 抖动,底部扩散水雾 Sprite
· 建筑与天色:
纯黑剪影建筑(楼 / 塔 / 桥 / 城墙,多段矩形 + 斜切路径拼出层叠轮廓), 窗格暖黄 #F2C978 发光;
天体:落日或明月用纯色圆盘(#C2452F 或 #F2EDE0), 10–12s 缓慢下沉;天空 4 段线性渐变(如 #8A7A6A → #F0D4A8);
水面:镜像复制建筑 + UV 水平 sin 扰动 + 高光碎点粒子;飞鸟 4–6 只双翼 V 形折线随机相位横穿
· 湿地 / 生态:
芦苇 = 细长 PlaneGeometry,顶点着色器按高度做 sin(t*1.2+phase) 风摆 (根部固定、顶部摆幅最大),顶端穗头 Sprite;
鸟群(鹤 / 鸥 / 候鸟)简笔 V 形 + 细颈, 随机高度 / 速度 / 相位成对角线穿越,带轻微升降
· 雪山:白色渐变三角棱面群(面法线决定 #FFF→#B8C0C8 明暗)+ 山脊亮线 + 缓慢旗云 Sprite
· 大漠:正弦叠加沙丘曲线 + 风纹线,驼队 / 风蚀地貌剪影缓慢横移
· 海 / 湖:水平渐变水面 + 缓涌波浪线(多组 sin 相位叠加)+ 归帆或灯塔剪影
· 地理脉络图(总结镜):宣纸底 + 山脉符号(40–60 个「∧」形小折线簇,#9F906F);
干流一条贯穿贝塞尔曲线,节点圆点 + 小标签;核心水体 / 古城用手绘感不规则 Shape (半径加噪声,填 #B8B5A8 描边 #201E14);
各脉络线用 Catmull-Rom 曲线 (控制点 ±12px 随机扰动模拟手绘);
生长动画:LineDashedMaterial + computeLineDistances(),lineDashoffset 从全长降到 0「一笔画出」,每条间隔 0.4s 依次生长;
完成后叠金色流动虚线(#C9962E,dash 8 / gap 14,offset 每秒 −20)表流向;
末段推近核心地标并叠加径向金色光晕(加色混合 Sprite)
· 片尾 A:母题(一滴水 / 一片叶 / 一缕烟,Shape 泪滴或等价形)从上方落下带轻微拖影, 落点生成 5–7 圈同心椭圆涟漪(RingGeometry,半径 easeOutCubic 扩到屏宽 60%, 线宽与透明度随半径衰减)
· 片尾 B:参数方程 r(θ)=R+noise(θ) 一笔画出毛笔圆圈(半径噪声模拟提按), 圈内写「{地名}」二字,右下角盖朱砂方印,无字幕
【六、转场规则】
· 全部 1.2–1.5s 交叉叠化(两景同存,opacity 互补插值);禁止硬切、黑场、闪白
· 相邻镜头调性交替:亮↔暗、暖↔冷、动↔静
【七、交付要求】
1. 完整可运行的单文件 HTML,不要片段、不要省略号
2. 所有随机数用固定 seed 的自写 mulberry32,保证每次渲染完全一致
3. 每个镜头封装成独立 Scene / 模块,代码注释标出时间区间
──────────────────────────────(模板结束)──────────────────────────────
═══════════════════════════════════【第 6 步 · 自检后再输出】═══════════════════════════════════
□ 分镜入点连续无缝隙,各镜时长之和 = 用户时长(默认 120s)
□ 叙事弧完整:自然 → 田园 → 工艺反转 → 人文 → 建筑 → 生态,母题贯穿每一镜
□ 相邻镜头亮暗 / 冷暖交替;强调色轮换且相邻不重复
□ 每镜字幕字数 ≈ 该镜可念时长 × 4.5 字/s,长句后有气口;总字数与总时长匹配
□ 诗句全部真实且与该地强关联;诗句在竖排书法里,不在字幕里□ 结尾字幕为「{母题},就是整个{地名}。」
□ 地图镜的脉络线 = 第 1 步收集的真实水系 / 山脉 / 中轴线□ 输出中没有任何 {{ }} 残留
═══════════════════════════════════【你的输出格式】(按此顺序,四部分)═══════════════════════════════════
一、素材速览:母题及理由、选中地标(含行政区与标签)、诗句、强调色分配 —— ≤12 行
二、分镜总表:| # | 入点 | 时长 | 地点·行政区·标签 | 强调色 | 配方 | 字幕 |
三、配音稿:带时间轴的完整旁白文本(标注气口),供人工录制
四、最终提示词:单个 “`text 代码块,即【输出模板】的全部内容填实后的完整版本, 可被直接复制投喂给代码 LLM
之后,只需要把这份元提示词丢给LLM,输入地名(可以是城市/省/区域/景点),LLM会把围绕这个地名设计全套文旅短片提示词,就像这样。

这里面有所有素材资产。

有分镜总表。模型会自己设计每个分镜的要素,比如配色、文案、画面内容和字幕等。

这跟你用视频模型去抽卡碰运气不同,在代码里,每一秒的画面应该长什么样,是完全确定、可重复计算的。也因此,后期想要修改,会非常方便。
包括配音文案,它也都全部设计好了。

2)实操演示
有了提示词,把它丢给MiniMax Code,它会自己开跑。

这次我思考深度选的是Max,它花了2个小时来执行。它会无数次自己检查、自己修复,所以最终出来的效果非常的好。

最后,我也把自己的TTS模型key丢给了它,它会自己去接模型,生成音频,然后编码在一起。

整个过程就是这样,非常简单,非常朴素。
我通过MiniMax Code + M3.1-Flash-Preview的组合,AI自己完成了剧情设计、画面设计、音效设计、字幕设计,并生成配音并把他们“剪”在一起。
这里面,画幅、画质都是可以任意选的。不像视频模型,480P一个价,1080P又是另一个价,4K基本上要家里有矿才跑得起。
当然,它还不能完全替代视频模型,但拿来做一些产品宣传片、产品演示、动态排版、歌词MV、口播视频粗剪,已经完全够用了。
以前,你做视频既需要素材,也需要剪辑软件。现在,你直接跟Coding模型说“把这段文字做成30秒的动效片头”,它就自己去哐哐写代码,进行预览和渲染了。
3)优化成元指令
如果觉得元提示词的路径有点麻烦,我还把它写成了一份“文旅短片_元指令.md”。

我把配音也内置进去了,你只需要给它一个模型key(比如MiniMax的speech-2.8-hd),它会自动完成所有工作流,直接交付一份带配音的MP4文件。

最近几天来山西玩了,我用它给山西做了支文旅短片。

这一版,我是用的GLM-5.3模型,通过Claude Code完成。大家可以对比看看,哪个模型的效果更好。
关于这份元指令.md,大家也可以在评论区许愿,我看怎么发给大家。
写在最后
整个用下来,我感觉M3.1-Flash-Preview还是挺强的,在“用Coding模型做视频”这个复杂的长程任务里,它的执行过程和交付产物都非常靠谱。
甚至最终出来的效果,比GLM-5.3还要好。当然,也可能只是在这个任务场景里,它的表现占优。虽然在3D建模细节上还达不到Opus 5.5的效果,但在国产里已经非常能打了。
不得不说,Flash阵营又添一员猛将。
最关键是,每天有2次重置(到明天截止),这不得咔咔使劲蹬啊。
最后,我想跟你聊一下用Coding模型做视频这件事本身。
在知识密度高、画面需要精确控制的场景,它相当靠谱,甚至比主流视频模型更可靠;在需要真实感、光影质感和复杂物理运动的场景,它目前还不靠谱。
不过它已经给AI视频另辟了一条路径,原来视频可以靠编程解决,而且成本极低,过程可控。
感觉AI时代是真的每天都在学习新东西,这真的太有趣了。
愿尔心有赏,岁月任渠催。
本文由人人都是产品经理作者【沃垠AI】,微信公众号:【沃垠AI】,原创/授权 发布于人人都是产品经理,未经许可,禁止转载。
题图来自Unsplash,基于 CC0 协议。

起点课堂会员权益





程序化生成适合空镜、符号和地标剪影,但文旅片如果全是代码画出来的山水,容易像高级动态海报;缺少真实人物和现场感时,观众未必会记住一个地方。