用途:把一条已完成的正文(body)与一个钩子文件夹中的多个钩子(hooks)合成为「钩子+正文」的独立视频,每个钩子产出一条可单独上传的广告创意,用于钩子A/B批量投放。合并本身只需四行 ffmpeg,但该技能的重点在于避免交付在用户磁盘上损坏的文件。
使用方式(按顺序):
- 预检:python3 scripts/probe_join.py --body <cut.mp4> --hooks <hooks/>,输出每个钩子的几何参数、时间基准、音频尾部溢出、avcC 是否与正文匹配及响度差,并判断钩子可流拷贝还是需重编码。若几何参数不同应停止并与用户确认。
- 构建:python3 scripts/build_variants.py --body <cut.mp4> --hooks <hooks/> --out <variants/> --preset slow --crf 18,preset/crf 须与正文编码一致,仅对需重编码的钩子生效;同时写出 variants.json。
- 验证:swiftc -O scripts/avtest.swift -o scripts/avtest(每台机器一次),再运行 python3 scripts/verify_variants.py --body <cut.mp4> --hooks <hooks/> --out <variants/>。不可仅凭构建的 OK 行报告成功。
- 命名:走命名规范技能。
- 交付:走 video-review-canvas,回复开头给 URL;批量时发布 720p 代理而非母版,命令 python3 scripts/build_review.py --out <variants/> --version v1 --map <subjects.json>,每轮递增 --version。
主要坑:时间基准不一致会导致正文时间戳被拉伸;AAC 音频尾部溢出会使正文全程口型漂移;钩子与正文参数集不同时 mp4 只保留一个 avcC,ffmpeg 可正常播放但 AVFoundation 会在正文首帧卡住,需重编码钩子并匹配正文 preset/crf/pix_fmt 及 setsar=1;钩子通常比正文低 10–20 LU,需匹配响度,大幅提升时 loudnorm 线性模式会不足,需静态增益加限幅器,且限幅器不限制真峰值。
关键原则:用与构建不同的工具、在用户实际消费的媒介中验证(AVFoundation 探测+avcC 断言)。正文修订后全部参数化重跑,保留旧批量于独立文件夹。正文自身的时序特性不静默修改,需说明。相关技能:naming-convention、video-review-canvas、edl-tighten。