{
  "schemaVersion": 1,
  "slug": "reference-trim-time-window",
  "locale": "zh",
  "evidenceClass": "executed-local-fixture-not-provider-generation",
  "providerModelTest": false,
  "productionTaskRun": false,
  "runCommand": "node run-recipe.mjs --out ./my-run",
  "environment": {
    "nodeVersion": "v24.18.0",
    "ffmpeg": {
      "version": "ffmpeg version 6.0 Copyright (c) 2000-2023 the FFmpeg developers",
      "binarySha256": "a90e3db6a3fd35f6074b013f948b1aa45b31c6375489d39e572bea3f18336584"
    }
  },
  "title": "参考视频时间窗裁剪：越界拒绝与保留帧验收",
  "description": "从原创三秒片段裁出 0.5–1.5 秒，实际拒绝无效窗口，核对源索引 5–14 与归零后的输出时间戳。",
  "goal": "按左闭右开边界制作一秒参考片段。本配方裁剪连续视频区间，不是按时间基准选择一张静帧。",
  "preparation": [
    "准备 Node.js 与 FFmpeg，必要时设置 FFMPEG_BIN。脚本创建 320×180、每秒十帧、三秒长的原创参考夹具。",
    "查看 window.json：源时长来自三十个解码帧和本夹具明确的恒定帧率，选定起点为 0.5 秒、终点为 1.5 秒。",
    "选择新的输出目录，先用配套 CFR 夹具验证。任意 VFR 或非零起点参考的可用尾部边界，需要另外建立时间戳清单。"
  ],
  "steps": [
    {
      "title": "01. 确认源片真正可用的区间",
      "body": "完整解码原创夹具，确认每秒十帧下确有三十帧，由此建立受控的三秒区间。构建用原始 RGB 暂存会在 finally 清理。这种受控 CFR 时长算法不能直接当成通用 VFR 时长推算。"
    },
    {
      "title": "02. 编码前拒绝无效边界",
      "body": "本地校验要求两个值有限、起点不小于零、终点大于起点，且不超过源时长。脚本分别实跑负起点、相等边界、倒序边界、超尾请求和 NaN，不静默纠正。"
    },
    {
      "title": "03. 裁剪后重新设置时间原点",
      "body": "实际应用 trim=start=0.5:end=1.5,setpts=PTS-STARTPTS 并重新编码。trim 保留源片连续区间，setpts 让输出从零开始；终点不包含从源片 1.5 秒开始的那一帧。"
    },
    {
      "title": "04. 同时比较首尾画面与输出时间",
      "body": "结果应完整解码为十帧，首尾分别与源索引 5、14 的 RGB 比较，再解析真实 showinfo 日志，确认输出 PTS 从 0.0 到 0.9、间隔 0.1 秒。本次首尾最大通道差均为零。"
    }
  ],
  "acceptance": [
    "源片实际解码为三十帧 320×180，符合受控十 FPS。",
    "0.5–1.5 秒通过有限数值与区间边界规则。",
    "裁剪片段准确解码为十帧，对应十 FPS 下的一秒。",
    "输出首尾分别匹配源索引 5、14，通道差不超过四，本次均为零。",
    "实际输出时间戳从零开始，最后为 0.9 秒。",
    "五种无效窗口均被拒绝，十一项回执与 showinfo 实际日志一同保留。"
  ],
  "troubleshooting": [
    {
      "symptom": "第一帧时间仍显示 0.5 秒。",
      "change": "只在 trim 后补回 setpts=PTS-STARTPTS，再读取输出 showinfo 时间戳。"
    },
    {
      "symptom": "片段包含源片 1.5 秒开始的画面。",
      "change": "使用配方明确的右开边界，以源索引 14 验收最后一帧，不通过延长终点补偿。"
    },
    {
      "symptom": "要求的终点超过参考片。",
      "change": "只把 endSeconds 降到已确认边界，或获取原本需要的更长参考；不悄悄截成合法值。"
    }
  ],
  "ending": "把请求时间窗、源片可用区间与解码端点检查一起保存。小型 CFR 夹具证明这次裁剪操作，不代表所有真实参考片的时间戳行为。",
  "assetCaption": "原创逐帧变色参考片、实际一秒裁剪结果与专门的区间图；未运行提供商或模型生成。"
}
