> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apipod.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Muse Video 图生视频

> Muse Video 图生视频以必填首帧加可选尾帧实现首帧 / 首尾帧生成，输出 5-60 秒 720P 带原生音频的视频。

`muse-video-i2v` 让一张静态图动起来。传一张图，它就是首帧；传两张图，Muse Video 会在首帧到尾帧之间插值出一段镜头，让你精确控制运动从哪里开始、在哪里结束。

## 模型速览

| | |
| - | - |
| 公开模型 ID | `muse-video-i2v` |
| 输入 | 文本 + 图片（1-2 张） |
| 输出 | 带音频的视频 |
| 时长 | 5 / 10 / 20 / 30 / 40 / 50 / 60 秒（默认 5） |
| 清晰度 | 720p |
| 画幅 | `16:9`、`9:16`、`1:1`、`4:3`、`3:4`（默认 `16:9`） |
| 计费 | 按输出秒数 |

## 参数

| 参数 | 类型 | 默认值 | 说明 |
| - | - | - | - |
| `prompt` | string | — | 必填，最多 4000 个字符。描述运动，不要描述画面内容。 |
| `first_frame_image` | string | — | 必填。首帧的公网 URL。 |
| `image_urls` | string\[] | — | 可选。传第二个 URL 即作为尾帧。 |
| `duration` | integer | `5` | 只能是 5、10、20、30、40、50、60。 |
| `aspect_ratio` | string | `16:9` | 输出画幅，不必与源图一致。 |
| `resolution` | string | `720p` | 目前仅支持 720p。 |
| `style_preset` | string | `none` | 与文生视频相同的七档预设。 |
| `generate_audio` | boolean | `true` | 设为 `false` 可静音人声。 |

通过 `reference_images` 传图在这里会被拒绝——那个别名属于 [`muse-video-r2v`](./muse-video-r2v)，它把每张图都当主体参考而不是关键帧。

## 只传首帧 vs 首尾帧

| 你传的 | 上游模式 | 效果 |
| - | - | - |
| 1 张图 | `first-frame` | 画面从静帧自然延续出运动。 |
| 2 张图 | `first-last` | 从首帧到第二张图的受控转场。 |

需要精确落在某个构图上时，首尾帧是最可靠的做法。提示词里描述**过程**即可，两个端点模型已经知道了。

```
镜头穿过飘动的雾气缓缓推向灯塔，光束扫过画面，冷调蓝调时刻
```

## 调用流程

1. 带 `first_frame_image`（可选在 `image_urls` 里再传一项）调用 `POST /v1/videos/generations`。
2. 取 `data.task_id`。
3. 轮询 `GET /v1/videos/status/{task_id}` 直到 `completed`。
4. 从 `data.result` 下载。

```bash theme={null}
curl https://api.apipod.ai/v1/videos/generations \
  -H "Authorization: Bearer $APIPOD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "muse-video-i2v",
    "prompt": "镜头穿过飘动的雾气缓缓推向灯塔",
    "first_frame_image": "https://cdn.example.com/lighthouse.jpg",
    "duration": 5,
    "aspect_ratio": "16:9"
  }'
```

## 图片要求

* 使用可直接访问的公网 HTTPS 地址。会过期的签名链接、开了防盗链的域名、需要登录才能打开的地址都会在提交阶段失败。
* 人像、商品、风景都可以；首帧里的主体不要被遮挡。
* 真人照片尽量用光线充足的中远景——极近特写能给模型发挥的空间很小。

## 费用

按输出秒计费，且与参考生视频不同，这里的关键帧**不计入费用**：`时长 × 每秒单价`。


## OpenAPI

````yaml api-reference/openapi/muse-video--muse-video-i2v.zh.yaml POST /v1/videos/generations
openapi: 3.1.0
info:
  title: MU Video 图生视频 API
  version: 1.0.0
  description: >-
    MU Video 图生视频以必填首帧加可选尾帧实现首帧 / 首尾帧生成，支持 5-60 秒 720P
    输出、五种画幅、七档风格预设，并原生生成人声与音效。在 APIPod 中，公开模型 ID 为 muse-video-i2v。
