feat(video-pipeline): 重构视频流水线,优化成片时间线规则和状态管理
- 引入 manifest.json 作为唯一状态源,所有子 Agent 操作回写 manifest - 重构 timebuilder 逻辑,支持四种视频适配策略(加速/裁剪/放缓/画面停顿) - 统一 TTS 阶段输出结构,单句和多句均写入 segments[] - 重写字幕和配音生成,基于 segments 精确时长实现音画同步 - 新增 confirm 命令支持按 id 范围确认,上传阶段分离图片和视频 - 添加中间产物写入 output/ 目录的约束,清理废弃配置参数
This commit is contained in:
@@ -9,9 +9,9 @@
|
||||
## 创建方式
|
||||
|
||||
```bash
|
||||
# Step 2-A 生成 imagePrompt 后,通过脚本初始化(不含 videoPrompt)
|
||||
# Step 2-0:分镜确认后立即初始化(imagePrompt/videoPrompt 后续补充)
|
||||
node scripts/pipeline.js init --account 军事账号 --mode single \
|
||||
--items '[{"shotDesc":"英文画面描述","script":"中文口播文案","duration":5,"imagePrompt":"English prompt","directorRef":"tarantino","keyword":"权力"}]'
|
||||
--items '[{"shotDesc":"英文画面描述","script":"中文口播文案","duration":5,"directorRef":"tarantino","keyword":"权力"}]'
|
||||
|
||||
# 或从文件读取
|
||||
node scripts/pipeline.js init --account 军事账号 --mode single --items-file ./items.json
|
||||
@@ -193,7 +193,7 @@ node scripts/pipeline.js run --manifest <path> --retry-failed
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
output/{account}_{YYYYMMDD}_{NNN}/
|
||||
output/{name}_{YYYYMMDD}_{NNN}/
|
||||
├── manifest.json # 主清单
|
||||
├── images/ # scene_{NN}_{slug}.jpeg(首尾帧加 _last,MJ 候选加 _cand{1-4})
|
||||
├── videos/ # scene_{NN}_{slug}.mp4
|
||||
@@ -206,7 +206,7 @@ slug 从 `shotDesc` 派生(slugify: 保留中文和字母数字,最多 20
|
||||
|
||||
## segments[] 字段(TTS 分句)
|
||||
|
||||
TTS 阶段自动生成。仅当 `script` 被切分为 2 句及以上时才写入。单句时不写 segments。
|
||||
TTS 阶段统一生成,单句时数组仅 1 个元素,多句时 N 个元素。assemble 阶段直接使用各 segment 的实际音频时长对齐字幕。
|
||||
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
@@ -214,4 +214,26 @@ TTS 阶段自动生成。仅当 `script` 被切分为 2 句及以上时才写入
|
||||
| `audio` | 该句音频路径(相对 manifest) |
|
||||
| `duration` | 该句音频时长(秒) |
|
||||
|
||||
`item.audio` 指向所有分段合并后的完整音频,`item.audioDuration` 为各段累计时长。assemble 阶段优先用 `segments` 的精确时长对齐字幕,无 segments 时回退到字数权重估算。
|
||||
`item.audio` 指向 `segments[0].audio`,`item.audioDuration` 为各段累计时长。assemble 阶段遍历 segments 逐一添加音频和字幕,使用实际文件时长(非比例分配),确保音频与字幕精确同步,消除留白。
|
||||
|
||||
---
|
||||
|
||||
## 成片时间线规则
|
||||
|
||||
### 图片模式(images)
|
||||
|
||||
图片没有独立时长。TTS 音频时长 = 画面时长。无 TTS 音频的 item 时长为 0(跳过,不显示)。
|
||||
|
||||
### 视频模式(videos)
|
||||
|
||||
TTS 音频为主轴,视频通过以下策略适配音频时长:
|
||||
|
||||
| ratio = videoDur/audioDur | 策略 | 说明 |
|
||||
|---------------------------|------|------|
|
||||
| 0.9 ~ 1.1 | none | 接近匹配,无需调整 |
|
||||
| > 1.1, ≤ 2 | speed_up | 加速(setpts 压缩时间) |
|
||||
| > 2 | trim | 裁剪(截断到音频时长) |
|
||||
| < 0.9, ≥ 0.5 | slow_down | 放缓(setpts 拉长时间) |
|
||||
| < 0.5 | freeze | 画面停顿(视频原速 + 最后一帧冻结补时长) |
|
||||
|
||||
所有策略失败后兜底:截断到目标时长。
|
||||
|
||||
Reference in New Issue
Block a user