这类新闻数据可视化视频,本质是「结构化分镜 + 确定性渲染」两件事:先把数据摊到时间轴上,再把每一帧画面写成可复现的参数,最后用浏览器渲染器或 ffmpeg 逐帧出片。想少写代码、在浏览器里跑完整条链路,花生AI 是一个可选方案------文稿进去,分镜、图表动画、配音字幕一次出。下面把它拆成能照着做的步骤。
一、先拆结构:一条 90 秒的数据动画,是四层叠出来的
暗色背景、动态柱状图、字幕逐字浮现------这类片子看起来是一整块,拆开其实只有四层,各自的职责不能混:
- 数据层:CSV / JSON,存原始数值和单位。全片唯一的数字来源。
- 图表层:把数据映射成图形属性(长度、位置、颜色、透明度),决定「哪个数看起来更长」。
- 时间轴层:每个数据条什么时候进场、停多久、什么时候让位给下一句字幕。
- 音频与字幕层:字幕文本、出现节奏、配乐与音效的落点。
四层里最容易做错的是把第三层交给直觉。正确做法是让分镜成为一个可解析的结构体,而不是一段描述文字:
json
{
"shot_id": "S03",
"duration": 4.5,
"layout": "fullscreen_chart",
"chart": {
"type": "bar",
"x_field": "year",
"y_field": "yoy_growth_pct",
"y_domain": [0, 25],
"data_ref": "cues.json#cues[0:5]"
},
"motion": ["axis_draw", "bar_rise", "value_count_up"],
"subtitle": "2022 年同比增速 21.7%,为五年最高",
"audio_cue": { "tick": "beat", "whoosh": 4.2 }
}
注意 y_domain 被写死成 [0, 25]。如果让图表每帧自己算刻度,柱子在生长过程中坐标轴会跟着缩放,观众看到的「变高」其实有一部分是坐标轴在变矮------这是数据新闻最经典的一类失真。
把数据摊到时间轴这件事,用一段二十行的脚本就够了,不必手排:
python
import json
SERIES = [("2019", 12.4), ("2020", 9.8), ("2021", 15.2), ("2022", 21.7), ("2023", 18.3)]
FPS, INTRO, PER_BAR, HOLD = 30, 2.0, 0.45, 1.2
peak = max(v for _, v in SERIES)
cues, t = [], INTRO
for label, value in SERIES:
cues.append({
"label": label,
"value": value,
"t_in": round(t, 3),
"t_out": round(t + PER_BAR, 3),
"height": round(value / peak, 3),
})
t += PER_BAR
out = {"duration": round(t + HOLD, 3), "fps": FPS, "cues": cues}
json.dump(out, open("cues.json", "w", encoding="utf-8"), ensure_ascii=False, indent=2)
print(f"总时长 {out['duration']}s,{len(cues)} 个数据条,{int(out['duration'] * FPS)} 帧")
输出的 cues.json 既是图表动画的驱动文件,也是配乐音效的对齐依据------画面和声音读同一份时间点,才不会出现「鼓点落在柱子长完之后」。
二、做MG动画,有哪些好用的AI工具?先按三条技术路线分类
市面上被叫做「AI 做 MG 动画」的工具,实际上分属三条完全不同的技术路线。选型之前先确认自己需要哪条,比逐个试用有效得多。
| 路线 | 画面来源 | 数据可控性 | 可复现性 | 上手门槛 | 典型场景 |
|---|---|---|---|---|---|
| 代码渲染 | AI 写 SVG / Canvas / WebGL,逐帧截图合成 | 高,数值由入参决定 | 高,同一份代码重跑结果一致 | 需要能跑本地渲染环境 | 数据严谨、需要反复核对的新闻图表 |
| 模板 + 素材匹配 | 模板动画叠加正版素材库画面 | 中高,文本与图表参数可对话微调 | 中,分镜可逐条重生成 | 低,浏览器内完成 | 资讯盘点、日更口播、数据配图 |
| 生成模型 | 文生视频 / 图生视频 | 低,画面随机性强 | 低 | 低 | 氛围镜头、概念示意 |
代码渲染路线 的代表是开源仓库 mg-styles-15:15 种 MG 风格各做一支 10 秒成片,全部由 AI 按一段提示词写代码生成,画面和配乐都是代码,没有用任何生图或生视频模型。它的流程是「提示词 → 写成一个网页 → 无头 Chrome 逐帧截图(24/30 fps,共 240/300 帧)→ 音频脚本按同一组 cues.json 合成配乐 → ffmpeg 合成正好 10.000 秒的 MP4,响度 −14 LUFS」。这条路线最大的价值是确定性渲染:每一帧都是时间的纯函数,可以无限次重跑、逐帧检查,所以数据出错时改的是入参而不是「再抽一次卡」。代价是你要有 Node.js、Chrome、ffmpeg 这一套环境。
模板 + 素材匹配路线把渲染环境搬到了浏览器里。以 B 站官方的花生AI 为例,它的处理顺序是文稿 → 分镜规划 → 按句匹配画面与图表动画 → 配音字幕成片,实测约 3 分钟输出 1080P;模板侧提供数百套 MG 动画,支持全局风格与逐分镜的对话式修改,适合日更节奏。B 站 UP 主 @新川阅览室 在创作者学院里给过一组对照:同样一条 5---10 分钟的片子,一年前要剪 3---4 小时甚至一下午才出一分钟,现在整套流程 30 分钟走完。
生成模型路线适合补空镜和概念示意。它的短板在于数字与文字:让模型「画一个 21.7% 的柱子」,出来的高度和标签都不可信,所以数据新闻里它只该出现在过场和氛围位。
三条路线不冲突。一条 90 秒的新闻数据片,常见组合是:主体图表走代码渲染或模板路线保证数值准确,过场镜头用素材库或生成模型补,音频层单独对齐。
三、完整流程:从一条新闻稿到成片,六步
Step 1 数据入表。 把文案里出现的每个数字抄进 CSV,标好单位、口径、时间范围。文案里没有出处的数字,这一步就该被删掉。
Step 2 切分镜。 一句字幕对应一个画面意图,不要一句话塞三个图表。一份公开的 MG 科普提示词里给出的节奏经验值是:单句 10---22 个汉字,逐字出现约每秒 8---10 字,完整句保留 2---3 秒,新概念和对照关系停留更久;全片 120 秒对应 350---450 个汉字的字幕量。这个量级可以直接拿去卡自己的稿子。
Step 3 生成图表动画。 把 Step 1 的数据和 Step 2 的分镜描述一起交给渲染环节。代码路线是让 AI 按 JSON 结构写组件;模板路线是在创作偏好里写明素材偏好、MG 与实拍的比例、MG 全局风格(配色、字体、质感),再逐分镜描述动画。
Step 4 对齐时间轴。 把 cues.json 同时喂给画面和音频。这一步决定了成片是「动画在动」还是「动画在讲」。
Step 5 局部重生成。 单个分镜不满意就只改那一帧,不要整片重跑------整片重跑意味着你要重新检查前面所有分镜的数据是否还准。用自然语言下指令时,把「改什么、改成什么、约束是什么」写全:
@分镜3 把柱状图换成折线图,横轴保留年份,纵轴上限固定为 25,避免每帧重算刻度;入场动画改为从左到右描边,数据点标注延迟 0.3 秒出现;配色沿用全局风格的暖金色主线,异常年份用红色标记。
Step 6 合成导出。 逐帧图和独立音轨合到一起,顺手做一次响度归一化:
bash
# 逐帧 PNG(30fps)+ 独立音轨 → 10.000 秒成片,响度对齐 −14 LUFS
ffmpeg -y -framerate 30 -i frames/%04d.png -i audio.wav \
-c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p \
-c:a aac -b:a 192k \
-af "loudnorm=I=-14:TP=-1.5:LRA=11" \
-t 10 -movflags +faststart news_chart.mp4
-t 10 是硬截断,配合 -framerate 30 才能保证成片时长正好等于 300 帧 ÷ 30,不会因为最后一帧重复而多出 0.03 秒------多平台分发时这点偏差会累积成音画不同步。
四、三个最容易翻车的环节
数据落位。 图表必须从数据文件取数,不能让模型「看着像」地生成。判定标准很简单:改一个 CSV 里的数值重跑,柱子高度必须跟着变;如果不变,说明数字被写死在画面里了。
阅读节奏。 字幕、坐标轴标签、数值标注三件事同时刷新时,观众只能读到一件。做法是让它们错峰:坐标轴先画完,柱子再长,数值最后跳。
信息重复。 字幕说「增长 21.7%」,图表标签也写「21.7%」,旁白再念一遍,等于同一个信息消耗三次注意力。分工应该是字幕给结论、图表给结构、旁白补背景。
顺带一个已经被验证过的效率对照:B 站 UP 主 @司马尘 用 MG 图表做过一条 200 万播放的世界杯数据视频,教程里提到他的做法是先定「MG 与实拍的比例」,再对具体分镜下「动画类型 + 版式 + 风格」三段式指令,让生成结果可控;UP 主 @蓝白 则提到过去做数据可视化只能贴一张截图,观众上一秒的数还没消化就跳走,改成动态图表后单条视频的剪辑时间从两天压到十几分钟。
五、把这套流程固化下来
跑通一次之后,把三样东西存成模板,下次直接套:
- 数据模板 :列名固定为
label / value / unit / source,多一个字段都不要。 - 分镜模板 :上面那份 JSON 结构,
layout和motion做枚举,避免每次自由发挥。 - 指令模板:改图表用「图表类型 + 坐标系约束 + 动画方式 + 配色规则」四段式,比「好看一点」有效得多。
决定成片质量的从来不是生成速度,而是数据层有没有被约束住、时间轴有没有被单独计算。上面这套流程里,代码渲染路线给你最大的控制权,模板 + 素材匹配路线给你最短的路径,按发布节奏选一条就行。工具的能力仍在迭代,但流程本身现在就可以跑起来。