# video-generator **Repository Path**: luopub/video-generator ## Basic Information - **Project Name**: video-generator - **Description**: 根据画板生成视频 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-15 - **Last Updated**: 2026-08-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 批量视频流水线(batch_video_pipeline.py) 把一条「电商故事板 → 亚马逊宣传视频」的生产链路做成一键批量脚本: ``` 故事板 HTML / 参考图 -> GPT Image2 逐镜头生成 16:9 高清静帧(产品一致性锁定) -> omni-flash 逐镜头图生视频(每段 4 秒,按画板镜头语言) -> Suno v4.5 生成一条连续纯音乐(可复用已有音乐) -> OpenMontage 裁剪/拼接/暖色调色/混音 -> outputs/成片.mp4 ``` 最终成片为 1920×1080 / 25fps / 20 秒,无字幕、无旁白,只有一条连贯背景音乐,可直接用于亚马逊宣传。 ## 环境准备(一次性) 1. Python 3.10+,并安装 Pillow:`pip install pillow` 2. 把 `batch_video_pipeline.py` 放到你自己的项目文件夹里运行 (例如 `D:/video-pipeline/`),成片会自动输出到脚本同级的 `outputs/`。 3. API Key 三种提供方式,任选其一(推荐第一种,无需创建文件): - **运行时输入**:直接运行,脚本会在窗口里提示你输入 API Key(输入内容会正常显示,回车确认); - 环境变量:`set API_KEY=你的密钥`(PowerShell:`$env:API_KEY="你的密钥"`); - `.env` 文件:脚本同目录放 `.env`,内容 `API_KEY=你的AI大模型聚合平台密钥`。 密钥在 https://mu.lk666.ai 登录后「API 密钥管理」创建。 4. 本机需有: - ffmpeg(已内置默认路径,也可设置环境变量 `FFMPEG`) - OpenMontage 目录(默认 `C:/Users/LENOVO/Documents/Codex/OpenMontage`,可用环境变量 `OPENMONTAGE_HOME` 覆盖) 5. 平台算力余额充足(`python batch_video_pipeline.py --balance` 可查询)。 ## 快速开始(只需故事板) ```powershell # 单个故事板 -> 自动出片 python batch_video_pipeline.py "D:/boards/我的包包_分镜画板.html" # 图片格式的故事板(PNG / JPG / WebP / BMP)也可以直接出片 python batch_video_pipeline.py "D:/boards/我的包包_画板.png" # 批量:文件夹里所有故事板 / 通配符 python batch_video_pipeline.py "D:/boards/*.html" python batch_video_pipeline.py "D:/boards" ``` ### 双击运行(推荐日常使用) 把 `一键出片.bat` 和 `batch_video_pipeline.py` 放在同一个文件夹里: - **双击** `一键出片.bat`:自动批量处理 `D:\boards`(可在 bat 顶部改 `BOARDS_DIR`)里的所有画板; - **拖放**:把一个画板 HTML 直接拖到 `一键出片.bat` 图标上松手,只处理那一个; - 处理完窗口会停住显示结果,按任意键关闭;成片在 `outputs` 文件夹。 - 想改输出位置:记事本打开 bat,把顶部 `OUTPUT_DIR` 改成你的目录(留空则输出到 `outputs`)。 > 如果双击后提示找不到画板:默认会去 `D:\boards` 找。把画板放进 `D:\boards`, > 或者把画板 HTML **拖到** `一键出片.bat` 图标上松手,即可处理单个画板; > 也可以改 bat 顶部的 `BOARDS_DIR` 指向你的画板文件夹。 脚本会自动从画板解析:8 个镜头、产品描述、每段时长、参考图(缩略图/人物图), 然后自动执行出图 → 出视频 → 生成音乐 → 剪辑成片,输出到脚本目录的 `outputs/`。 中途中断也没关系,重新运行同一命令会跳过已完成步骤继续跑。 **图片画板**:支持 PNG/JPG/WebP/BMP 格式的整张画板截图或产品参考图。 脚本会用本机 Ollama 视觉模型(qwen2.5vl)识别画板里的镜头和产品描述; 识别成功就按画板镜头出片,识别失败(或只是产品图)则自动套用通用 8 镜头模板, 把图片当作产品参考图使用。图片文件名不好看时(如 ref01.png), 会自动用识别出的产品名来命名成片。 ### 片段失败自动重试 - 每个视频片段最多尝试 3 次:第 1 次用原提示词;失败后自动简化提示词再试第 2 次; 仍失败则用通用兜底提示词试第 3 次; - 3 次都失败会自动放弃该镜头(不阻塞其他镜头),剩余成功片段仍会用 OpenMontage 正常剪辑出片,成片时长等于成功片段之和(可能不足 20 秒),日志会列出被跳过的镜头; - 想重新尝试被放弃的镜头:删除对应片段后重跑,或加 `--force` 强制全部重跑。 ### 选择成片位置 ```powershell # 命令行指定输出目录(覆盖配置里的 output_dir) python batch_video_pipeline.py "D:/boards/*.html" --output-dir "D:/成品视频" # 或设置环境变量 $env:OUTPUT_DIR = "D:/成品视频" ``` 双击 bat 时,用记事本打开 `一键出片.bat`,把顶部 `OUTPUT_DIR` 改成你的目录即可。 **什么都没配置时**:运行到成片步骤前,脚本会弹出文件夹选择窗口让你挑一个目录; 点「取消」或不想用图形窗口时,会继续在命令行提示「成片输出目录(直接回车用默认 outputs)」,输入路径回车即可,直接回车就用脚本同级 `outputs` 文件夹。 (`--output-dir`、环境变量 `OUTPUT_DIR`、配置文件里的 `output_dir` 任一已设置时不再询问。) 每次运行时的输入顺序固定为两步:**① 先设置成片输出目录(选/输入路径,回车用默认) → ② 再输入 API Key**。如果 key 已通过环境变量或 `.env` 提供,第②步会自动跳过。 ### 算力统计 每个任务跑完(或中途失败)都会显示本次消耗的算力明细,例如: ```text [产品名] 本次消耗算力: 1.238(图片 0.0462 + 视频 0.5635 + 音乐 0.6283) ``` 全部任务结束后会汇总「本次运行共消耗算力」,并自动查询显示当前余额。 ### 高级用法(可选) 需要更精细控制时(自定义产品描述、时间轴、复用同一首音乐、指定输出目录), 用 `jobs.json`(可先 `--scan-storyboards` 生成骨架再手动编辑): ```powershell python batch_video_pipeline.py --scan-storyboards "D:/boards/*.html" --write-config jobs.json python batch_video_pipeline.py --config jobs.json python batch_video_pipeline.py --config jobs.json --jobs 包A,包B # 只跑指定任务 python batch_video_pipeline.py --config jobs.json --steps images,clips # 只跑部分步骤 python batch_video_pipeline.py --config jobs.json --force # 强制全部重跑 python batch_video_pipeline.py --config jobs.json --dry-run # 只检查计划,不花钱 ``` `--dry-run` 同样可以直接跟故事板路径使用,用来先看解析结果: ```powershell python batch_video_pipeline.py "D:/boards/我的包包_分镜画板.html" --dry-run ``` ## jobs.json 配置说明 ### global(所有任务共享的默认值,均可被单个任务覆盖) | 字段 | 默认 | 说明 | |---|---|---| | `aspect_ratio` | `16:9` | 视频画幅 | | `clip_duration` | `4` | 每个镜头的视频生成秒数(omni-flash 4 秒档) | | `image_size` | `1920x1088` | 静帧尺寸(16:9) | | `image_quality` | `high` | GPT Image2 画质 | | `target_resolution` | `1920x1080` | 成片分辨率 | | `target_fps` | `25` | 成片帧率 | | `in_point` | `0.8` | 每段剪辑从片段第几秒开始取(4 秒片段会自动防溢出) | | `output_dir` | 脚本目录/outputs | 成片输出目录 | | `work_dir` | 脚本目录/work | 中间文件目录(每个任务一个子目录) | ### jobs 数组(每个元素是一个视频任务) | 字段 | 必填 | 说明 | |---|---|---| | `id` | 是 | 任务唯一标识(用于断点续跑和 --jobs 过滤) | | `title` | 是 | 产品名,用于默认输出文件名 | | `storyboard_html` | 二选一 | 画板 HTML 路径(会自动解析 8 个镜头、内嵌参考图、时间轴) | | `shots` | 二选一 | 手写镜头数组(不用 HTML 时) | | `reference_dir` | 否 | 参考图文件夹(无 HTML 时兜底) | | `product_desc` | 强烈建议 | 一句话产品锁定描述,自动拼进所有提示词 | | `product_anchor` | 否 | 产品参考图路径(默认取第一镜头缩略图) | | `character_ref` | 否 | 人物参考图路径(默认取画板内嵌第一张人物图) | | `output_filename` | 否 | 成片文件名,默认 `