Skip to content

Feature: 视频节点

一句话目标

用户在视频节点中上传或生成视频,播放预览,截取关键帧作为 AI 视频生成的首帧输入。

行为约束

约束 1:视频上传

前置条件: 视频节点已创建,无视频(空状态) 行为: 用户点击上传区域或拖拽视频文件到节点 后置条件: 视频通过验证后(MP4/WebM,≤ 50MB)显示播放器

约束 2:上传验证

前置条件: 用户选择了文件 行为: 系统校验文件类型和大小 后置条件: 非法文件显示 toast 错误,不修改节点

约束 3:视频播放

前置条件: 节点已有视频 行为: 用户可播放/暂停、拖拽进度条 seek、查看时间显示 后置条件: 播放状态实时反映在控制栏

约束 4:截帧

前置条件: 视频已加载(readyState ≥ 2) 行为: 用户点击截帧按钮,系统在 canvas 中绘制当前帧并生成 PNG blob 后置条件: 截帧预览显示在节点中,帧 URL 保存到 frameUrl,用于后续生成

约束 5:AI 视频生成

前置条件: 用户已输入 prompt 行为: 点击生成,调用 generateVideo API(可选携带 frameUrl 作为首帧) 后置条件: 生成结果替换当前视频,播放器重置

约束 6:截帧跨域限制

前置条件: 视频来源为跨域 URL 行为: canvas 绘制抛出 SecurityError 后置条件: 显示 toast 提示"跨域限制",不崩溃

Acceptance Criteria

  • [x] AC-01:空状态显示上传拖拽区域
  • [x] AC-02:点击和拖拽均可上传视频
  • [x] AC-03:非法文件显示错误 toast
  • [x] AC-04:播放/暂停/进度条/时间显示正常工作
  • [ ] AC-05:截帧生成 PNG 并显示预览缩略图 — 延后(截帧功能暂时移除,恢复条件:跨域 CORS 方案确定后)
  • [ ] AC-06:截帧后的帧图片作为首帧参数随生成请求发送 — 延后(依赖 AC-05)
  • [x] AC-07:生成成功后视频替换并重置播放状态
  • [x] AC-08:生成失败不丢失已上传的视频和 prompt
  • [x] AC-09:组件卸载时释放 Object URL、abort 请求
  • [ ] AC-10:跨域视频截帧失败时优雅处理(toast 提示) — 延后(依赖 AC-05,与截帧功能一起恢复)

BDD Scenarios

gherkin
Feature: 视频节点

  Scenario: 上传视频并播放
    Given 一个空视频节点
    When 用户上传一个 MP4 文件
    Then 视频预览显示在节点中
    When 用户点击播放按钮
    Then 视频开始播放
    And 进度条实时更新

  Scenario: 截帧并用于生成
    Given 视频节点正在播放一段视频
    When 用户暂停到某一帧
    And 点击截帧按钮
    Then 截帧预览缩略图显示在节点中
    When 用户输入 prompt 并点击生成
    Then 生成请求携带截帧图片作为首帧

  Scenario: 拒绝非法视频文件
    Given 一个空视频节点
    When 用户上传一个 100MB 的 MP4 文件
    Then 显示文件大小超限的错误提示
    And 节点保持空状态

TDD 单元测试要点

针对文件验证逻辑:

  • [ ] MP4/WebM 通过验证
  • [ ] 非法类型返回错误信息
  • [ ] 超过 50MB 返回错误信息

针对时间格式化:

  • [x] formatTime(65) 返回 "1:05"
  • [x] formatTime(0) 返回 "0:00"

Out of Scope

  • 视频裁剪/剪辑
  • 多段视频拼接
  • 视频延长(未规划)