rea-video 实测:逐镜拆出视频是实拍、AI 还是代码渲染,我埋了带答案的靶子,也用一行 ffmpeg 伪造了 AIGC 标识

上周刷 GitHub 的时候撞见一个思路很新的项目:rea-video(Apache-2.0,GitHub API 实查 3,032 star,2026-10-29 创建,我写稿这天它还在提交)。它回答一个老问题——「这条视频是怎么做出来的」,但拆到了镜头级:每一镜判断是实拍、AI 生成、3D 渲染、代码模板渲染还是录屏,顺带把字幕时间轴、贴纸、BPM、音效卡点全列出来,最后给一份复刻方案。设计初衷是给 Claude Code、Codex 这类编码 Agent 当技能用,不开多模态模型也能跑——离线取证模式官方在自己的评测集上报了 98% 以上的制作方式准确率(RESULTS.md,注意那是它自己调参的样本集)。

我真正想验证的是另一件事:这些百分比是拿来干什么的?如果我手上有带答案的视频——切点是我自己定的、来源是我自己造的——它的结论能对上多少?它引以为傲的「容器元数据是硬证据」,经不经得起一行命令的伪造?于是我花了一上午,在 M4 / 16GB 的 MacBook 上把这几件事全做了一遍。

先说最反直觉的发现:它的「硬证据」确实很硬,但硬的方向是单向的——一行 ffmpeg 写进去的 AIGC 标识,能把 72 秒的真实实拍整个翻成「93% AI 生成」;可同一个标识贴在代码渲染的视频上,结论纹丝不动。

前两天我刚在这台机器上跑通了本地语音克隆的完整链路,这次轮到视频侧——都是「内容是怎么被生产出来的」这条线上的一环。

装起来:两分钟,两个坑

环境:macOS 26.5.2 / M4 / 16GB,ffmpeg 9.0.2(brew),Python 3.13.12。

Bash
# 环境:macOS + Python ≥ 3.10 + ffmpeg
brew install ffmpeg
git clone https://github.com/JuneYaooo/rea-video && cd rea-video
python3 -m venv venv && ./venv/bin/pip install \
  "rea-video @ git+https://github.com/JuneYaooo/rea-video"
./venv/bin/rea-video --help

依赖只有 numpy、opencv-python-headless、Pillow、PyYAML、onnxruntime 五个,在我这台机器上 pip 一共 51 秒装完。第一次跑 decompose 时它会自动下两个模型:约 67MB 的 UVR 人声分离模型和人脸检测模型,走的是直连,速度还行。

坑有两个,都在安装侧:

坑一:brew 装的 ffmpeg 9.0.2 没有 drawtext 滤镜。我本想用 ffmpeg 画几帧测试画面,报错 No such filter: 'drawtext',这个构建没编进 libfreetype。最后我改用 PIL 逐帧渲染再喂给 ffmpeg 编码,顺手也把切点控制精确到了帧。

坑二:OCR 在 Python 3.13 上装不上。字幕时间轴和花字检测依赖 rapidocr-onnxruntime,而它所有可用版本都声明 Requires-Python <3.13。我的主环境是 3.13,装完会静默降级——日志里只有一行 WARNING,报告里就没有逐句字幕了。解法是给 OCR 单独开一个 3.12 的 venv(我用的 ~/.local/bin/python3.12,1.1 秒建好,加 OCR 依赖共 67 秒装完)。后面你会看到这一步值不值。

实测一:帧级答案卡——切点全对,分类全对

照搬我上个月测安全审计技能时的思路——那次的靶子是埋了 6 个洞的 222 行代码——这次我造了一份「带答案的视频」:用 PIL 逐帧渲染 648 帧、30fps、6 个镜头的扁平卡片动画,切点精确到帧——3.000 / 7.400 / 10.000 / 14.300 / 18.100 秒,真值分类是「代码渲染」。

Bash
# 环境:macOS,rea-video 0.1.0(git 安装版),离线模式(不开 VLM)
./venv/bin/rea-video decompose truth_code.mp4 -o out/truth --no-vlm

结果:6 个镜头全部检出,6 个切点与真值逐帧一致,每一镜的判定都是 code_render,置信度 87%–95%,整体结论「代码/模板渲染 100%」。21.6 秒的视频跑完用了 17.4 秒,全程离线。

切点这种事对剪辑分析工具来说是最基本也最容易露怯的能力——帧率不一致、转场重叠都会让它漂移。0.25 秒交叉溶解这种场景官方评测标了 F1 1.00,我这次没有刻意造溶解帧,只验证了硬切,这点如实说明。

实测二:AI 生成视频——24fps 是个天然灰区

第二个真值来自 AI 视频模型:我用 text-to-video 生成了两段 5 秒素材(一段手持感橘猫嗅白瓷杯,一段厨房里对镜头挥手的年轻女性),原生输出 1344×768、24fps,拼成一条 10 秒视频。真值:两镜全是 AI 生成。

