{"repo":"eveacla11/see-my-video","free":true,"listed":false,"github":"https://github.com/eveacla11/see-my-video","clone":"git clone https://github.com/eveacla11/see-my-video.git","description":"让 AI 真的看见你发的视频：抽帧喂给模型，以及自建服务器上传视频的两个隐形坑","language":"Python","stars":17,"topics":["ai","claude","ffmpeg","self-hosted","video"],"license":"MIT","category":"media-processing","readme_excerpt":"怎么让 AI 真的\"看见\"你发的视频 一份踩坑记录：把视频喂给 AI，以及在自建服务器上传视频会遇到的两个隐形陷阱。 AI（Claude 这类）能读文字、能看图片，但 打不开视频文件 。 给它一个 mp4，它只能看着文件名干瞪眼。 这篇讲怎么解决，以及三个你一定会撞上的坑。 --- 这个仓库里有什么 文件 是什么 --- --- extract frames.py 能直接跑的抽帧脚本，输出帧图片 + 一段可以贴给 AI 的清单 api snippet.py 抽帧后直接喂给 Claude API（自己接前端的话看这个） server snippet.py 切片上传 + 轻量播放版（FastAPI 示例，抄走改个目录就能用） upload snippet.js 前端切片上传，带进度和重试 --- 核心思路：一句话 视频拆开看，本质就是一串画面。 用 ffmpeg 把视频抽成几张关键帧图片，AI 一张张看过去，就等于看了这段视频。 思路不新鲜——GitHub 上有个两千星的项目 claude-real-video 走的同一条路，做得比这里完整得多（去重、说话人分离、可视化查看器）。 想要开箱即用的成熟工具，去用它。 这篇的价值在别处：如果你是 自己给 AI 搭一双眼睛 ——服务架在家里、手机远程访问—— 那么下面的坑二和坑三，是那类本地工具不会遇到、而你一定会撞上的。 --- 坑一：帧怎么抽才聪明 最笨的办法是掐秒表均匀取，比如 17 秒的视频取 8 张。 问题是拍猫这种\"趴半天不动、突然暴起扑玩具\"的视频， 名场面可能正好卡在两帧之间漏掉。 解法：让 ffmpeg 按画面变化抽帧 ，顺便把每帧在原视频里的时间点也拿出来。 - gt(scene,0.25) — 画面变化超过阈值就抓一帧，静止画面不浪费配额 - eq(n,0) — 强制保留第一帧（否则开头可能一张都没有） - -vsync vfr — 防止 ffmpeg 自作主张补帧 - showinfo — 每帧的时间戳会打进 stderr，形如 pts time:4.000 ，正则抓出来即可 有了时间戳，AI 就能说出\" 第 12 秒 猫回头看了你一眼\"， 而不是含糊的\"中间有一帧\"。 别忘了兜底 ：一镜到底的静态视频切不出场景，得回退均匀取样。 抽完帧，把路径列表连同时间戳一起写进给 AI 的提示词里，让它逐张读就行： --- 坑二：上传\"进度 100% 之后失败\" 症状极具迷惑性 ：进度条稳稳爬到 100%，然后报上传失败。 看起来像服务器坏了，其实不是。 如果你的服务架在家里、靠 Cloudflare 隧道（或类似反代）暴露到公网—— 大文件的单个请求会撞上约 100 秒的等待上限 ： 浏览器把文件交给 Cloudflare 边缘节点很快（所以进度条直冲 100%）， 但边缘节点往你家里灌是慢的，没灌完就直接判超时。 解法：切片上传。 把文件剁成 4MB 一块串行发，每块几秒落地，永远碰不到那堵墙。 前端： 服务端（FastAPI 示例）： 顺带两件小事： - 单请求上传也别用 await file.read() 一口吞——手机视频动辄上百 MB，会把内存吃穿。用循环分块写盘。 - 用 XMLHttpRequest 而不是 fetch 做单请求上传，因为它有 upload.onprogress ，能给用户看到真实进度。 --- 坑三：传上去了，但播放永远卡在第一帧 又一个不报错的坑。视频出现在页面里，第一帧好好显示着，点播放——没反应。 病因是码率。 手机拍的 1080p 视频码率动辄 20+","default_branch":null,"files":null,"tree":[],"storefront":"/r/eveacla11","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/eveacla11/see-my-video/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}