# Unicom Longvideo

> 联通元景长视频生成服务。【仅用于生成长视频】。基于 mediaclaw，通过 3 个镜头串联生成 9-15 秒长视频，严格保证主体一致性和动作连贯性。仅在用户明确提到'长视频'时使用此技能。

- Skill: `unicomai/unicom-longvideo` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add unicomai/unicom-longvideo`
- Raw SKILL.md: https://api.skillmd.com/api/skills/unicomai/unicom-longvideo/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: MIT
- Author: UnicomAI (https://skillmd.com/u/unicomai)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/unicomai/unicom-longvideo

---


# 联通元景长视频生成服务

⚠️ **重要：仅在用户明确提到"长视频"时使用此技能。**

普通短视频生成需求请直接使用 `mediaclaw` 的工具。

基于 mediaclaw，实现 9-15 秒长视频生成，通过 3 个视频镜头串联而成，严格保证主体一致性和动作连贯性。
## LLM输出规则
- 每个镜头生成完成之后，需要输出当前镜头的保存路径，必须在路径前添加`MEDIA:`前缀，例如：`MEDIA:/path/to/video.mp4`，以便后续工具正确识别和处理。
- 尾帧提取完成之后，需要输出尾帧图片的保存路径，必须在路径前添加`MEDIA:`前缀，例如：`MEDIA:/path/to/image.jpg`，以便后续工具正确识别和处理。
## 生成策略

- **镜头1**：使用**文生视频**直接生成（`mediaclaw_text_to_video`）
- **镜头2、3**：使用**图生视频**生成（`mediaclaw_image_to_video`），以前一镜头的尾帧作为起始图片
- 对于镜头2和镜头3，在生成视频前，使用 `mediaclaw_image_qa` 工具，将**初步分镜 + 当前镜头起始图片**一起输入，让视觉模型根据图片实际内容润色分镜提示词。

这样可以避免分镜描述与图片内容不符的问题，提升视频生成质量。

## 核心设计理念

### 三镜头串联策略

为了保证视频的连贯性，必须严格遵循以下策略：

1. **主体锁定原则**：三个镜头的主体描述、场景、光影必须完全一致
2. **动作递进原则**：
   - 镜头1（起）：微小动作引入，固定镜头或极慢推镜头
   - 镜头2（承）：核心动作发生，镜头配合动作平移或跟随
   - 镜头3（合）：动作高潮或收尾，镜头拉开展示全貌或特写定格
3. **尾帧衔接原则**：使用前一个镜头的最后一帧作为下一个镜头的起始帧
4. **运镜连续性原则**：运镜必须保持方向和速度的连贯性，避免突变
5. **动作连续性原则**：动作必须从上一镜头的结束状态自然延续，避免状态突变

### 运镜连续性原则

#### 运镜方向连续性规则

| 上一镜头运镜 | 可接续的运镜 | 禁止接续的运镜 |
|-------------|-------------|---------------|
| 固定镜头 | 固定、缓慢推/拉、缓慢左移/右移 | 快速旋转、快速推拉 |
| 左移 | 继续左移、固定、缓慢推 | 快速右移、反向右移 |
| 右移 | 继续右移、固定、缓慢推 | 快速左移、反向左移 |
| 推镜头 | 继续推、固定 | 快速拉、反向运动 |
| 拉镜头 | 继续拉、固定 | 快速推、反向运动 |

#### 运镜速度连续性规则

- 镜头1：固定或极缓慢（速度等级：0-1）
- 镜头2：缓慢到中等（速度等级：1-2），不超过镜头1速度的2倍
- 镜头3：可适度加快（速度等级：1-3），不超过镜头2速度的2倍
- **严禁**：从固定/缓慢直接跳到快速旋转

#### 推荐运镜组合

| 组合名称 | 镜头1 | 镜头2 | 镜头3 | 适用场景 |
|---------|------|------|------|---------|
| 渐进式展开 | 固定 | 缓慢推 | 继续推或固定 | 细节展示 |
| 跟随式平移 | 固定 | 缓慢左移 | 继续左移或固定 | 横向运动 |
| 环绕展示 | 固定 | 缓慢环绕 | 继续环绕或固定 | 多角度展示 |

### 动作连续性原则

#### 动作状态传递机制

在生成每个镜头后，必须提取并记录以下信息：

| 状态项 | 说明 | 示例 |
|-------|------|------|
| 主体姿态 | 站立/坐下/趴着/行走/奔跑等 | 站立，前腿抬起 |
| 主体位置 | 在画面中的位置和朝向 | 画面中央，面向右侧 |
| 动作进行中 | 当前正在进行的动作及完成度 | 正在伸懒腰，已完成80% |
| 动作方向 | 移动类动作的方向 | 向右前方移动 |

#### 动作连续性规则

**规则1：姿态延续性**
- 下一镜头的起始姿态 = 上一镜头的结束姿态
- ❌ 禁止：镜头2结束站立 → 镜头3起始坐下
- ✅ 正确：镜头2结束站立 → 镜头3起始站立，继续动作

**规则2：动作递进性**
- 动作应该是一个连续的过程，而不是三个独立的动作片段

**规则3：方向一致性**
- 如果主体在移动，方向应该保持一致或自然转向
- ❌ 禁止：镜头2向左跑 → 镜头3突然向右跑

**规则4：动作完整性**
- 一个完整的动作可以跨多个镜头
- 整个长视频是一个完整的故事，三个镜头共同完成一个动作序列

#### 推荐动作组合示例

**示例1：猫咪伸懒腰**
```
镜头1：猫咪趴在沙发上，微微抬起头，眼睛慢慢睁开
       [起始：趴着] → [结束：趴着，抬头]
       
