← Files 中文口播智能粗剪ARCHIVED FILE

skills/rough-cut/scripts/make_draft.py

2.51 KB · Oct 5, 2026 · 18:30 UTC

↓ Download file

#!/usr/bin/env python3
"""⑦ 生成剪映草稿。用 pyJianYingDraft(成片 A/B 验证)。
草稿里每个保留段指向原片的一个时间区间——原片一帧没删,拖边缘能长回来。
"""
import argparse, json, os, sys
from runtime_support import FFPROBE

def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("video")
    ap.add_argument("final_cuts")
    ap.add_argument("--out", required=True)
    ap.add_argument("--name", required=True)
    a = ap.parse_args()

    try:
        import pyJianYingDraft as draft
        from pyJianYingDraft import trange, TrackType, TrackSpec
    except ImportError:
        sys.exit("未安装 pyjianyingdraft。运行: pip install pyjianyingdraft")

    cuts = json.load(open(a.final_cuts, encoding="utf-8"))
    keeps = cuts["keeps"]
    US = 1_000_000

    # 读分辨率
    meta_path = os.path.join(os.path.dirname(a.final_cuts), "meta.json")
    m = {}
    if os.path.exists(meta_path):
        m = json.load(open(meta_path, encoding="utf-8")); W, H, FPS = m["width"], m["height"], int(round(m["fps"]))
    else:
        W, H, FPS = 1080, 1920, 30

    draft_root = os.path.join(a.out, "剪映草稿")
    os.makedirs(draft_root, exist_ok=True)
    folder = draft.DraftFolder(draft_root)
    script = folder.create_draft(a.name, W, H, fps=FPS, allow_replace=True)
    script.append_track(TrackSpec(TrackType.video, "主视频"))

    # 读视频真实时长,clamp 防止音视频时长差导致越界
    import subprocess
    real_dur = float(subprocess.run(
        [FFPROBE,"-v","error","-select_streams","v:0","-show_entries","stream=duration",
         "-of","default=noprint_wrappers=1:nokey=1", os.path.abspath(a.video)],
        capture_output=True, text=True).stdout.strip() or m.get("duration", 1e9))
    safe_end = real_dur - 0.05

    cursor = 0
    for k in keeps:
        k_end = min(k["end"], safe_end)
        if k_end <= k["start"]:
            continue
        src_start = int(k["start"]*US)
        dur = int((k_end-k["start"])*US)
        seg = draft.VideoSegment(os.path.abspath(a.video),
                                 trange(cursor, dur),
                                 source_timerange=trange(src_start, dur))
        script.add_segment(seg, "主视频")
        cursor += dur

    script.save()
    print(f"✓ 剪映草稿: {draft_root}/{a.name}({len(keeps)}段, 时间线{cursor/US:.1f}s)")
    print("  剪辑师: 拷进剪映草稿目录 → 重启剪映即见。删掉的内容拖片段边缘可找回。")

if __name__ == "__main__":
    main()

SHA-256: de8f7626b265c2f1870d9f9149243a0192473ee5d72877ad4679713c4e7c1d45