原生 24fps 文件直接测:两段都判 ai_video,但置信度只有 64%–65%。这不是偶然——我翻了它的源码,pipeline.py 里写得明明白白:24fps 源痕迹在 AI 视频、定格动画、电影机拍摄里都会出现,没有 AIGC 标识时这一类素材会被标成「待确认」。AI 视频模型偏爱 24fps 电影感输出,恰好落在这个灰区里。

把两段重编码成 30fps 再测(这也是普通用户剪映一转手就会发生的事):两镜都升到 84% / 73%,中间切点照样精确在 5.000 秒。我又做了一轮压力测试:缩到 640×360、CRF 34 重压一遍——分类依然全对,置信度掉到 70% / 61%。结论:画质劣化会削弱置信度,但没把结论打翻;真正的分水岭在帧率层,不在码率层。

实测三:仓库自带样例——两处对不上官方数字

光测自己造的数据还不够,我拿仓库里自带的两个样例跑了同一套离线流程,对照 README 的案例描述:

样例 官方说法 我的实测 对得上的 对不上的
unboxing(72s 沉浸式开箱) 全实拍,29 镜 31 镜,实拍 93% + AI 6%,置信 0.481,36.3s 主体正确 多出 2 镜;6% 被判 AI,且自己标了「93% 时长待确认」
v10(70s 产品宣传片) 83% 代码动效 + 12% 录屏,12 镜 10 镜,代码 91% + 静态图推拉 5% + 3D 4%,置信 0.84 代码占比吻合 12% 录屏没认出来,被并进其他类

这两处偏差都在合理范围,但值得写出来:官方 README 自己也承认,平台转码会抹掉传感器噪声证据,离线模式对转码素材只能给出「待确认」,要靠看图复核拉回。rea-video 的一点好处是它把这种不确定明明白白写进结论里——「93% 时长实拍还是 AI 待确认」这句话会原样出现在 verdict 里,而不是藏进附录。

实测四:一行 ffmpeg 伪造 AIGC 标识——硬证据是单向的

这是本次实测里我认为最有价值的部分。rea-video 把容器元数据里的 AIGC 隐式标识(国标 GB 45438-2025 那套 {"Label":"1","ContentProducer":...})当作强证据。我就想试一下这个「强」到底强到什么程度,于是做了四组对抗实验,全部只动元数据、不动一个像素:

Bash
# 环境:macOS,ffmpeg 9.0.2;-movflags use_metadata_tags 是关键,
# 否则自定义键写不进 mdta box,probe 读不到
# ① 弱签名:注释里提生成器
ffmpeg -i in.mp4 -c copy -metadata comment="Generated with Kling AI" out1.mp4
# ② 相机标签:伪装成 iPhone 拍摄
ffmpeg -i in.mp4 -c copy -movflags use_metadata_tags \
  -metadata make="Apple" -metadata model="iPhone 15 Pro" out2.mp4
# ③ 裸值:直接塞一个 aigc=1
ffmpeg -i in.mp4 -c copy -movflags use_metadata_tags -metadata aigc=1 out3.mp4
# ④ 合法国标隐式标识:Label=1
ffmpeg -i in.mp4 -c copy -movflags use_metadata_tags \
  -metadata 'aigc={"Label":"1","ContentProducer":"0000000000000000","ProduceID":"spoof-test"}' out4.mp4
实验 挂的对象 结果
① 注释提 Kling 代码渲染真值 读到 generator 中等证据,置信 95%→76%,结论不变
② 相机标签 代码渲染真值 读到 camera 强证据,结论不变(95% 纹丝不动)
③ aigc=1 裸值 代码渲染真值 解析失败,标记静默失效,毫无作用
④ 国标 Label=1 unboxing(72s 真实实拍) 整片翻转:实拍 93% → AI 生成 93%
⑤ 国标 Label=1 代码渲染真值 结论不变(仍 100% 代码渲染),置信 95%→76%

④和⑤合起来就是那个反直觉结论:AIGC 标识是「实拍↔AI」这条轴上的单向硬证据,它压得过像素统计,却压不过画面形态学判断(代码渲染该是什么样就是什么样);但反过来,只要这条轴本身有争议,一条元数据就能定案。更微妙的是③:写了个解析不了的裸值,工具直接当不存在,报告里连「有一条损坏的标识」都不会提。

所以我的使用建议是:把 AIGC 标识当「有则信」的信号,永远不要当「无则不是」的证据——平台转码、剪辑软件导出都会把标识剥掉,剥掉不等于没生成过;反过来,带标识的素材也可以被人为写上。元数据在这个工具里是「强证据」,不是「防伪印章」。

实测五:免费模型当 Agent,它真的会看图

按官方设计的用法,rea-video 是给编码 Agent 用的技能。我把 skills/rea-video/(SKILL.md 110 行 + 8 份参考文档共 508 行)放进 opencode 项目的 .opencode/skill/rea-video/,用免费的 glm-5.3-flash-free 跑完整流程。这个体量和我 11 月初测 unslop 技能时差不多,免费模型扛得住。

