# ComfyUI 图生视频：从单帧到动态

本文用于 **综合预览**：同一篇 Markdown 里嵌套文本、表格、Python、JSON、图片、视频、内外链接等，方便检查站点在「混合内容」下的排版与媒体表现。

> **一句话**：图生视频（Image-to-Video / I2V）以一张（或一组）静态图为条件，生成时间连贯的短视频；ComfyUI 则用节点图把模型、采样、编码解码串起来。

---

## 1. 概念速览

### 1.1 和文生视频的关系

| 模式 | 条件输入 | 典型用途 | 可控性 |
|------|----------|----------|--------|
| 文生视频 T2V | 文本提示词 | 从零创作镜头 | 语义灵活，画面易跑偏 |
| **图生视频 I2V** | 首帧/关键帧图 + 可选文本 | 让已有角色/场景动起来 | 外观更稳，动作靠模型与参数 |
| 视频续写 / 插帧 | 已有视频片段 | 延长、补帧、升格 | 依赖时序模型 |

### 1.2 常见管线角色

1. **条件编码器**：把图像（及文本）编成 latent / embedding  
2. **时序扩散 / DiT 等**：在时间维上生成或细化视频 latent  
3. **VAE 解码**：latent → 像素帧序列  
4. **（可选）上采样 / 插帧 / 音频**：后处理成成片  

更系统的媒体侧背景可参考站内：[AI生成式媒体_图像视频音频_认知手册](/量子/ai生成式媒体_图像视频音频_认知手册/)。

---

## 2. 输入输出约定（示意）

### 2.1 推荐输入

- **分辨率**：尽量贴合模型训练分辨率（如 512 / 768 / 1024 一侧对齐）  
- **画幅**：固定比例（16:9、9:16、1:1），避免半路改画幅导致裁切乱跳  
- **内容**：主体清晰、背景不过分杂乱；极端透视或大量小字容易糊  

### 2.2 输出常见参数

| 参数 | 含义 | 实践提示 |
|------|------|----------|
| `frames` / `num_frames` | 总帧数 | 与时长、`fps` 联动：`时长 ≈ 帧数 / fps` |
| `fps` | 帧率 | 8–24 常见；过低顿挫，过高算力暴涨 |
| `motion_bucket` / `motion_scale` | 运动强度 | 过大易糊、结构崩；过小几乎静帧 |
| `seed` | 随机种子 | 固定种子便于 A/B 对比提示词与步数 |
| `steps` / `cfg` | 采样步数与引导 | 步数↑更稳更慢；CFG 过高易过曝纹理 |

---

## 3. 代码示例：Python 侧组装任务描述

下面不是某一固定 ComfyUI 节点的官方 API，而是 **任务描述 JSON 的构造示例**，方便和自动化脚本对接。

```python
from __future__ import annotations

import json
from dataclasses import asdict, dataclass
from pathlib import Path
from typing import Any


@dataclass
class I2VJob:
    """图生视频任务描述（示意）"""

    image_path: str
    prompt: str
    negative_prompt: str = "blurry, low quality, watermark, text"
    width: int = 768
    height: int = 432
    num_frames: int = 49
    fps: int = 12
    steps: int = 25
    cfg: float = 6.5
    seed: int = 42
    motion_scale: float = 1.0

    def duration_sec(self) -> float:
        return self.num_frames / max(self.fps, 1)

    def to_workflow_payload(self) -> dict[str, Any]:
        return {
            "task": "image_to_video",
            "engine": "comfyui",
            "inputs": {
                "image": self.image_path,
                "prompt": self.prompt,
                "negative_prompt": self.negative_prompt,
            },
            "video": {
                "width": self.width,
                "height": self.height,
                "num_frames": self.num_frames,
                "fps": self.fps,
                "motion_scale": self.motion_scale,
            },
            "sample": {
                "steps": self.steps,
                "cfg": self.cfg,
                "seed": self.seed,
            },
            "meta": {
                "duration_sec": round(self.duration_sec(), 3),
                "notes": "示例 payload，具体字段需映射到实际节点",
            },
        }


def save_payload(job: I2VJob, out: Path) -> None:
    payload = job.to_workflow_payload()
    out.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
    print(f"written: {out}  (~{payload['meta']['duration_sec']}s)")


if __name__ == "__main__":
    job = I2VJob(
        image_path="/files/image/1.jpg",
        prompt="slow camera push-in, soft wind, cinematic lighting, high detail",
        num_frames=36,
        fps=12,
        seed=20260729,
    )
    save_payload(job, Path("i2v_job.json"))
```

---

## 4. JSON 示例：任务 payload

与上一节 Python 输出结构对应的示例：

```json
{
  "task": "image_to_video",
  "engine": "comfyui",
  "inputs": {
    "image": "/files/image/1.jpg",
    "prompt": "slow camera push-in, soft wind, cinematic lighting, high detail",
    "negative_prompt": "blurry, low quality, watermark, text"
  },
  "video": {
    "width": 768,
    "height": 432,
    "num_frames": 36,
    "fps": 12,
    "motion_scale": 1.0
  },
  "sample": {
    "steps": 25,
    "cfg": 6.5,
    "seed": 20260729
  },
  "meta": {
    "duration_sec": 3.0,
    "notes": "示例 payload，具体字段需映射到实际节点"
  }
}
```

也可对照站内其它 JSON 样例：[notes/data.json](/f/notes/data.json)。

---

## 5. 媒体嵌入：图片

