先纠正一个认知:如果你让一个叫 Opus 5.5 的模型“生成一段视频”,它给你的往往不是一个 .mp4 文件,而是一个 .html 文件。双击打开,浏览器里开始播放一段动画,你有种“视频已经生成了”的错觉;可一旦把文件拖进剪辑软件,你会发现那只是一份网页源码。
这个细节,才是这类代码型视频生成的真相:模型不直接画像素,而是写代码,让浏览器逐帧渲染出画面。这篇内容就来拆一拆它到底怎么做到、为什么会这么做、以及你如何把它用在真实项目里。适合产品原型党、动效设计师、前端开发,以及所有对“AI生成内容”好奇的人。读完你至少能自己复现一个带粒子特效的动态标题,并且把它转成真正的视频文件。
1. 真相:它生成的不是视频,而是“播放器 + 剧本”
1.1 你收到的是一个 HTML 文件
很多人的第一反应是:“我说生成视频,它怎么给我一个网页?”这其实是把问题想反了。传统意义上的文生视频,模型要直接预测连续的像素帧,这个路线又贵又难,而且容易翻车。而 Opus 5.5 这类强代码能力的模型,走的是另一条路:它生成一段可运行的网页脚本,你在浏览器里打开,效果就像一个视频在自动播放。
从用户角度来说,结果看起来都是“我以为我看到了视频”;但从资产角度来说,差别大了。一个是不可编辑的像素流,一个是可改参数、可调颜色、可换文字的“动画源工程”。我见过不少第一次接触这类生成方式的开发者,一开始会懵:“我要的是能交差的高清视频,你给我一个 html?”等他们在浏览器里按 F12 改了几行代码,看到画面实时变化之后,基本都会改口:“这东西比视频好使多了。”
这里有个很重要的点:浏览器本身就是一个极其强大的渲染引擎。模型只需要把画面逻辑写对,剩下的渐变、阴影、粒子运动、合成叠加,全部交给引擎去算。模型真正做的工作,是“安排画面”,而不是“画出画面”。
1.2 浏览器逐帧绘制的完整链路
要理解“逐帧画出来”,就得先知道浏览器渲染画面的基本链路。你在浏览器看到一个动画,并不是屏幕主动“显示”了动的东西,而是浏览器反复执行了一套流程:
- 解析 HTML,构建 DOM 树;
- 解析 CSS,构建样式结构;
- 执行 JavaScript,修改 DOM、Canvas 或 SVG 内容;
- 计算布局,确定每个元素的位置和尺寸;
- 绘制,把图形实际画到图层上;
- 合成,把多个图层合成后输出到屏幕。
对于 Canvas 动画来说,第 3 步最为关键。JavaScript 里通过 requestAnimationFrame 注册一个“每帧回调”,浏览器每次刷新屏幕前都会调用它。你在回调里更新粒子的位置、重新擦除画布、重新绘制所有图形,一帧就完成了。屏幕 60Hz,就每秒执行 60 次,看起来就是流畅的视频。
所以 Opus 5.5 生成的“视频”,本质上是生成了这么一套循环逻辑:每帧该画什么、画在哪儿、透明度多少、粒子往哪个方向飞。这就是我标题里说的“它不生成视频,是写代码让浏览器逐帧画出来”。它写出来的不是最终成品,而是一段可以被反复执行的“动画剧本”。
1.3 搞清楚这个区别的价值
如果你只是想要一个能发的视频文件,这个区别可能无所谓;但如果你是做产品、做运营素材、做动态数据可视化,这个区别能直接影响你的工作流。
传统的生成视频是一次性的:生成完,你想改一个字,就要重新生成整个视频。即便某些平台支持局部重绘,精度也堪忧。而代码生成的动画,你可以直接改文字、改颜色、改速度参数,刷新页面就能看到新效果,不消耗任何模型算力。这意味着“视频”从生成结果变成了一种可迭代的项目资产。另外,浏览器渲染是矢量级的,理论上可以导出任意的分辨率,不会像像素预测模型那样,放大一段就糊成马赛克。
把心态从“让它生成视频”切换成“让它编写动画程序”,你会发现这套方案能覆盖的场景,比预想中广得多。
2. 为什么“写代码画帧”反而比“直接生成像素”更可靠
2.1 直接生成视频的四个老毛病
传统文生视频模型的痛点,做过的人应该深有体会:
| 痛点 | 表现 | 后果 |
|---|---|---|
| 时间一致性差 | 同一物体在前后两帧里长相漂移 | 人物五官忽大忽小,细节不断演化 |
| 分辨率受限 | 高分辨率生成难度暴涨 | 要么糊,要么需要大量后期放大 |
| 不可精细控制 | 只能整段生成 | 局部改一个元素基本要靠重来 |
| 语义理解失真 | 文字、数字、标志性符号经常写错 | 一句话里蹦出乱码,专业场景直接报废 |
这些问题源于“直接预测像素”这个路线本身的物理限制。模型要在高维像素空间里同时保证空间细节和时间连续性,难度极大,而且越长的视频信息冗余越高。
2.2 代码生成视频的三层优势
代码生成绕开了像素预测,等于把连续性交给渲染引擎去保证。优势可以拆成三层:
第一,时间一致性天然成立。每帧画面不是独立预测出来的,而是同一段代码、同一套变量在连续时间轴上的输出。物体不会凭空消失,人物不会莫名变脸,因为“长相”是被代码固定住的。
第二,可控性极高。代码里的任何数字都是一个参数。粒子数量、运动速度、颜色渐变、旋转角度,统统可以手动调整。模型不需要重新跑一遍,你改一个变量,保存刷新,新的动画就出来了。
第三,可实现超分辨率导出。因为你的动画是“画”出来的,屏幕上显示多大只是视口大小。要导出 4K,只要把 Canvas 的宽高设成 3840x2160,渲染引擎会重新绘制一遍,清晰度不会打折。
我打个比方:直接生成视频相当于让一个画家盲画连环画,每一格的线条都可能是重新发明的;而代码生成的动画,相当于画家写好了一套绘图规则,机器人严格按照规则执行,每一格都是规则的投影。后者当然更稳。
2.3 它做不到的事
也不要把它吹上天。代码生成视频有它明确的边界。
复杂物理模拟基本做不了。比如流体飞溅、布料折叠、爆炸碎片的无序碰撞,这些需要大量物理运算,单靠模型写一段 Canvas 代码很难逼近真实。你让它生成一个“杯子从桌上摔落碎成几片”的动画,它能做,但那是预排轨迹,不是真实物理模拟,质感会很假。
高度写实的人物与场景也不适合。真实人脸的表情变化、肌肉运动,背后需要的是海量采样数据,不是几段绘图代码能表达的。用代码画一个卡通图标或科技感粒子很方便,但想画一个“真实感演员”,这条路走不通。
另外,模型写代码也会有“幻觉”。它可能引用了一个并不存在的 API,或者把三角函数参数写反,导致动画整体摆动。所以它给出的代码不能无脑信任,你得跑起来看效果,然后按我们后面聊的排查方法处理。
3. 逐帧绘制背后的技术细节:Canvas、时间轴与粒子系统
3.1 Canvas 2D:每帧重绘的最小单元
Opus 5.5 最常选择的绘制载体是 Canvas 2D。它足够底层,可以逐像素、逐图元控制,同时又足够简单,不需要引入 WebGL 那种复杂的着色器知识。
一个 Canvas 动画的基本结构是固定的:
const canvas = document.getElementById('c'); const ctx = canvas.getContext('2d'); function drawFrame() { ctx.clearRect(0, 0, canvas.width, canvas.height); // 清空画布 drawParticles(); // 绘制当前帧的所有元素 requestAnimationFrame(drawFrame); // 注册下一帧 }记住“每帧清空 + 每帧重绘”的模式,这是 Canvas 动画的基础。如果不清空,上一帧的图像会残留在画布上,产生拖影,我们会在后面的坑里讲这个。
基本原理听起来简单,但模型能把这个循环和视觉创意结合起来,才是真正神奇的地方。我见过它写出的开场动画,粒子先聚合出一个文字轮廓,然后粒子四散,文字逐渐浮现。这种效果需要“把文字先渲染到离屏 Canvas,再分析像素位置,生成粒子阵列”,代码逻辑并不短,但它能够一口气组织出来。
3.2 requestAnimationFrame:动画的时间轴引擎
requestAnimationFrame 是浏览器提供的一个专门用于动画的 API。它告诉浏览器:下一帧刷新之前,请先执行我给你的这个回调。
好处有两点:
- 帧率自适应。屏幕是 60Hz 就每秒执行 60 次,是 120Hz 就执行 120 次,动画在高低刷新率屏幕上都能保持流畅;
- 节能。页面在后台不可见时,浏览器会自动暂停回调,不白白占用性能。
动画里经常会用到时间参数 t,通常以毫秒为单位:
let startTime = null; function drawFrame(timestamp) { if (!startTime) startTime = timestamp; const elapsed = (timestamp - startTime) / 1000; // 换算成秒 updatePositions(elapsed); // 根据时间更新所有元素位置 render(); // 重绘画面 requestAnimationFrame(drawFrame); } requestAnimationFrame(drawFrame);这里有一个很多新手会犯的错:用 Date.now() 而不是用回调参数里的 timestamp。Date.now() 是系统时间,不受帧回调控制,两者可能产生偏差,尤其在浏览器标签页切换后,会导致动画跳帧或错位。模型偶尔也会犯这个错,我们实操时遇到后改掉就好。
3.3 模型为什么能“写对”这些动画代码
你可能会好奇:一个语言模型,凭什么能把粒子系统写得像模像样?
因为模型在训练时见过大量类似代码。粒子系统、正弦波运动、透明度渐变、Canvas 文字渲染,这些都是前端开源项目里极其常见的模式。模型以 token 概率预测的方式把这些模式编码进了参数里,当你要求“动态标题、粒子效果、循环播放”时,它优先检索出的就是这些高频的代码片段组合。
所以它并不真的“懂”物理,它是用训练数据的先验来逼近正确答案。这意味着两件事:
第一,你给的提示词越是贴近常见需求(例如“粒子聚集成文字后散开”),它越容易写出能跑的代码;越是冷门小众的物理效果,它越容易翻车。
第二,它生成的代码往往有冗余,可读性也一般。比如同一个绘制函数可能被重复定义两次,或者有没用的变量。功能能跑,但工程上需要整理。
还有一个更隐蔽的问题:模型写代码时,是在“自回归地预测下一个 token”,它没有编译器的能力。一个括号没闭合,一个变量拼写不一致,就可能导致整段脚本报错。这时候你不能跟它讲道理,直接把报错信息贴回给它,让它自己修,通常一两轮就能解决。
3.4 从代码到像素的“谁在画画”总结
这个技术栈里,双方的分工很明确:
- 模型负责:创意构思、代码语法、逻辑结构、参数组织;
- 浏览器负责:实际绘制、动画时序、图层合成、性能调度;
- 人的工作:审查代码、调参数、改样式、最终导出。
搞清楚了分工,你就能理解为什么这套方案如此高效。它把最不可控的部分(创意生成)交给大模型,把最需要精度的部分(像素绘制)交给浏览器引擎,两边各司其职。
4. 实操复盘:让模型写一个带粒子效果的动态标题动画
4.1 提示词设计:越像需求文档,成品越稳
在实测中我发现,给 Opus 5.5 写动画类的提示词,最好像是写一条需求文档而不是随口一句“做个好看的动画”。它需要知道画布多大、背景什么颜色、文字内容是什么、粒子行为是什么、循环逻辑怎么处理、性能有什么约束。
我常用的模板是这样的:
请用 HTML + CSS + Canvas 实现一个 16:9 的动态标题动画。 需求: 1. 画布尺寸 1280x720,背景为深蓝色渐变; 2. 标题文字内容为“代码生成的视频”,白色,粗体,居中; 3. 背景需要 300 个缓慢飘散的粒子,粒子颜色为淡蓝到青色渐变,透明度 0.4; 4. 文字出现方式为:粒子从四方向中心聚合成文字轮廓,聚拢完成后文字逐渐显现; 5. 整个动画循环播放,循环周期 8 秒,无跳变; 6. 请使用 requestAnimationFrame 驱动动画,保证 60fps 下流畅; 7. 提供完整可运行的单个 HTML 文件,含所有内联样式与脚本。把这个模板丢给模型,它生成的东西基本能跑。不要小看第 5 条,明确要求“循环无跳变”能让模型自觉设计一个闭环时间轴,而不是播完就结束。
4.2 完整可运行代码示例
为了让你能直接对照,我放一个简化但完整的版本。这个示例实现的是“粒子从四周汇聚成文字,然后散开,再汇聚”的循环动画:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>粒子聚合标题动画</title> <style> body { margin: 0; background: #0a0e27; overflow: hidden; } canvas { display: block; } </style> </head> <body> <canvas id="stage"></canvas> <script> const canvas = document.getElementById('stage'); const ctx = canvas.getContext('2d'); const W = canvas.width = 1280; const H = canvas.height = 720; ctx.font = 'bold 96px "Microsoft YaHei", sans-serif'; const text = '代码生成的视频'; const tw = ctx.measureText(text).width; const tl = (W - tw) / 2; const tt = (H - 96) / 2; const off = document.createElement('canvas'); off.width = W; off.height = H; const octx = off.getContext('2d'); octx.font = ctx.font; octx.fillStyle = '#ffffff'; octx.textAlign = 'center'; octx.textBaseline = 'middle'; octx.fillText(text, W / 2, H / 2); const imageData = octx.getImageData(0, 0, W, H); const samplePoints = []; const gap = 6; for (let x = 0; x < W; x += gap) { for (let y = 0; y < H; y += gap) { const idx = (y * W + x) * 4 + 3; if (imageData.data[idx] > 128) { samplePoints.push({ tx: x, ty: y }); } } } const particles = samplePoints.map(p => { const angle = Math.random() * Math.PI * 2; const dist = Math.random() * 600 + 300; return { tx: p.tx, ty: p.ty, x: p.tx + Math.cos(angle) * dist, y: p.ty + Math.sin(angle) * dist, speed: 0.02 + Math.random() * 0.02 }; }); const duration = 8000; let lastTime = null; function frame(timestamp) { if (lastTime === null) lastTime = timestamp; const progress = (timestamp - lastTime) % duration; const t = progress / duration; // 前 40% 时间聚拢,中间 30% 保持,后 30% 散开 let k = 0; if (t < 0.4) { k = t / 0.4; } else if (t < 0.7) { k = 1; } else { k = 1 - (t - 0.7) / 0.3; } k = Math.max(0, Math.min(1, k)); const ease = 1 - Math.pow(1 - k, 3); ctx.clearRect(0, 0, W, H); const grad = ctx.createLinearGradient(0, 0, W, H); grad.addColorStop(0, '#0b1035'); grad.addColorStop(1, '#0f2a5a'); ctx.fillStyle = grad; ctx.fillRect(0, 0, W, H); for (const p of particles) { p.x += (p.tx - p.x) * p.speed * ease; p.y += (p.ty - p.y) * p.speed * ease; const alpha = Math.sin(t * Math.PI) * 0.5; ctx.fillStyle = `rgba(140, 220, 255, ${Math.max(0.15, alpha)})`; ctx.fillRect(p.x, p.y, 3, 3); } requestAnimationFrame(frame); } requestAnimationFrame(frame); </script> </body> </html>注意几个实现要点:
- 离屏 Canvas(变量 off)用来获取文字轮廓的像素位置,这是“粒子聚合成文字”的核心;
- gap 变量控制采样密度,数值越大粒子越少越稀疏,数值越小越密集但越费性能;
- 循环设计用 progress = (timestamp - lastTime) % duration,让时间轴在 8 秒内循环,避免动画播完就停。
这个代码基本上是模型最容易生成、也最值得模仿的经典结构。你拿到手后,建议把粒子数、gap、ease 函数分别改一改,观察画面变化,很快就能建立手感。
4.3 把画布导出成视频的两种方式
动画在浏览器里跑得再好,你最后往往还是需要视频文件。导出方式我推荐两种。
方式一,MediaRecorder 录制 Canvas 流。在脚本里加上这段,点击页面开始录制:
const stream = canvas.captureStream(60); const recorder = new MediaRecorder(stream, { mimeType: 'video/webm;codecs=vp9', videoBitsPerSecond: 10_000_000 }); const chunks = []; recorder.ondataavailable = e => { if (e.data.size > 0) chunks.push(e.data); }; recorder.onstop = () => { const blob = new Blob(chunks, { type: 'video/webm' }); const a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = 'animation.webm'; a.click(); }; recorder.start(); // 录制 8 秒后停止 setTimeout(() => recorder.stop(), 8000);得到的 webm 文件可以直接进剪映或 PR 再用,如果工具不识别 webm,先用格式工厂转成 mp4。
方式二,OBS 窗口录制。适合你不想改代码的情况,直接开 OBS,把浏览器窗口或画布区域作为采集源,指定帧率录制。这种方式的优点是灵活,想录多久录多久;缺点是编码质量不如 MediaRecorder 直接录制 Canvas 流,清晰度会受窗口大小影响。
4.4 运行过程中踩过的三个坑
我实际测试后,最典型的坑有三个,几乎每次换需求迭代都会遇到:
第一个坑是“拖影残影”。如果你忘了 clearRect,粒子移动的时候会留下连续的尾迹。这东西有时候反而是特效,但更多时候是视觉瑕疵。排查方法很简单:看每一帧开头有没有清空画布。如果你想保留尾迹,也可以故意不清空,只叠加一层半透明黑色,还能做出光线拖尾效果,算是一个进阶玩法。
第二个坑是“文字采样点太多导致卡顿”。gap 设成 4 的时候,1280x720 的画布采样出来可能有上万个点,粒子一多,绘制压力会明显上升。解决办法是先从大 gap 起步(比如 8 或 10),跑流畅了再往下降,而不是一上来就追求最密集的粒子。
第三个坑是“模型写的代码偶尔引用未定义的变量”。比如它可能先用了 particle 数组,但变量叫 particles,拼写不一致。这种情况把浏览器控制台的报错信息原样复制给模型,让它修复,非常高效,不要自己逐行去读它那几百行代码。
5. 工程化使用建议:把“一次性视频”变成“可维护动画资产”
5.1 适合用代码生成动画的场景
适用场景本质上有共同点:以图形、文字、几何变化为主,不需要真实物理和真实人脸。
- 动态社媒海报:封面标题、渐变背景、粒子点缀,浏览器渲染完录屏导出即可;
- 产品发布开场动画:Logo 动态展示、slogan 浮现、几何元素穿梭;
- 数据可视化动态图表:柱状图增长、折线图轨迹、地图散点扩散,代码生成比传统视频方案灵活得多;
- 网页内嵌动画:这类场景最适合,甚至不需要导出视频,直接让动画跑在网页里,跟页面交互结合;
- 教学演示动画:几何题的辅助线、函数曲线的动态生成,模型能准确写出来。
这些场景的共同特征是:画面里的元素是可枚举的、有确定数学关系的。几何、文字、粒子、渐变色、路径动画,这些都是渲染引擎的强项,也是代码生成模型最擅长的输出。
5.2 不适合的场景
不适合的场景,一句话概括:凡是需要“真实世界质感”的,都不适合。
真实人物出镜、真实产品实拍、复杂流体模拟、微表情表演,这些内容交给代码生成动画会很廉价。你说“让模型生成一段逼真的咖啡倒入杯子的动画”,它也能跑,但最终效果更像是“示意图”而不是“广告片”。判断标准很简单:这个画面能不能用几何图形和参数描述清楚?能,就适合;不能,就不适合。
另外,商业交付时的版权问题也要注意。用模型生成的代码做动画,代码本身的授权比较宽松,但如果你调用了特殊字体、特殊素材,要检查字体授权和素材来源。这点常规文档很少提到,但实际落地时很关键。
5.3 性能优化清单
代码动画跑在浏览器里,性能好坏直接决定体验。我整理了一份自己的优化清单:
- 控制粒子数量。粒子在 300 到 800 之间通常流畅,超过 2000 就要考虑 WebGL 了;
- 避免每帧创建新对象。比如循环里不要每一帧都 new 数组、new 对象,尽量复用;
- 使用 transform 代替 left/top。如果用的是 DOM 动画,transform 由 GPU 合成,比改布局属性快得多;
- 离屏 Canvas 缓存静态内容。背景渐变、固定的文字轮廓这类不变的元素,先画到离屏 Canvas,每帧直接 drawImage,省掉大量重复绘制;
- 注意 devicePixelRatio。高分屏下 Canvas 会发虚,但也不能简单设大画布,否则性能翻倍。最稳妥的做法是画布宽高乘以 dpr,同时 ctx.scale(dpr, dpr)。
5.4 我目前推荐的工作流
整套方案跑通之后,我的工作流已经成型:
第一步,让模型写第一版动画 HTML。提示词给足需求细节,包含尺寸、内容、风格、循环和性能要求;
第二步,浏览器里跑起来,肉眼检查动画节奏。这一步不要急着录屏,先把参数调顺,因为录屏文件改起来成本高;
第三步,把发现的问题反馈给模型,让它迭代修 bug 或改效果。控制台报错直接贴,想要的效果变化直接用自然语言描述;
第四步,用 MediaRecorder 录制 Canvas 流,得到 webm,再转成目标格式;
第五步,如果需要接入网页,就把 HTML 里的动画逻辑改造成一个可配置的组件,参数抽出来,方便其他页面复用。
这个流程最大的好处是:每轮迭代几乎零成本,不烧算力,不依赖云端队列,刷新浏览器就是新一轮结果。对高频出素材的团队来说,生产效率提升非常明显。
6. 常见问题与排查技巧实录
6.1 动画卡顿掉帧
优先检查粒子数量和 Canvas 尺寸。粒子一旦超过 1500 个,加上高分屏放大因素,容易直接掉帧。把 gap 调大、粒子数减少,再观察是否改善。同时注意页面上别同时跑一堆其他脚本,浏览器后台标签页也会抢资源。
6.2 录制出来是黑屏
MediaRecorder 录 Canvas 流黑屏,最常见的原因是 Canvas 没有使用 willReadFrequently 之类标志,但那个概率很低。更常见的情况是:录制时 Canvas 的 captureStream 在某些浏览器里不能同时被屏幕视窗显示和录制流消费。建议用最新版 Chrome 录制,同时确认页面没有把 Canvas 隐藏。如果还不行,切回 OBS 录屏,绕开兼容问题。
6.3 循环播放突然跳变
循环跳变的根因,是动画状态没归位。我用 (timestamp - lastTime) % duration 的方式,目的是保证时间轴始终在 0 到 duration 之间循环。但如果你把 lastTime 在每个回调里都更新成当前时间,取模之后进度仍然正确;就怕模型写成累加时间差后再重置,重置瞬间画面会跳。排查时直接看代码里有没有对进度做取模,没有就是根源。
6.4 高清屏文字发虚
Canvas 在高 DPI 屏幕上发虚,几乎都因为忘了 devicePixelRatio。在创建 Canvas 时,先把宽高属性乘以 dpr,再用 ctx.scale(dpr, dpr) 处理逻辑坐标。注意离屏 Canvas 也要同样处理,否则采样出来的文字轮廓位置会与实际绘制坐标错位。
6.5 模型偷懒导致动画简化
有些提示词下,模型会生成一个只移动不变化的静态渐变背景,标题几乎不参与动画。这种“偷懒”本质上是因为它判断你的需求不够明确。解决办法是提升需求细节:明确写“标题文字需要从粒子聚合中浮现”“文字在 0.4 秒后开始显示透明度变化”,把时间线和行为都写清楚,它就没有偷懒空间了。
下面是一个速查表,适合直接收藏:
| 现象 | 常见原因 | 快速排查 | 解决方案 |
|---|---|---|---|
| 掉帧卡顿 | 粒子过多 / 画布过大 | 把粒子数降一半测试 | 减少粒子、用离屏 Canvas 缓存 |
| 录制黑屏 | captureStream 兼容问题 | 换 OBS 录制对比 | 升级浏览器或改用录屏 |
| 循环跳变 | 时间轴未取模 | 搜代码中的 % duration | 改为基于时间戳取模 |
| 文字发虚 | 未处理 devicePixelRatio | 检查 canvas.width 是否乘以 dpr | 画布尺寸乘以 dpr + ctx.scale |
| 动画似有似无 | 提示词需求不明确 | 看模型是否跳过关键行为 | 补充时间线、元素行为的描述 |
| 控制台报错 | 变量未定义/括号缺失 | 复制报错信息追问模型 | 让模型自行修复 |
我最后再分享一个个人经验:我在反复测试这类生成方式之后,最大的体会是“把预期从视频生成切换成代码生成,整个工作流都变了”。当动画变成一个可改参数的网页程序,你可以在浏览器控制台里实时调速度,可以刷新看新效果,可以一个源文件复制十个副本套不同配色,然后一次性全部录屏导出。这种灵活度,是传统视频生成怎么都给不了的。
所以我的建议是:别只把它当“生成视频的工具”来用,试试把它当成“动态视觉方案的快速原型工具”来看待。从一个 HTML 文件开始,到十条风格完全不同又风格统一的动画成片,整个过程可能只需要半天。这个方向,值得你在下一个项目里认真试一次。