用 Opus 5.5 把 CSV 做成动态图表视频:数据校验到 MP4 导出

给 Opus 5.5 一份明确的图表需求,用可下载的 Python 项目把三组 CSV 数据做成 12 秒视频,逐步检查数值、动画、导出结果与常见故障。

奶油色纸面上的齿轮线稿,配有 Opus 5.5 标题和低饱和度几何装饰

用 Opus 5.5 制作图表视频时,先给出校验通过的数据和固定的画面规范,再用 Python 绘制帧、FFmpeg 编码。 原始计数不要随动画改变。屏幕上的柱条逐渐变长,不应被悄悄包装成业务指标随时间增长。

这篇教程只完成一个可以复现的小项目:把 CSV 中的三个类别做成 12 秒、1280 × 720 的 MP4。适合需要把报告转为演示或社交视频、能够运行本地命令的读者。你会依次准备数据、使用完整的 Claude 提示词、预览图表、导出视频,并核对成片中的数值。基础设置和其他视频制作路线见 Opus 5.5 视频教程。

先看参考成片,再下载项目

这是编辑编写的参考项目在本地实际渲染的成片。数值为合成示例,画面标签为英文,并且刻意不带声音。这不是 Ofox 的客户、收入或客服数据。

下载完整项目、MP4 成片和完整提示词。

实测范围:本次通过 Claude Code 调用 Opus 5.5 时,因会话未登录而失败。因此,我们由编辑编写参考实现,测试了 CSV 校验和 Python/FFmpeg 渲染,没有将它称为本次 Opus 输出,也没有声称一次生成成功。你可以通过自己有权使用的 Claude 账号尝试提示词,也可以不调用模型,直接复现随文项目。此前另一篇截图转演示视频教程记录了它自己的成功模型调用,但不能用那次结果证明本次也成功。

先确定图表能表达什么

示例比较的是不同渠道的工单数量,不是时间变化、转化漏斗或增长曲线。这个区别同时决定动画怎么做,以及以后配音时能说什么。

类别数量本例含义
Email120分配给 Email 的合成工单数
Chat180分配给 Chat 的合成工单数
Docs90分配给 Docs 的合成工单数

总计 390 张工单。在这个虚构例子中,Chat 比 Email 多 60 张工单。但这不能说明 Chat 转化更好、更省时间,或用户更满意;数据里既没有分母,也没有这些结果指标。

三个柱条都从零起算,共用 0–200 的固定刻度。最终宽度分别占绘图区的 60%、90% 和 45%。读者应能直接比较柱条,不必先辨认不同刻度。不要为了放大视觉差异而截断坐标轴。

使用真实数据时,在 CSV 旁记录来源、提取日期、统计时区、单位和汇总规则,同时检查类别是否重叠。如果存在重叠,相加后的结果未必是去重总量。把数据放进模型提示词前移除个人信息,只共享你有权使用的数据。

准备可复现的运行环境

压缩包包含 sample.csv、prepare.py、test_prepare.py、render.py、requirements.txt、prompt.txt 和 README。参考实现需要 Python 3.9 或更高版本、Pillow 11.3.0,以及命令路径中可访问、带 H.264 编码器(libx264)的 FFmpeg。文字由本地 TrueType 字体绘制。渲染随文项目不需要浏览器或模型 API。

解压到本地目录,从该目录执行命令。先用 python3 -m venv .venv 创建 Python 虚拟环境;macOS/Linux 用 source .venv/bin/activate 激活,Windows PowerShell 用 .venv\Scripts\Activate.ps1。然后安装依赖并校验:

python3 -m pip install -r requirements.txt
python3 prepare.py
python3 -m unittest test_prepare.py
ffmpeg -version

预期准备结果为 Validated 3 rows. Total: 390。若输出不同,先停下检查。五个测试方法覆盖合法输入、零值和边界值、用引号包裹、含逗号的标签、非法数值和格式错误的行。解析器通过测试,还不等于视频已经渲染成功。

把 CHART_FONT 指向本地有使用许可的 TrueType 字体。例如,macOS 上确实存在以下文件时:

export CHART_FONT='/System/Library/Fonts/Supplemental/Arial.ttf'

Linux 已安装的 DejaVu Sans 可能位于 /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf。Windows PowerShell 可用 $env:CHART_FONT='C:\Windows\Fonts\arial.ttf' 选择已安装的 Arial,并将命令中的 python3 换成自己的 Python 命令,通常是 python。这些只是路径示例,不保证每台机器都有相应字体。压缩包不附带字体。若改成中文标签,选择包含所需中文字形的字体,并核对许可。

