# 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` | 否 | 成片文件名,默认 `-亚马逊宣传视频-16x9-20s.mp4` | | `openmontage_project` | 否 | OpenMontage 项目目录名,默认由 id 生成 | | `timeline` | 否 | 每段时长数组(秒),默认从画板时间轴徽标解析;合计建议 20 秒 | | `in_point` | 否 | 本任务取片段起始秒 | | `music` | 否 | 音乐来源,见下方「音乐来源」 | | `grade` | 否 | 调色,`warm`(默认)或 `none` | | `enhance_prompt` | 否 | `true` 时 omni-flash 自动把中文提示词润色成英文 | ### 音乐来源(job.music) | 配置 | 说明 | |---|---| | `"provider": "platform"`(默认) | 用 AI大模型聚合平台的 `suno-v4.5` 生成纯音乐,无需额外 key | | `"provider": "openmontage"` | 用 OpenMontage 生成:优先 `suno_music`,回退 `music_gen`;需要在 `OpenMontage/.env` 填好 `SUNO_API_KEY` 或 `ELEVENLABS_API_KEY` | | `"provider": "openmontage", "tool": "pixabay_music"` | 用 OpenMontage 的免费 Pixabay 曲库(无需 key,现成配乐) | | `"reuse": "路径.mp3"` | 直接复用本地音乐文件 | 示例(OpenMontage 生成): ```json "music": { "provider": "openmontage", "tool": "suno_music", "prompt": "Warm cozy autumn commercial background music, soft piano and strings, instrumental, no vocals", "model": "V4_5" } ``` ### 手写 shots 示例(不用 HTML 时) ```json "shots": [ { "id": "shot01", "duration": 2.0, "image_prompt": "电影级英雄产品镜头:产品居中,暖米灰影棚,浅景深……", "video_prompt": "Single continuous shot, no cuts: slow push-in on the product……", "image_refs": ["C:/refs/product.jpg"] } ] ``` 如果省略 `image_prompt` / `video_prompt`,脚本会根据画板镜头描述自动生成。 ## 产出与续跑 - 每个任务在 `work/<id>/` 下保存 `report.json`(静帧/片段/音乐的 task_id、路径、费用),以及 `stills/`、`music/`。 - 视频片段保存在 `OpenMontage/projects/<openmontage_project>/assets/video/shotXX.mp4`,剪辑中间产物在 `renders/`。 - 默认会跳过已完成的步骤;某一步失败后重新运行脚本即可接着跑(失败的任务会自动重新提交)。 ## 常见问题 - **算力余额不足**:`python batch_video_pipeline.py --balance` 查询,到 https://mu.lk666.ai 充值。 - **提示找不到画板 / 任务配置**:直接运行脚本但没传画板路径时会这样。把画板拖到 `一键出片.bat` 上,或运行 `python batch_video_pipeline.py "画板路径.html"`。 - **不想每次输入 API Key**:把 key 写进环境变量 `API_KEY`,或用 `.env` 文件。 - **提示词如何更准**:在 jobs.json 里写好 `product_desc`(颜色/材质/结构/五金),一致性会明显更好。 - **某个镜头不好**:把该镜头静帧或片段删掉(或加 `--force`)重跑,脚本只重生成缺失的素材。 - **Windows 中文乱码**:PowerShell 里先执行 `chcp 65001`,或把输出重定向到文件查看。