servers:
  - url: https://api.apipod.ai
    description: 生产环境
security: []
paths:
  /v1/videos/generations:
    post:
      tags:
        - MU Video 图生视频
      summary: 创建生成任务
      description: >-
        MU Video 图生视频以必填首帧加可选尾帧实现首帧 / 首尾帧生成，支持 5-60 秒 720P
        输出、五种画幅、七档风格预设，并原生生成人声与音效。在 APIPod 中，公开模型 ID 为 muse-video-i2v。
      operationId: create-muse-video-muse-video-i2v
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              title: MU Video 图生视频
              properties:
                model:
                  type: string
                  title: 模型 ID
                  description: APIPod 公开模型 ID。
                  const: muse-video-i2v
                prompt:
                  type: string
                  title: 提示词
                  description: 视频内容描述，必填，最多 4000 个字符。
                  minLength: 1
                  maxLength: 4000
                first_frame_image:
                  type: string
                  title: 首帧图片
                  description: 必填。首帧图片的公网 URL。在 image_urls 中传第二个 URL（最多两个）即可作为尾帧。
                duration:
                  type: integer
                  title: 时长
                  description: 视频时长（秒）。
                  enum:
                    - 5
                    - 10
                    - 20
                    - 30
                    - 40
                    - 50
                    - 60
                  default: 5
                aspect_ratio:
                  type: string
                  title: 画幅
                  description: 生成视频的画幅比例。
                  enum:
                    - '16:9'
                    - '9:16'
                    - '1:1'
                    - '4:3'
                    - '3:4'
                  default: '16:9'
                resolution:
                  type: string
                  title: 清晰度
                  description: 输出清晰度。MU Video 目前仅支持 720p。
                  enum:
                    - 720p
                  default: 720p
                style_preset:
                  type: string
                  title: 风格预设
                  description: 视频风格预设。
                  enum:
                    - none
                    - cinematic_realistic
                    - 2d_anime
                    - 3d_xianxia
                    - american_comic
                    - cyberpunk_neon
                    - ecommerce_ugc
                  default: none
                generate_audio:
                  type: boolean
                  title: 生成声音
                  description: 是否生成人声与音效。设为 false 即静音人声。
                  default: true
              required:
                - model
                - prompt
                - first_frame_image
            example:
              model: muse-video-i2v
              prompt: A corgi surfing at sunset, cinematic, slow motion
              duration: 10
              aspect_ratio: '16:9'
              style_preset: cinematic_realistic
              generate_audio: true
      responses:
        '200':
          description: 任务已受理
          content:
            application/json:
              schema:
                type: object
                title: 任务提交响应
                description: 任务提交标准响应
                properties:
                  code:
                    type: integer
                  data:
                    type: object
                    title: 任务提交数据
                    description: 任务提交数据体
                    properties:
                      task_id:
                        type: string
                        description: 生成任务 ID
                  message:
                    type: string
                required:
                  - code
                  - message
                  - data
              example:
                code: 200
                message: success
                data:
                  task_id: vid_task_01JEXAMPLE
      security:
        - bearerAuth: []
      x-codeSamples:
        - lang: Shell
          label: cURL
          source: |-
            curl https://api.apipod.ai/v1/videos/generations \
              -H "Authorization: Bearer $APIPOD_API_KEY" \
              -H "Content-Type: application/json" \
              -d '{
              "model": "muse-video-i2v",
              "prompt": "A corgi surfing at sunset, cinematic, slow motion",
              "first_frame_image": "https://cdn.example.com/first-frame.jpg",
              "duration": 10,
              "aspect_ratio": "16:9",
              "style_preset": "cinematic_realistic",
              "generate_audio": true
            }'
        - lang: Python
          label: Python
          source: |-
            import os
            import requests

            payload = {
              "model": "muse-video-i2v",
              "prompt": "A corgi surfing at sunset, cinematic, slow motion",
              "first_frame_image": "https://cdn.example.com/first-frame.jpg",
              "duration": 10,
              "aspect_ratio": "16:9",
              "style_preset": "cinematic_realistic",
              "generate_audio": True
            }

            response = requests.post(
                "https://api.apipod.ai/v1/videos/generations",
                headers={
                    "Authorization": f"Bearer {os.environ['APIPOD_API_KEY']}",
                    "Content-Type": "application/json",
                },
                json=payload,
                timeout=60,
            )
            response.raise_for_status()
            print(response.json())
        - lang: Go
          label: Go
          source: |-
            package main

            import (
                "bytes"
                "encoding/json"
                "fmt"
                "net/http"
                "os"
            )

            func main() {
                payload := map[string]any{}
                if err := json.Unmarshal([]byte(`{
              "model": "muse-video-i2v",
              "prompt": "A corgi surfing at sunset, cinematic, slow motion",
              "first_frame_image": "https://cdn.example.com/first-frame.jpg",
              "duration": 10,
              "aspect_ratio": "16:9",
              "style_preset": "cinematic_realistic",
              "generate_audio": true
            }`), &payload); err != nil {
                    panic(err)
                }
                body, err := json.Marshal(payload)
                if err != nil {
                    panic(err)
                }

                req, err := http.NewRequest(http.MethodPost, "https://api.apipod.ai/v1/videos/generations", bytes.NewReader(body))
                if err != nil {
                    panic(err)
                }
                req.Header.Set("Authorization", "Bearer "+os.Getenv("APIPOD_API_KEY"))
                req.Header.Set("Content-Type", "application/json")

                resp, err := http.DefaultClient.Do(req)
                if err != nil {
                    panic(err)
                }
                defer resp.Body.Close()
                fmt.Println(resp.Status)
            }
        - lang: Rust
          label: Rust
          source: |-
            use reqwest::Client;
            use serde_json::json;
            use std::env;

            #[tokio::main]
            async fn main() -> Result<(), Box<dyn std::error::Error>> {
                let payload = json!({
              "model": "muse-video-i2v",
              "prompt": "A corgi surfing at sunset, cinematic, slow motion",
              "first_frame_image": "https://cdn.example.com/first-frame.jpg",
              "duration": 10,
              "aspect_ratio": "16:9",
              "style_preset": "cinematic_realistic",
              "generate_audio": true
            });
                let response = Client::new()
                    .post("https://api.apipod.ai/v1/videos/generations")
                    .bearer_auth(env::var("APIPOD_API_KEY")?)
                    .json(&payload)
                    .send()
                    .await?
                    .error_for_status()?;

                println!("{}", response.text().await?);
                Ok(())
            }
        - lang: JavaScript
          label: JavaScript
          source: >-
            const response = await
            fetch("https://api.apipod.ai/v1/videos/generations", {
              method: "POST",
              headers: {
                Authorization: `Bearer ${process.env.APIPOD_API_KEY}`,
                "Content-Type": "application/json",
              },
              body: JSON.stringify(
              {
                "model": "muse-video-i2v",
                "prompt": "A corgi surfing at sunset, cinematic, slow motion",
                "first_frame_image": "https://cdn.example.com/first-frame.jpg",
              "first_frame_image": "https://cdn.example.com/first-frame.jpg",
                "duration": 10,
                "aspect_ratio": "16:9",
                "style_preset": "cinematic_realistic",
                "generate_audio": true
              }
              ),
            });


            if (!response.ok) {
              throw new Error(`APIPod request failed: ${response.status} ${await response.text()}`);
            }


            console.log(await response.json());
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: APIPod API key
      description: 使用 APIPod API Key 作为 Bearer token 放在 Authorization 请求头。

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.