若找不到 FFmpeg 命令,使用系统可信的安装方式;FFmpeg 下载页列出了各平台选项。让 Claude 编写或修改代码需要你自己的访问权限,可能消耗套餐额度;运行随文 Python 代码本身不调用模型。本地示例不能用来推导某项付费服务或 API 一定兼容。

让模型看到数据前,先校验 CSV

使用以下原样表头和示例:

label,value
Email,120
Chat,180
Docs,90

解析器使用 Python 的 CSV reader,因此 "Email, shared" 这样的带引号标签仍是一个单元格。它接受带或不带字节顺序标记(BOM)的 UTF-8;会拒绝改名的表头、重复或空白标签、多余单元格、不符合要求的行数、非数字、负数、非整数计数、无穷大和超过图表上限的数值。

这些限制是有意设置的:本项目只处理三个类别的整数计数。缺失的测量结果不能悄悄变成零,小数比率不能四舍五入成数量,240 也不能被截到 200 后仍当作正确柱条展示。

检查其他文件时,运行 python3 prepare.py my-data.csv。只有全部行通过后,辅助脚本才写出 data.json。要渲染自己的数据,先备份示例,再替换 sample.csv,重新校验。渲染器每次都直接读取并校验 sample.csv,不会悄悄改用上次检查生成的 JSON。

校验失败后,旧的 out/chart.mp4 可能仍然存在,不能把旧文件当作本次成功结果交付。渲染器先写临时 MP4,只有 FFmpeg 报告成功后才替换最终文件。交付时保留成功命令的输出和 out/accepted-data.json。

标签最多 24 个字符。渲染器还会按所选字体检查宽度,超过 200 像素就报错,避免标签撞进绘图区。可以使用有解释的缩写,也可以明确重新设计标签列。字符数合格不代表排版一定合适,字形是否齐全仍需目视检查。

给 Opus 一份完整、有边界的动画需求

附上校验后的数据行,或将它们与下面规范一起粘贴。可下载的完整提示词还包含参考布局的位置、校验规则和字体要求。若你已下载项目,下面这份较短的需求适合用于修改:

Edit this existing Python/Pillow and FFmpeg project to make a 12-second chart video.
Read sample.csv with the existing prepare.py parse() validator.
It contains exactly three rows: Email 120, Chat 180, Docs 90.
These are synthetic ticket counts, not real company results.

Keep output at 1280x720, 30fps and 360 RGB frames.
Keep a zero baseline and a shared, fixed maximum of 200.
Keep the exact numeric labels visible and unchanged at every frame.
Reveal bar widths only between frames 30 and 90; hold thereafter.
Use progress=max(0,min(1,(frame-30)/60)) for the reveal.
Do not use random values, network data or new packages.

Keep a permanent label: Synthetic example · tickets · fixed scale 0–200.
State that the reveal is not growth over time.
Preserve CSV validation and do not substitute zero for missing values.
If a value exceeds the maximum, stop and explain; do not clip it.
Return the changed file, explain changes, and give the render command.
Do not invent a test result. List tests that still need to be run.

这里保留英文提示词,以便与下载项目中的英文画面文案一致。核心要求是保留数值和固定刻度、只做柱条入场动画,并如实列出尚未执行的测试。

运行模型返回的代码前,先审查答案,核对依赖变更和文件操作是否符合需求。安装软件、上传数据或覆盖文件都属于独立操作,并非生成的指令里出现了就必须执行。这个小图表用现有依赖已经足够。

想讲不同的故事,就先改需求。“做得更有冲击力”只让模型知道可以增加运动,却没告诉它哪些事实不能变。更明确的说法是:“所有数值和刻度保持不变,用两秒开场,然后让完成后的图表至少停留六秒。”

理解时间轴,核对固定刻度

30 帧每秒、共 360 帧,对应 12 秒。参考实现的柱条区域在第一秒保持空白,接下来的两秒展开柱条,余下九秒保持完整图表,供读者看清。

帧时间预期画面
0–290 秒至不足 1 秒标题、标签、准确数值和坐标轴可见;柱条宽度为零
30–891 秒至不足 3 秒柱条逐渐展开;数值标签保持不变
90–3593 秒至不足 12 秒所有柱条保持最终长度

核心计算很短:

progress = max(0, min(1, (frame - 30) / 60))
width = round(value / 200 * 820 * progress)