agent 做对了整条链路:跑 decompose → 发现两个低置信镜头 → 生成看图复核任务(review_tasks.json)→ 自己逐镜看图填答案 → apply-review 并入,置信度从 0.70 提到 0.784。整个会话 60,856 input / 8,511 output tokens,花费 0 美元。这已经是本站用免费模型跑第三方技能的第三次实战——前两次分别是把 AI 味界面改成有设计感的页面和给 Agent 换一个不吃内存的无头浏览器,三单合起来看,「不配 Key、全靠免费模型」这条路在技能类工具上是走得通的,前提是技能文档别太长——rea-video 全部文档 508 行,而 security-audit 那种 1778 行的六阶段流程,免费额度撑不完。

我抽查了它的视觉描述是否属实:它说镜头一「白瓷杯里的液体隆起成丘、高过杯口边缘」,我把对应抽帧图调出来看——橘猫确实在嗅一只白瓷杯,暖色逆光;它说镜头二是浅灰针织衫的年轻女性在挥手,也对得上。它甚至自己发现结论表里残留了一个 static_graphic 的叠加层标注、主动去读了 packaging/timeline.json 核实为空,最后报告「无字幕无贴纸」,与我拼片时的实际操作一致(我只做了视频轨拼接,没加任何包装)。

另外它确认了一个我拼接时的副作用:concat 滤镜只映射了视频轨,成片真的没有音频流——而原生 24fps 的 AI 素材其实是带音轨的(工具在其中一段里测出 152 BPM 的 BGM 和人声)。「AI 视频自带音效」这件事会改变它的声音层结论,拼接时丢掉的音轨不会被判「无声音」,这是真实发生的行为差异。

OCR 那个坑,值不值得再开一个 venv

最后补测了 Python 3.12 + OCR 的组合,对象是上面没认出录屏的 v10 样例:

指标 3.13 无 OCR 3.12 + OCR
总耗时(70s 视频) 10.2s(跳过包装层) 52.5s
字幕 无 33 句完整时间轴
音效 2 处 30 处,且 30 个全卡在文字/贴纸出现上
花字/文字标注 无 花字 1 处、文字标注 12 处

对动效类视频(画面即文字),OCR 开不开是「能用」和「好用」的差别:音效卡点这种叙事级的结论完全依赖字幕时间轴。代价是慢 5 倍。我的建议:抽帧预览确认有大量屏幕文字时再开 3.12 的 venv,普通实拍素材不值得。

什么时候别用它

写几条我的判断,供你对号入座:

  • 别把它当鉴伪工具用。它判断的是「怎么做的」,不是「谁在说谎」——标识可伪造、帧率灰区、转码抹证据,三条路都通向误判。内容审核场景请配合人工。
  • 平台下载的转码素材,离线模式的结论请一律按「待确认」读,别只看第一行的百分比;真要定量,得接 VLM 或让能看图的 agent 走复核(VLM 接入我未实测,REA_VLM_* 三个环境变量的配置流程与效果需自行验证)。
  • 复刻半成品:remake-run 会真的调用付费视频模型,官方做了 dry-run 确认层,但我在这次测试里没有走到复刻执行(对应的 capsule-cinema 是独立项目),复刻质量无从评价。

至于它最亮的那部分——把一条 60 秒混剪拆成「实拍怎么拍、AI 怎么生成、代码怎么写」的三栏施工单——在我验证过的范围内是成立的:切点、分类、字幕、音效卡点都经得起带答案的对拍。对每天拆爆款短视频找思路的人来说,这可能是目前离线可跑的方案里最诚实的一个。

推荐阅读

  • Cloudflare 安全审计技能实测:222 行的靶子埋 6 个洞,单次通读全抓到,六阶段先撞了额度墙

    Cloudflare 开源的 security-audit 技能把代码审计拆成六个阶段,核心是让发现者与验证者必须是两个不同的 Agent。我造了 222 行、埋 6 个真漏洞和 5 个诱饵的靶子实测…

  • VoiceStudio 实测:10 万星的本地语音克隆,我在 16GB M4 上从源码跑通了引擎,也踩了三个坑

    VoiceStudio 是 10 万星的本地语音克隆工具,我用默认的 OmniVoice 引擎在 16GB M4 上从源码编译跑通:945MB 权重、Metal 加速,加载 1.6 秒、RTF 约 0…

  • floci 实测:LocalStack 停摆后的免费 AWS 模拟器,我无 Docker 从源码跑通了 Agent 本地云链路

    LocalStack 社区版强制登录后,MIT 开源的 AWS 模拟器 floci 成了热门替代品。我在 16GB MacBook 上从源码编译 2.4.0 实测:无 Docker 跑通 S3、Dyn…

  • colibri 实测:大模型不装内存、改「摆放」,我在 16GB M4 上摸清了它的真实边界

    GitHub 46,000 star 的纯 C 推理引擎 colibri,把 744B 大模型的专家权重留在磁盘、按 token 流式读取。我在 16GB M4 Mac 上实测:规划器裁决显示内存下限…