镜头2：猫咪前腿向前伸展，身体逐渐抬起，背拱起
       [起始：趴着，抬头] → [结束：站立中，前腿伸展]
       
镜头3：猫咪后腿蹬直，尾巴翘起，全身舒展完成后抖抖身体
       [起始：站立中，前腿伸展] → [结束：站立，放松]
```

**示例2：人物行走**
```
镜头1：人物站在门口，手放在门把手上，开始转动
       [起始：站立门前] → [结束：站立，手握门把]
       
镜头2：人物推开门，迈出一步，身体前倾
       [起始：站立，手握门把] → [结束：行走中]
       
镜头3：人物继续走出，转身回望，停在门外
       [起始：行走中] → [结束：站立门外]
```

#### 禁止的动作组合

| 镜头1结束状态 | 镜头2起始状态 | 问题 |
|-------------|-------------|------|
| 站立 | 坐下 | ❌ 姿态突变 |
| 向左移动 | 向右移动 | ❌ 方向突变 |
| 奔跑中 | 静止站立 | ❌ 动作不连贯 |
| 趴着 | 站立（无过渡） | ❌ 缺少站起过程 |

### 分镜提示词设计

分镜提示词格式统一为：
```
[锁定主体描述]，[锁定场景]，[锁定光影]，[动态动作描述]，[运镜描述]
```

**示例：**
- 镜头1：`一只可爱的橘猫，阳光明媚的花园，午后柔和光线，慵懒地眨了眨眼睛，固定镜头`
- 镜头2：`一只可爱的橘猫，阳光明媚的花园，午后柔和光线，慢慢地站起身子伸懒腰，镜头缓慢跟随`
- 镜头3：`一只可爱的橘猫，阳光明媚的花园，午后柔和光线，欢快地向前奔跑，镜头拉开展示全貌`

**关键：前三个部分（主体、场景、光影）在三个镜头中必须字毫不差、完全一致！运镜必须遵循连续性原则！动作必须从上一镜头结束状态自然延续！**

## 输出目录规则
所有生成结果必须写入同一个统一根目录 `{task_id}/`：
- 如果用户指定了保存目录，则根目录为 `{用户指定目录}/{task_id}/`；
- 如果用户未指定目录，则根目录为 `workspace/unicom-longvideo/{task_id}/`。

所有工具调用中传入根目录作为 `output_dir`，后续路径从根目录派生，不要依赖自由文本解析路径。

## 使用流程

### 长视频生成完整步骤

当用户要求生成长视频时，严格按照以下步骤执行：

### 步骤 1：生成初步分镜脚本

使用 LLM 生成初步分镜（如果用户提供了参考图，也可以用 `mediaclaw_image_qa` 工具，mode=storyboard）。

**初步分镜生成提示词：**

```
你是一位专业的AI视频分镜导演。请将用户的视频创意拆解为3个连贯的分镜提示词。