下面用站内已有图片（同步到 `public/files`），检查 **正文内嵌图** 是否居中、是否撑破中间栏。

![示例静帧 1](/files/image/1.jpg)

第二张（PNG）：

![示例静帧 2](/files/image/2.png)

第三张：

![示例静帧 3](/files/image/3.png)

单独全页预览（侧栏打开资源页）也可点：

- [1.jpg 全页预览](/f/image/1.jpg/)  
- [2.png 全页预览](/f/image/2.png/)  

---

## 6. 媒体嵌入：视频

图生视频的结果形态就是视频。下面用站内样例 mp4 检查 **HTML5 video** 在文档中的表现（`controls` + `preload=metadata`）。

### 6.1 样例 A

<video controls preload="metadata" style="max-width:100%;height:auto;border-radius:8px">
  <source src="/files/video/The_River_Wears_the_Sun.mp4" type="video/mp4" />
  你的浏览器不支持 video 标签；可直接打开
  <a href="/files/video/The_River_Wears_the_Sun.mp4">The_River_Wears_the_Sun.mp4</a>
</video>

- 全页预览：[The_River_Wears_the_Sun.mp4](/f/video/The_River_Wears_the_Sun.mp4/)

### 6.2 样例 B（中文文件名）

<video controls preload="metadata" style="max-width:100%;height:auto;border-radius:8px">
  <source src="/files/video/赤坂のカーブ.mp4" type="video/mp4" />
  你的浏览器不支持 video 标签；可直接打开
  <a href="/files/video/赤坂のカーブ.mp4">赤坂のカーブ.mp4</a>
</video>

- 全页预览：[赤坂のカーブ.mp4](/f/video/赤坂のカーブ.mp4/)  
- 相关音频（对照多媒体路由）：[赤坂のカーブ.mp3](/f/audio/赤坂のカーブ.mp3/)

---

## 7. ComfyUI 工作流心智模型（文字）

```
┌─────────────┐     ┌──────────────┐     ┌─────────────┐
│ Load Image  │────▶│ Encode / Cond│────▶│  I2V Model  │
└─────────────┘     └──────────────┘     └──────┬──────┘
                                                │ latent frames
                       ┌──────────────┐         ▼
                       │ Text Encode │◀── optional
                       └──────────────┘
                                                │
                                                ▼
                                         ┌─────────────┐
                                         │ VAE Decode  │
                                         └──────┬──────┘
                                                │
                                                ▼
                                         ┌─────────────┐
                                         │ Save Video  │
                                         └─────────────┘
```

实践建议（检查列表）：

- [ ] 模型与 VAE 版本匹配，避免色偏/条纹  
- [ ] 首帧图颜色空间与预处理一致（是否自动 resize）  
- [ ] 显存不够时：降分辨率、减帧、开 tiling / sequential offload  
- [ ] 成片后人工扫：脸崩、肢体抖动、背景闪烁  

---

## 8. 提示词写法（简表）

| 目标 | 可写方向 | 少写 |
|------|----------|------|
| 镜头 | slow pan, gentle zoom-in, tracking shot | 突然 360 环绕（易崩） |
| 运动 | hair lightly moving, fabric flutter, idle breath | 剧烈打斗、复杂多人交互 |
| 画质 | cinematic lighting, sharp subject, natural motion | 堆砌 50 个画质词 |
| 稳定 | consistent character, same outfit | 要求「完全换装」同时大动作 |

**英文示例（可直接试）：**

`soft daylight, subtle camera drift left, leaves gently moving, shallow depth of field, natural skin texture`

**中文思路：** 先写「镜头怎么动」→「主体做什么小动作」→「光与质感」→「要避免什么」放进 negative。

---

## 9. 链接区（站内 + 站外）

### 9.1 站内

| 链接 | 说明 |
|------|------|
| [主页](/) | 入口 |
| [guides/example](/guides/example/) | 普通 md 样例 |
| [script/game_ui_design.py](/f/script/game_ui_design.py/) | 代码资源页 |
| [notes/sample.pdf](/f/notes/sample.pdf/) | PDF 内嵌预览 |

### 9.2 站外参考（概念资料）

- [ComfyUI 官方仓库](https://github.com/comfyanonymous/ComfyUI)  
- [Stable Video Diffusion 介绍（Stability）](https://stability.ai/news/stable-video-diffusion-open-ai-video-model)  
- [Diátaxis：How-to guides](https://diataxis.fr/how-to-guides/)  

---

## 10. 排版自检清单（给本站用）

用本页滚动检查：

1. **大纲**是否出现本节各级标题（含 h1/h2/h3）  
2. **宽表**是否在中间栏内铺开或可横向滚动  
3. **代码块** Python / JSON 是否高亮且不溢出  
4. **多图**是否居中、间距是否舒适  
5. **视频**是否可播放、宽度是否跟中间栏  
6. **内外链接**是否可点；底栏 **上一页 / 下一页** 是否仍贴底  

---

## 11. 小结

- **图生视频** = 以图锁定外观 + 以模型/参数控制运动与镜头  
- **ComfyUI** = 节点化编排上述管线，便于换模型、插后处理  
- 本页刻意堆了 **文本 · 表格 · Python · JSON · 图片 · 视频 · 链接**，作为混合内容回归样例；真正跑通节点时，以你本机安装的 I2V 工作流与模型卡为准  

如需下一篇可写：**「ComfyUI I2V 节点对照表」** 或 **「常见花屏 / 闪烁排查」**。
