# 生成音乐视频
> 把音频合成为带可视画面的视频文件，异步任务
> 结果在 `data.result.videoUrl`
> 与「音乐视频渲染」（Flow Music）是两个不同接口
`POST /v1/music/generations/generateMp4`
## 认证
- `Authorization` (string / 必填) — 所有接口均使用 Bearer Token 进行认证。 获取 API Key：[访问控制台](https://api.oairoute.com/keys) 创建。 请求时在请求头中添加： ```http Authorization: Bearer YOUR_OAIRoute_KEY ```
## 请求参数
- `model` (string / 可选) — 音频模型，默认 `suno`，当前传 `suno`。
- `task_id` (string / 必填) — 产出源音轨那次任务的 task_id。缺失或无法解析源时返回 400。
- `audio_index` (integer / 可选) — 引用源任务结果 `data.result.music[]` 中的第几首，默认 `1`，从 1 开始。一次生成通常 2 首。
> **Note:** 
> 本端点没有版本参数，不要传 `version`。
## 响应
- `code` (integer) — 响应状态码。
- `data[].status` (string) — 任务状态，提交成功后为 `submitted`。
- `data[].task_id` (string) — 任务唯一标识，用于轮询获取结果。
## 取结果
轮询 `GET /v1/music/tasks/{task_id}`。
- `data.result.videoUrl` (string) — 视频地址，完成后优先读取这个字段。
- `result.videos` (array) — 兼容历史返回格式。
- `result.music[].video_url` (string) — 兼容历史返回格式。
> **Note:** 
> 返回结构有三套写法。新任务读 `data.result.videoUrl`；老任务的数据在 `result.videos[]` 或 `result.music[].video_url` 里。接的时候按这三处依次兜底。
## 视频里有什么
生成的是「配了可视画面」的音乐视频，画面通常随音乐节奏变化，形态接近可视化音频或动态封面，不是叙事性的 MV。
需要叙事性内容，应该用视频生成接口自己出片，再用剪辑工具配上音频。
## 计费与产出
按次计费，与音频生成分开结算。产出的视频文件通常比音频大一个数量级，注意存储成本。
> **Note:** 
> 视频地址可能有有效期，拿到后尽快转存。不要把它当作长期存储地址直接嵌在前端页面里。
## 错误码
错误响应的格式、状态码与重试建议见[错误码与限流](../../../support/errors.html)，常见报错的排查步骤见[常见问题](../../../support/faq.html)。
## 使用示例
提交一个任务并拿到 `task_id`：
> **Note:** 
> 提交成功只表示任务已受理。真正的产物要拿返回的 `task_id` 去任务查询接口轮询，`status` 变成 `completed` 之后才有结果。
**生成音乐视频{Generate music video}::cURL**
```
curl -X POST https://api.oairoute.com/v1/music/generations/generateMp4 \
  -H 'Authorization: Bearer YOUR_OAIRoute_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
    "model": "suno",
    "task_id": "task_01K8SGYNNNVBQTXNR4MM964S7K",
    "audio_index": 1
  }'
```
**生成音乐视频{Generate music video}::Python**
```
import requests
res = requests.post(
    "https://api.oairoute.com/v1/music/generations/generateMp4",
    headers={
        "Authorization": "Bearer YOUR_OAIRoute_KEY",
        "Content-Type": "application/json",
    },
    json={
        "model": "suno",
        "task_id": "task_01K8SGYNNNVBQTXNR4MM964S7K",
        "audio_index": 1,
    },
)
print(res.json()["data"][0]["task_id"])
```
**生成音乐视频{Generate music video}::JavaScript**
```
const url = "https://api.oairoute.com/v1/music/generations/generateMp4";
const options = {
  method: "POST",
  headers: {
    "Authorization": "Bearer YOUR_OAIRoute_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "model": "suno",
    "task_id": "task_01K8SGYNNNVBQTXNR4MM964S7K",
    "audio_index": 1
  }),
};
fetch(url, options)
  .then((res) => res.json())
  .then((json) => console.log(json))
  .catch((err) => console.error(err));
```
**200 生成音乐视频{Generate music video}**
```
{
  "code": 200,
  "data": [
    { "status": "submitted", "task_id": "task_01K8E55M0HP1GJWBJYZMKX1XS1" }
  ]
}
```
