适用场景
你需要一个可部署的在线视频工具:上传/拖拽视频后,按规则抽取关键帧(或按间隔抽帧),并生成一份可交接的镜头列表(CSV/JSON/Markdown),包含 timecode、帧序号、截图文件名、镜头备注等。这个工具只做“从已有视频提取帧与信息”,不引导生成渲染图/海报/插画,也不涉及任何图像生成模型。
交付物(必须一次性齐全)
交付物要求:完整项目源码、清晰文件树、可运行命令、Docker 部署说明、以及可执行的测试用例或 QA checklist。你可以用任意语言栈,但必须让普通开发者按文档在 10 分钟内跑起来。
功能规格(建议实现)
1)支持上传 mp4/mov/webm(限制大小可配置);2)两种抽帧模式:按时间间隔(例如每 2s 一帧)与按镜头变化(基于阈值的场景切换检测,允许降级到固定间隔);3)导出镜头列表:CSV/JSON/Markdown(三选二也可);4)导出打包:截图 + 清单一键下载 zip;5)前端预览:表格查看、按 timecode 跳转播放、为每帧添加备注并回写导出文件。
Prompt(复制到 AI 直接生成完整在线工具项目)
你是资深全栈工程师。请生成一个“在线视频抽帧与镜头列表导出”Web 工具的完整可运行项目。
【硬约束】
- 目标是在线工具(Web),提供前端页面 + 后端服务(或纯前端+WebAssembly也可,但需说明兼容性)。
- 只允许从用户上传的视频中“提取现有帧/信息”,不要引导生成任何图片/渲染图/海报/插画;不要出现 Midjourney、Stable Diffusion 等出图导向。
- 必须输出:完整源码 + 文件结构 + 本地运行命令 + Docker 部署 + 测试用例或 QA checklist(两者至少其一要非常可执行)。
【产品需求】
1) 上传:支持 mp4/mov/webm;显示视频时长、分辨率、帧率(可选);上传后可直接播放。
2) 抽帧模式:
- 固定间隔抽帧:用户输入 intervalSeconds(默认 2)。
- 镜头变化抽帧:基于 ffmpeg scene detection(例如 select='gt(scene,0.3)')或类似方案;提供阈值滑杆;如果无法稳定检测,必须可降级为固定间隔。
3) 镜头列表:每条记录包含:index、timecode(HH:MM:SS.mmm)、frameNumber(可选)、thumbnailFilename、notes(可编辑)、sourceVideoFilename。
4) 导出:
- 导出 CSV 与 JSON(必须都有);另加 Markdown 可选。
- 一键导出 zip:包含 thumbnails/ + manifest.(csv/json) + README。
5) 体验:前端表格可排序;点击一行可跳转播放器到对应 timecode;支持给每帧添加备注。
6) 性能与安全:限制上传大小(例如 500MB 可配置);后端存储使用临时目录并提供清理策略;避免任意文件写入路径穿越。
【技术建议(可调整,但要解释选择)】
- 后端:Node.js (Express/Fastify) + ffmpeg(通过 fluent-ffmpeg 或直接 spawn);
- 前端:React + Vite + Type ;
- 也可以用 Python(FastAPI) 或 Go,但必须给出同等可运行与部署说明。
【你必须按以下格式输出】
A. 项目概述(1-2 段)
B. 文件树(tree 形式)
C. 关键实现说明(抽帧命令、镜头检测策略、timecode 计算、导出格式)
D. 完整代码:逐文件给出(每个文件用代码块,标明路径)
E. 本地运行:安装依赖、启动前后端、ffmpeg 依赖说明
F. Docker 部署:Dockerfile + docker-compose.yml(如需要)+ 启动步骤
G. 测试/质量:
- 选项1:给出可运行的单元/集成测试(例如 jest/vitest/supertest)并说明如何执行
- 选项2:给出详细 QA checklist(覆盖上传、抽帧、导出、异常与边界)
【验收标准】
- 新手按文档执行命令后,能在浏览器完成:上传视频 -> 抽帧 -> 编辑备注 -> 导出 CSV/JSON -> 下载 zip。
现在开始输出,不要省略代码。
落地提示
如果你希望更快上线:先实现“固定间隔抽帧 + CSV/JSON 导出”,镜头检测作为可选高级模式。抽帧过程建议做任务队列/进度条,避免页面假死。
QA checklist(最小可行版)
上传:不同格式/大小;失败提示;大小限制;同名文件;并发上传。
抽帧:interval=1/2/5;短视频/长视频;抽帧数量上限;取消任务;进度可见。
导出:CSV/JSON 字段齐全;timecode 精度;中文备注编码;zip 内容结构正确;重复导出覆盖策略。
安全:仅处理上传文件;临时文件可清理;路径穿越防护;错误不泄露服务器路径细节。