用 Opus 5.5 把 CSV 做成动态图表视频:数据校验到 MP4 导出
给 Opus 5.5 一份明确的图表需求,用可下载的 Python 项目把三组 CSV 数据做成 12 秒视频,逐步检查数值、动画、导出结果与常见故障。
用 Opus 5.5 制作图表视频时,先给出校验通过的数据和固定的画面规范,再用 Python 绘制帧、FFmpeg 编码。 原始计数不要随动画改变。屏幕上的柱条逐渐变长,不应被悄悄包装成业务指标随时间增长。
这篇教程只完成一个可以复现的小项目:把 CSV 中的三个类别做成 12 秒、1280 × 720 的 MP4。适合需要把报告转为演示或社交视频、能够运行本地命令的读者。你会依次准备数据、使用完整的 Claude 提示词、预览图表、导出视频,并核对成片中的数值。基础设置和其他视频制作路线见 Opus 5.5 视频教程。
先看参考成片,再下载项目
这是编辑编写的参考项目在本地实际渲染的成片。数值为合成示例,画面标签为英文,并且刻意不带声音。这不是 Ofox 的客户、收入或客服数据。
实测范围:本次通过 Claude Code 调用 Opus 5.5 时,因会话未登录而失败。因此,我们由编辑编写参考实现,测试了 CSV 校验和 Python/FFmpeg 渲染,没有将它称为本次 Opus 输出,也没有声称一次生成成功。你可以通过自己有权使用的 Claude 账号尝试提示词,也可以不调用模型,直接复现随文项目。此前另一篇截图转演示视频教程记录了它自己的成功模型调用,但不能用那次结果证明本次也成功。
先确定图表能表达什么
示例比较的是不同渠道的工单数量,不是时间变化、转化漏斗或增长曲线。这个区别同时决定动画怎么做,以及以后配音时能说什么。
| 类别 | 数量 | 本例含义 |
|---|---|---|
| 120 | 分配给 Email 的合成工单数 | |
| Chat | 180 | 分配给 Chat 的合成工单数 |
| Docs | 90 | 分配给 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–29 | 0 秒至不足 1 秒 | 标题、标签、准确数值和坐标轴可见;柱条宽度为零 |
| 30–89 | 1 秒至不足 3 秒 | 柱条逐渐展开;数值标签保持不变 |
| 90–359 | 3 秒至不足 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 之间的整数计数。使用更多行或更大数值前,必须明确修改布局和刻度。
- 为什么柱条变长,旁边的数字却不变?
- 数字始终显示实际计数。柱条动画只是入场效果,不代表时间序列,也不能证明业务增长。


