Code Agent 是如何处理视频的
Codex · Claude Code · Pi · Grok Build 源码对比 · 2026-08-04
写法:先结论,再分三块白话展开,最后回答「没能力为什么还能做好」
- 0 · 一个念头
- 1 · 先说结论
- 2 · 发给模型的数据里有没有视频
- 3 · 去读 mp4 时会发生什么
- 4 · 生成、播放会不会冒充理解
- 5 · 任务是靠什么做好的
- 6 · 其它细节往哪搁
- 7 · 自己做产品时怎么定
- 附录 · 四家流程
0 · 一个念头
我有一个很具体的念头。
我把一段视频交给 Codex。按现在的宣传,coding agent 好像都很「多模态」。可顺着代码往下挖会发现:Codex 允许用户提交的类型里,根本没有「视频」;能拿去「看」的,到本地图片就停了。
即便如此,很多时候任务仍然能推进得不错。
这就怪了:它到底在干什么?是偷偷会看视频,还是从来就没靠「看懂画面」在干活?如果是后者,我们把「做得好」和「会看视频」绑在一起——绑错了。
于是我对照了 Codex、Claude Code、Pi、Grok Build 的源码。结论有点反直觉。
1 · 先说结论
四家都不会「直接把 mp4 交给模型看」。
处理方式确实不一样——但差不在「谁更能看片」,而在:
① 发给模型的数据格式里有没有视频;
② 读一个 mp4 时是骂你、装死、还是当普通文件;
③ 产品上有没有生成/播放,让人误以为它会分析。
一句话:Code Agent 并不会「看视频」。真正能进模型「眼睛」的,一直是文字 + 图片。「把视频交给 agent 还能做好」——多半靠别的办法做完,不是软件把整段 mp4 塞进了多模态接口。
| 顺序 | 白话名字 | 在问什么 | 为什么重要 |
| 第一块 | 发给模型的数据 | 请求里能不能带「视频」? | 这里没有,后面补不回来 |
| 第二块 | 去读文件时 | 对 .mp4 点读取,怎么反应? | 决定日常体感 |
| 第三块 | 产品还提供了什么 | 会不会生成、播放?和理解混没混? | 决定会不会被宣传带偏 |
| 问题 | 结论(判定) | 补充 |
| Codex 会不会原生处理视频? |
不会 |
用户输入类型里没有视频 |
| 任务是靠什么做好的? |
靠「不看视频也能完成」的办法 |
例如:活本来就不用看画面;终端截帧再当图;你已经说明了内容/给了字幕;只改旁边的文本配置。不是模型看懂了 mp4。具体哪一种,要看那一次对话记录 |
| 四家大不相同吗? |
是,差在挡法和热闹程度 |
相同:都不会直接把视频交给模型。不同:拒绝响不响、有没有生成/播放 |
| Grok 会不会看视频? |
分析画面:不会 |
能生成、能播放;播放用的帧不会自动算「模型看过」 |
2 · 第一块:发给模型的数据里有没有「视频」?
用白话讲
判断 agent「能不能看 X」,第一刀不是看官网广告,而是看:它发给大模型的那包数据里,允许出现哪些内容。如果只允许文字和图片,就没有正规路径把「一整段 mp4」直接塞给模型——除非先截成图。
四家在这一层的答案一样:没有「视频」这种内容类型。
2.1 Codex
用户能提交的类型是固定列表:文字、图片(含本地图片路径)、Skill、Mention 等。没有「本地视频」。实时相关配置里也是不接收视频的。
要点
能提交:文字、图片、本地图片路径…
不能提交:视频路径 / 视频内容块
官方能「看」的入口:只有图
2.2 Pi
协议里用户内容只有:文字、图片。提问时可选「带一组图片」,没有「带一组视频」。会话树、分支摘要是另一套能力,改不了「模型只收字和图」。
2.3 Claude Code
「读文件」返回类型大致是:文字、图片、笔记本、PDF。图片只认常见静图格式。依赖库里若出现 Video 名字,是别人 SDK 的类型,不是主流程在发「视频内容块」。
2.4 Grok Build
对话内容块只有文字和图片。代码里和视频地址相关的,主要是生成完下载文件,不是拿视频当视觉输入。所以 Grok 再像「视频产品」,分析这一侧和另外三家一样——请求里没有视频块。
小结
门在「能提交什么」上就锁了。唯一正经绕法:先变成图片(截帧/截图),再走各家已有的看图。
3 · 第二块:去读一个 mp4,会发生什么?
用白话讲
体感来自:我让 agent 打开这个文件,它回了什么。四家对图片有成熟流程;对视频则是报错、没通道、或不当图处理。没有任何一家默认:打开 mp4 → 自动截帧 → 自动给模型看。
| 图片 | 视频 | 你的感觉 |
| Claude | 压缩后当图读 | 明确:二进制,不能读 | 拒绝最响 |
| Codex | 看图工具 / 本地图 | 没有「读视频」工具 | 不报视频错,也不会看;可用终端自己绕 |
| Pi | 认静态图 | 不认 video | 不会当图给模型 |
| Grok | 粘贴图 / 读 image | 当二进制拒绝 | 挡文件;旁边能生成、能播 |
Claude:两张名单
图名单(png/jpg…)→ 压缩后当图。二进制名单(含 mp4/mov/webm…)→ 直接报错,不会解成一帧帧画面。你很难误以为「它其实看过了」。
Codex:看图工具只服务图片
没有官方「用户给 mp4 → 自动截帧 → 送模型」。但 agent 仍可能:用终端跑 ffmpeg 导出几张图再看图;或任务根本是改代码/脚本,不用看画面。所以常出现「没能力却还能做好」。
Pi / Grok
Pi 默认极简,视频不是一等公民。Grok 挡文件时接近 Claude 那么硬,但产品上还能生成和播放,人容易晕(见下一块)。
小结
相同:都不会默认「读 mp4 = 模型看视频」。不同:拒绝响不响、有没有终端可绕。Claude 拒绝最响;Codex 换路空间最大。
4 · 第三块:生成、播放,会不会冒充「会分析」?
用白话讲
分析画面:四家都不会直接吃视频。让人觉得差很多的,是会不会生成视频、会不会播放,以及文案有没有把这两件事和「理解内容」写成一回事。Grok 在前两件上最热闹。
| 能力 | Codex | Claude | Pi | Grok | 模型算看过吗? |
| 直接分析视频 | 无 | 无 | 无 | 无 | — |
| 看图片 | 有 | 有 | 有 | 有 | 会 |
| 生成视频 | 无* | 无 | 无 | 有 | 产出文件,≠ 看懂 |
| 播放视频 | 无 | 无 | 无 | 有 | 不会(给人看) |
* 文档里可能出现 Sora 等名字,不是「丢 mp4 就会分析」的正式路径。
Grok 请拆成三件事:
- 分析——看图,模型算看过图;
- 生成——写出 mp4 文件;
- 播放——终端播给你看,模型不当作看过。
正确说法:会产片、会播给你看;理解内容仍要截帧再看图。
错误说法:「Grok 会分析视频」。
5 · 回到念头:任务是靠什么做好的?
判定(结论)
靠「不把 mp4 交给模型看」也能完成任务的办法,不是靠「看懂了视频」。
5.1 候选路径:不能拿单个案例排「常见程度」
官方路径不会把你的 mp4 直接送进图片视觉。下面列的是可能发生的路径,不是经过统计的频率排名;判断某次任务到底走了哪条,必须看那次对话和工具日志。
| 路径 | 靠什么 | 实际在干什么 | 怎么验证 |
| A | 任务本来就不用看画面 | 改脚本、修播放器、写配置、对接 API | 对话里几乎没读 mp4、也没截帧 |
| B | 自己截帧再当图看 | 终端 ffmpeg 导出图,再走看图 | 日志里有 ffmpeg,后面有看图 |
| C | 你已经把内容说明白了 | 口述、字幕、剧本、关键截图 | 用户消息里已有描述或图 |
| D | 只动旁边的文本 | srt / json / prompt | 读的是文本 |
| E | 嘴上「看过」(坏) | 根据文件名瞎编 | 没图没帧却描述细节 → 打回 |
5.2 当前 Codex 实测:直接失败,截帧后成功
实测(事实)· 2026-08-04
同一个本地 MP4,先直接交给当前 Codex 的 view_image,再用 ffmpeg 抽帧后交给同一图片入口。结果清楚地复现了路径 B。
| 步骤 | 操作 | 当前会话的新鲜结果 |
| 样本隔离 | 选择只有 source.mp4、没有同目录字幕或 JSON 的 15.069 秒视频;临时改名为 sample.mp4 | H.264 · 864×496 · 24 fps · AAC;SHA-256 67190c6532f5…72ae19 |
| 直接读取 | view_image(sample.mp4) | image content omitted because it could not be processed;没有画面进入视觉结果,也没有产生内容描述 |
| Shell 抽帧 | ffmpeg 在 0、2.5、5、7.5、10、12.5 秒取六帧,拼成 JPEG 联系表 | 成功生成 1296×496 静态图 |
| 图片读取 | view_image(contact-sheet.jpg) | 成功看到厨房内两名成年人,并能比较六帧中的人物表情和取景范围变化 |
本次实测的关键命令
ffprobe -v error -show_entries format=duration,size:stream=codec_type,codec_name,width,height,avg_frame_rate sample.mp4
ffmpeg -i sample.mp4 -vf "fps=1/2.5,scale=432:248:force_original_aspect_ratio=decrease,pad=432:248:(ow-iw)/2:(oh-ih)/2:black,tile=3x2" -frames:v 1 contact-sheet.jpg
这次能下的结论:当前 Codex 会话没有直接处理该 MP4 的图片视觉路径;Agent 在直接读取失败后,可以调用 Shell 抽帧,再通过静态图片获得画面信息。内容识别发生在 JPEG 进入 view_image 之后,不是在 MP4 阶段。
这次不能下的结论:一个样本不能证明 A–E 哪条最常见,也不能覆盖所有 Codex 版本、产品界面或未来服务端能力。本次只直接验证了当前环境中的路径 B;六张采样帧也不能替代完整时间轴、音轨或逐帧动作理解。
Codex 强的是「一轮轮用工具(包括终端)+ 看图 + 改代码」,不是「内置视频理解」。
「交给视频仍做好」≠「视频能力已经接通」。
| 你怎么做 | 更可能发生什么 |
| mp4 → Claude 读文件 | 明确报错 → 你立刻知道没看成 |
| mp4 → Codex | 官方不看;活能绕开画面就照样做成 → 容易误以为会处理视频 |
| Grok 生成/打开 mp4 | 能产、能播 → 「会视频」感觉更强;模型仍没按视频去理解 |
6 · 其它细节往哪搁?
图要压多小、最长边多少——只影响截帧后清不清晰,不会 magically 变成「会看视频」。文档里的 Sora 名、SDK 里的 Video 类型名,没有提交路径就等于用户用不上。这些都不是第四套秘密能力。
7 · 若我们自己做产品,默认怎么定?
不说「因为第几块」,直接说该怎么做:
因为模型根本收不到视频
- 对外只承诺:能处理文字和图片
- 用户上传视频时,不要写「模型将直接理解视频内容」
因为读 mp4 不会自动变成「看过」
做成固定流程:
流程
视频文件
→ 沙箱里 ffmpeg 截帧(关键画面 / 均匀取样,需要时抽字幕)
→ 压成各家都吃得下的静图
→ 走各家已有的「看图」
→ 输出带时间信息的说明
→ 截帧失败就明确失败,禁止假装分析过
因为生成/播放容易冒充理解
- 能力表强制三列:理解 | 生成 | 展示
- 验收:直接丢 mp4 → 应拒绝,或能看到自动截帧的证据
记日志时别混
- 截了哪些帧、哪些图进了对话、模型实际吃到几张图
- 是否生成了成片、是否播放了成片
- 「播过」和「模型看过」不要记成同一次成功
附录 · 四家流程(查阅)
简图
Codex 图片→看图工具→模型 │ 视频→官方无对等路径,终端可自助截帧
Claude 读图→压缩当图 │ 读 mp4→报错(二进制)
Pi 读静图→缩放→模型 │ 视频不是一等能力
Grok (A)看图 (B)生成mp4 (C)终端播放(给人看)│ 读 mp4→拒绝
收束
回到开头:把视频给了 Codex。它没有原生处理视频的能力,却仍可能做得很好。
源码解释是:
- 它确实不会把视频当成「给模型看的视频」——分析这一侧,四家一样。
- 这条换路已在当前环境实测:直接读 MP4 失败,ffmpeg 抽帧后看图成功;其它旁路及其常见程度仍需对应会话日志。
- 体感差很多:Claude 拒绝响;Codex 换路空间大;Pi 默认极简;Grok 分析同样不会直接看,但生成和播放把「会视频」演得很真。
别问「哪个 Code Agent 会看视频」。
问「截帧和看图接在谁家路径上,以及生成/播放有没有被算成已经理解」。