绘图区宽 820 像素。最终 Email 宽 492 像素,Chat 宽 738 像素,Docs 宽 369 像素。第 60 帧的展开进度为一半,宽度会受像素取整影响,但标签仍显示原始数据。它表示入场过程,不是一次中间测量。

上下限把进度限制在零到一之间。不做限制,线性计算可能在动画开始前产生负宽度,或结束后产生超长柱条。数据图表里的回弹或超调动画,可能让人误以为数值曾高于实际测量值,因此参考实现刻意不用这种效果。

导出 MP4,并检查实际文件

校验成功、设置好 CHART_FONT 后,执行:

python3 render.py

脚本用 Pillow 绘制 360 张 RGB 帧,经管道传给 FFmpeg。调用使用参数列表,不会把 CSV 内容拼成 shell 命令。编码设置为 libx264、yuv420p、无音频和 +faststart。FFmpeg 文档说明输入输出与编码选项;Pillow 绘图参考说明画帧所用的基础绘图功能。

预期产物是 out/chart.mp4,另有四张复核帧和一份通过校验的数据副本。请在最终使用视频的应用中试播。进程成功退出,不足以证明文字可读或图表表达准确。

若已安装 FFmpeg 工具,可独立检查输出:

ffprobe -v error -select_streams v:0 \
  -show_entries stream=codec_name,width,height,r_frame_rate,nb_frames \
  -show_entries format=duration -of json out/chart.mp4

未修改的示例应为 H.264、1280 × 720、帧率 30/1、时长 12 秒。并非所有封装都会提供帧数元数据,字段缺失不能理解为零帧。播放开头、展开阶段和最终停留阶段,确认三个数值仍为 120、180、90,刻度仍标注 0–200。本例按设计不含音轨。

排除故障,不改变数据含义

现象先检查什么合适的修复方式
prepare.py 报数值非法缺失单元格、小数比率、用逗号作千位分隔符修正数据格式,不把缺失值默默转成零
某个数值超过 200是否确为计数,单位是否错误同步修改校验、柱宽计算、刻度和图注中的统一上限
新 CSV 的数字没有出现是否替换了工作目录的 sample.csv,渲染是否成功校验该文件,重新渲染,检查新写入的 MP4 和 out/accepted-data.json
渲染器拒绝过宽标签所选字体和目标语言下的标签宽度使用有说明的缩写,或重做标签列并复核绘图区
找不到 ffmpeg 或 libx264命令路径及已安装版本的编码器支持从可信来源安装合适的 FFmpeg 版本,重跑版本检查
MP4 没声音项目是否包含音频本例本来就无声;需要配音时,参考下方关联教程另行加入
柱条一直变长进度限制,或模型加入的其他动画恢复按帧计算、限制在零到一的进度公式

数据更多时,需要重新设计,而不是只把数组拉长。十个类别可能需要更高的画布、分组或多个场景。负数需要能表达正负方向的坐标轴,百分比需要明确分母和格式规则。本例三个计数的验证不能覆盖这些修改。

把数据与视频一起交付

交付包应包含通过校验的 CSV、源码项目、最终 MP4,以及简短说明:数据来源、单位、刻度、导出设置,以及数据是真实还是合成。分享本示例时保留合成数据的可见标注,不要换上公司标志,让观众误以为是实际业务结果。

需要旁白时,阅读配音与字幕同步教程。那篇使用另一个 Remotion 项目,命令不能直接套进本 Python 项目。需要竖屏交付时,阅读横屏转竖屏布局教程;只改尺寸、不重排标签,会让本图表难以阅读。如果下一个视频需要展示产品而不是数据,可以从真实截图演示项目开始。

模型适合协助编写和修改动画。要让最终解释可信,仍要依靠校验通过的 CSV、明确的刻度,以及对实际成片的检查。

常见问题

Opus 5.5 会直接生成 MP4 吗?
在这套流程中,Claude 协助编写或修改代码,Python 绘制画面,FFmpeg 编码视频。可下载的参考项目由编辑编写并完成本地测试,不作为本次 Opus 生成的结果展示。
可以换成自己的 CSV 数据吗?
可以,但要先核对数据约束。示例只接受三个不重复的标签,以及 0 到 200 之间的整数计数。使用更多行或更大数值前,必须明确修改布局和刻度。
为什么柱条变长,旁边的数字却不变?
数字始终显示实际计数。柱条动画只是入场效果,不代表时间序列,也不能证明业务增长。