# 核心原则

## 1. 主体锁定原则（绝对严格）
从用户的视频创意中提取【锁定常量】，三个镜头必须完全相同：
- 锁定主体：详尽的主体描述（物种、颜色、特征、服装、材质等）
- 锁定场景：场景描述（地点、环境元素、背景细节）
- 锁定光影：光影描述（时间、光线方向、色调、天气）

## 2. 动作递进原则
- 镜头1（起）：展示初始状态，微小动作引入
- 镜头2（承）：核心动作发生，增加动作细节
- 镜头3（合）：动作的高潮或收尾

## 3. 动作连续性原则
- 每个镜头标注【起始状态】和【结束状态】
- 镜头2起始 = 镜头1结束，镜头3起始 = 镜头2结束
- 禁止姿态突变（站立→坐下、趴着→站立无过渡）
- 动作可跨镜头，一个完整动作分布在多个镜头

## 4. 运镜协调原则
- 方向连续：左移→继续左移或固定，禁止左移→右移
- 速度渐变：固定→缓慢→中等，禁止固定→快速
- 推荐：固定→缓慢推→继续推

# 分镜格式
每个分镜提示词必须严格遵循以下格式：
[锁定主体]，[锁定场景]，[锁定光影]，[动作描述]，[运镜描述]

# 输出格式（JSON）
{
  "镜头1": "分镜提示词",
  "镜头2": "分镜提示词",
  "镜头3": "分镜提示词",
  "运镜设计说明": "运镜连续性逻辑",
  "动作状态说明": "镜头1结束状态→镜头2起始继承→镜头2结束→镜头3起始继承→镜头3结束"
}

用户创意：{{用户的提示词}}
```

**如果用户提供了参考图片：**
```
使用 mediaclaw_image_qa 工具，mode=storyboard，传入参考图片和以下提示词：

"将这个视频创意拆解为3个连贯的分镜提示词。

# 核心原则（最高优先级）

## 1. 主体锁定原则（绝对严格）
你必须首先从图片和视频创意中提取出【锁定常量】，这三个部分在三个镜头中必须字毫不差、完全相同：
- 锁定主体：详尽的主体描述（物种、颜色、特征、服装、材质等）
- 锁定场景：场景描述（地点、环境元素、背景细节）
- 锁定光影：光影描述（时间、光线方向、色调、天气）

## 2. 动作递进原则
- 镜头1（起）：以展示图片初始状态为主，微小动作引入
- 镜头2（承）：核心动作发生，增加动作细节
- 镜头3（合）：动作的高潮或收尾

## 3. 运镜协调原则
- 镜头1：固定镜头或极缓慢的推镜头
- 镜头2：配合动作方向进行平移或跟随
- 镜头3：拉开展示全貌或特写定格

# 分镜提示词格式
每个分镜提示词必须严格遵循以下格式：
[锁定主体]，[锁定场景]，[锁定光影]，[动态动作描述]，[运镜描述]

# 输出格式要求
- 必须且只能输出合法的 JSON 格式数据
- JSON 键名为："镜头1"、"镜头2"、"镜头3"

用户的视频创意：{{用户的提示词}}"
```
---

### 步骤 2：生成第一个镜头（文生视频）
使用 `mediaclaw_text_to_video` 提交文生视频任务
  - prompt: 镜头1分镜提示词
  - output_dir: 输出目录
  - 从"动作状态说明"中提取镜头1的【结束状态】和【运镜状态】并记录下来

### 步骤 3：生成第二个镜头（图生视频）

**子步骤 3.1：提取镜头1尾帧**
```bash
ffmpeg -i {{视频路径}} -vf "select=eq(n\,$(($(ffprobe -v error -count_packets -select_streams v:0 -show_entries stream=nb_read_packets -of csv=p=0 {{视频路径}})-1)))" -vsync vfr -update 1 -y {{尾帧路径}}
```

**子步骤 3.2：润色镜头2分镜**
- 使用 `mediaclaw_image_qa`工具
  - image_paths: [尾帧图片路径]
  - prompt: 分镜润色提示词（见下方模板，填入镜头2原始分镜、上一镜头运镜状态和动作状态）
  - mode: general
- 将返回结果作为**镜头2最终分镜提示词**

**润色提示词模板：**
```
请根据这张图片，润色以下分镜提示词，使其更符合图片的实际内容。

