Clip Picker(片段选择器)
从长视频中找出值得保留的片段。整个方法的存在是为了解决一个硬性限制:
Claude 无法观看视频。 它只能读取静态图像。因此,“挑选好片段”实际上就是:将视频足够密集地采样成图像,以便看清发生了什么,根据准则对这些图像进行评判,以全分辨率确认,然后裁剪。修剪操作微不足道且近乎即时;真正观察 30 分钟以上的视频 才是真正的成本——请为此做好预算,无需对此感到抱歉。
脚本位于 scripts/ 目录(survey.py、score.py、board.py)。它们负责处理机械部分;Claude 则在其间进行视觉判断。依赖项:系统 PATH 中的 ffmpeg/ffprobe,numpy,pillow(这些都已在此机器上安装——请参见 [[editor-pack-video-editing-stack]])。
管道(Pipeline)
在暂存区(scratchpad)中选择一个工作目录(WORKDIR,例如 .../scratchpad/clippick)。然后:
1. 确认准则。 如果素材不是 POV 摩托车/骑行(下面的内置默认规则),请向用户提出 1-2 个问题:对他们来说,什么使得一个片段好,所需的片段长度,输出形状(16:9 还是 9:16),以及选择度如何(几个精华片段还是全部都要)。一句好的评判标准就能改变每一个选择——在开始调查之前就要拿到它。
2. 调查——将视频转为可读的联系表。
python scripts/survey.py "C:\path\to\videos_or_dir" --out WORKDIR --interval 4
每 4 秒生成一张缩略图,以 6x6 网格拼接,并印上源时间码。对于快速/事件密集的素材,请使用 --interval 2-3;对于缓慢的素材,请使用 --interval 6-8。它会打印每个片段的规格,并标记 HDR(HLG/PQ)源。对于多个/长 HEVC 片段,此过程会很慢(软件解码是瓶颈)——请后台运行它,并在联系表生成后查看它们。
3. 视觉检查每张联系表。 使用 Read 阅读每个 WORKDIR/montages/*_sheet_*.jpg。根据准则,通过时间码映射候选窗口。采样点之间可能错过的眨眼即逝事件——如果某张联系表暗示了什么(角落的闪光,一个人影),记录下来,并在之后对该区间进行更密集的采样。
4. 生成 WORKDIR/candidates.json ——每个候选窗口对应一个对象(架构如下)。保持每个窗口时长为 15-30 秒(或用户指定的长度)。为每个窗口分配一个 pick 代码(按您的排名顺序为 P01、P02...),一个一行文字的 title(说明其入选理由),以及 tags。
5. 以全分辨率 + 清晰度确认。
python scripts/score.py --work WORKDIR
为每个候选片段拉取一帧全分辨率关键帧,根据拉普拉斯方差(一种对焦度量)评分,并将它们拼接成 review.jpg。使用 Read 查看它。丢弃那些真正模糊/无趣的;调整 start/end 以捕捉最佳节拍。低清晰度 = 整个画面运动拖影——对于流动镜头来说是理想的,而不是拒绝的理由。 编辑后重新运行。
6. 呈现一份排名后的精选片段列表(由用户选择)。
python scripts/board.py --work WORKDIR --mode thumbs # -> WORKDIR/pickboard.html(可作为 Artifact 发布)
或者,当他们想观看后再选择时,使用一个可播放的展示板,同时也能裁剪片段:
python scripts/board.py --work WORKDIR --mode play --out "%USERPROFILE%\Downloads\clips"
play 模式将每个候选片段裁剪为浏览器友好的 H.264 格式(自动对 HLG/PQ 源进行 HDR->SDR 色调映射),写入 review_player.html 文件,其中包含与 mp4 文件相邻的原生 <video> 播放器(在 Chrome/Edge 中打开以进行本地播放)。默认输出为 16:9,仅修剪,不裁剪。
7. 裁剪/完成用户选择的优胜片段。 对于像素级精确或格式选择,请通过 [[editor-pack-video-editing-stack]] 的 video-tool-router 技能进行路由(流复制与重新编码,HLG 保护,Resolve 用于调色/稳定/放大)。提供后续选项:在流动片段上应用运动模糊增强,9:16 竖版,调色,字幕,蒙太奇。
选择准则(这实际就是“如何挑选”的原理)
当一个片段通过了质量门控并且携带至少一个“特殊”信号时,它就值得保留。
质量门控(必须全部满足)
- 子集,15-30 秒 的源素材(默认值;尊重用户的时长)。
- 主体清晰且稳定 ——主要主体(摩托车/把手、面部、玩家)应清晰且在画面中稳定。拒绝因颠簸/抖动导致的全局模糊、失焦、过曝或过暗、镜头遮挡。
- 有事情发生 ——有运动或变化。拒绝空转/停车/等待以及单调的静止画面。
“特殊”信号(需要 >=1 个;越多且越强的信号 = 排名越高)
- 速度/运动 ——周围环境因运动模糊而拖影,同时主体保持清晰。这是一个积极信号,也是进行运动模糊增强编辑的主要原始素材。
- 互动 ——出现其他人/骑手/车辆/动物;超车、团体骑行、某人做出反应。
- 动作/动态 ——过弯与倾斜、转向、海拔变化、特技、险些发生的情况(near-moment)。
- 光线与环境 ——日出/日落、黄金时刻、戏剧性的云朵、雾/霾、隧道、远景或豁然开朗的景象、水面。一天中的光线变化是最大的“电影感”杠杆——始终标记它。
- 新颖性 ——场景/地形的变化、入口/出口、任何在视觉上与周围几分钟不同的东西。
协调“清晰、不模糊”与“运动模糊是好的”
保持主体清晰且瞬间有意;将外围的速度模糊视为一种特性。只拒绝全局模糊(因颠簸而导致整个画面模糊)。胸前或车把安装的相机可以让摩托车主体保持清晰,同时让世界拖影——这正是所追求的效果,而不是缺陷。
排名
排序依据:特殊信号的强度与稀有性,然后是清晰度,最后是多样性(不要将五个几乎相同的窗口排在最前面的位置——要分散不同的风格:一个远景、一段模糊流动、一次超车、一个有氛围的镜头)。当一个标准确实缺失时(例如,整个素材中都没有日出/日落),请诚实地说出来,而不是强行选择弱相关的窗口。
POV 骑行配置文件(此用户素材的内置默认值)
摩托车/自行车头盔或车把摄像头。具体来说:保留高速模糊扫掠、过弯/倾斜、超车与团体骑行、路边生活、雾/霾与山隘远景、隧道/林荫大道。跳过:停车、信号灯、停车、摆弄手机、长时间直线行驶的单调画面。(这正好是用户喜欢的那个剪辑集所依据的准则。)
candidates.json 架构
[
{"pick":"P01","clip":"clip_6318","file":"%USERPROFILE%/Downloads/clip_6318.mov",
"start":96,"end":120,"hero":104,"title":"高大树木隧道,前方骑手,强烈速度模糊",
"tags":["速度模糊","风景"]}
]
start/end/hero的单位是秒。hero是窗口内一个代表性瞬间(用于缩略图和清晰度评分)——选择最具特征的节拍,不一定是中点。pick代码同时充当用户选择的句柄(例如“裁剪 P01、P03、P10”)。tags(自由形式,但以下标签会被漂亮地标记):速度模糊(speed-blur)、弯道(corner)、远景(vista)、互动(interaction)、超车(overtake)、氛围(atmosphere)、风景(scenery)、动作(action)、光线(light)、野生动物(wildlife)。
效率与注意事项
- HEVC/HDR 解码是瓶颈,而不是编辑。对约 30 分钟的 HEVC 视频进行调查需要几分钟的解码时间。只根据素材的密集程度进行采样;后台运行调查和播放模式的编码。
- HLG/HDR 素材在原始的 SDR H.264 导出中会变灰——
board.py play会自动检测并进行色调映射,但对此类素材的任何手动裁剪也必须这样做。请参阅video-tool-router中的 HLG 保护。 - 按需加速: 如果用户预先明确了风格(“只要山路弯道和隧道模糊”),则以更粗糙的间隔进行调查,仅筛选这些片段,并只编码他们想要的少数几个——这将 20 分钟的流程压缩到几分钟。
- 不要捏造。 只声称一个采样的帧实际显示的内容。如果不确定是否存在一个 1-2 秒的事件,请在声称之前对该区间进行更密集的采样。
- Windows 字体路径 在脚本中硬编码(
C:/Windows/Fonts/...);在其他操作系统上进行调整。