【原始分镜】：{{原始分镜提示词}}

【上一镜头状态】：
- 运镜状态：{{如：固定镜头}}
- 结束姿态：{{如：趴着，抬头}}
- 动作进行中：{{如：已完成抬头动作}}

【润色要求】：
1. 仔细观察图片中的主体特征（颜色、穿着、姿态、表情等）、场景细节、光影效果
2. 主体、场景、光影部分要根据图片实际内容进行优化，使其更准确生动，但必须保持与原始分镜描述一致的锁定常量
3. **动作连续**：
   - 当前镜头起始状态 = 上一镜头结束状态
   - 禁止姿态突变（站立→坐下、趴着→站立无过渡）
4. **运镜连续**：
   - 方向一致，禁止反向
   - 速度渐变，禁止突变

【输出格式】：
第一行：润色后的分镜提示词，输出格式保持：[场景描述]，[光影描述]，[主体描述]，[动作描述]，[运镜描述]
第二行：【起始状态】：{{继承的状态}}
第三行：【结束状态】：{{当前结束状态}}
```

**子步骤 3.3：视频生成**
- 使用 `mediaclaw_image_to_video` 提交图生视频任务
  - image_path: 尾帧图片路径
  - style: 用户选择的风格（默认"通用"）
  - prompt: 镜头2最终分镜提示词（润色后的）
  - output_dir: 输出目录
  - 从"动作状态说明"中提取镜头2的【结束状态】和【运镜状态】并记录下来

### 步骤 4：生成第三个镜头（图生视频）

与步骤3相同，使用镜头2的尾帧和状态信息。

### 步骤 5：拼接视频

```bash
echo "file '{{视频1路径}}'" > concat.txt
echo "file '{{视频2路径}}'" >> concat.txt
echo "file '{{视频3路径}}'" >> concat.txt
ffmpeg -f concat -safe 0 -i concat.txt -c copy {{输出路径}}
```
告诉用户最终视频的路径。

## 分镜提示词最佳实践

### 锁定部分（三个镜头完全一致）

**主体描述**：应该足够详细，包含物种、颜色、特征、服装等
- ❌ 不好：`一只猫`
- ✅ 好：`一只橘白相间的胖胖的猫咪，戴着蓝色的项圈`

**场景描述**：包含地点、环境元素
- ❌ 不好：`在外面`
- ✅ 好：`在种满向日葵的花园里，背景是白色的木栅栏`

**光影描述**：时间、光线方向、色调
- ❌ 不好：`白天`
- ✅ 好：`夏日午后，金色阳光从右上方斜照，温暖的色调`

### 动态部分（每个镜头递进）

| 镜头 | 动作 | 运镜 | 状态 |
|-----|------|------|------|
| 镜头1（起） | 微小、初始 | 固定或极缓慢推 | 展示初始状态 |
| 镜头2（承） | 核心动作，延续镜头1 | 与镜头1连贯 | 承接并推进 |
| 镜头3（合） | 完成，延续镜头2 | 与镜头2连贯 | 动作完成 |

## 快速参考

### mediaclaw 工具使用索引

| 工具 | 用途 | 何时使用 |
|------|------|---------|
| `mediaclaw_text_to_video` | 文生视频 | 生成镜头1时使用 |
| `mediaclaw_image_qa` (mode=storyboard) | 生成初步分镜 | 有参考图时生成初步分镜脚本 |
| `mediaclaw_image_qa` (mode=general) | 润色分镜 | 镜头2、3生成前，用起始图片+初步分镜润色出最终分镜 |
| `mediaclaw_image_to_video` | 图生视频 | 生成镜头2、3时使用（使用润色后的最终分镜） |

### 状态记录模板

```
【镜头1】结束姿态：{{}} | 动作：{{}} | 运镜：{{}}
【镜头2】起始：{{继承镜头1}} → 结束：{{}} | 运镜：{{}}
【镜头3】起始：{{继承镜头2}} → 结束：{{}} | 运镜：{{}}
```

### 常见问题

- **ffmpeg不可用**：将三段视频分别提供给用户手动拼接
- **运镜不连续**：检查方向是否反转、速度是否突变
- **动作不连续**：检查姿态是否突变、状态是否正确继承
