# 创建视频

<a id="video-generation"></a>

<a id="视频生成"></a>

## 视频生成

`POST /v1/videos`

视频生成是异步任务。创建后立即返回 `queued`，轮询状态，完成后读取 URL 或下载内容。

 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
 `model` | `string` | 是 | 视频模型 ID。 |
 `prompt` | `string` | 文生视频必填 | 描述视频内容、动作、镜头和风格。 |
 `seconds / duration` | `string \| number` | 是 | 生成时长；duration 是兼容别名，必须是模型支持的时长。 |
 `size` | `string` | 否 | WIDTHxHEIGHT；短边决定分辨率档位，同时决定比例。 |
 `aspect_ratio` | `string` | 否 | 也可直接传比例，例如 16:9、9:16；size 优先映射。 |
 `resolution` | `string` | 否 | 也可直接传 720p、1080p 等模型支持的档位。 |
 `reference_mode` | `string` | 否 | asset=普通参考图；frame=首尾帧。字段本身也会触发自动识别。 |
 `reference_images` | `string[] \| file[]` | 否 | 普通参考图；JSON 用 URL、Data URI 或原始 Base64，multipart 可重复字段。 |
 `start_frame / end_frame` | `string \| file` | 否 | 首尾帧；end\_frame 必须搭配 start\_frame，且不能与普通参考图混用。 |
 `reference_videos` | `string[] \| file[]` | 否 | 参考视频；数量和格式以模型公开能力为准。 |
 `audio_reference(s)` | `string \| string[] \| file[]` | 否 | 参考音频；必须搭配模型支持的普通图像或视频参考。 |
 `audio` | `boolean` | 否 | 控制输出音轨；仅对支持该能力的模型生效。 |
 `response_format` | `string` | 否 | 仅支持 url；完成态返回公开临时 URL 和 expires\_at。 |

 **视频生成**  `POST /v1/videos · 创建 · 轮询 · 下载`

```bash
curl https://y.junlistudio.com/v1/videos \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2.5",
    "prompt": "a paper boat sailing down a rainy street, cinematic",
    "seconds": "4",
    "size": "1120x480",
    "response_format": "url"
  }'

# 轮询状态，完成后读取 url
curl https://y.junlistudio.com/v1/videos/<VIDEO_ID> \
  -H "Authorization: Bearer YOUR_API_KEY"
curl '<RETURNED_URL>' -o output.mp4
```

```python
import time
import requests

base = "https://y.junlistudio.com/v1"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
job = requests.post(f"{base}/videos", headers=headers, json={
    "model": "seedance-2.5",
    "prompt": "a paper boat sailing down a rainy street",
    "seconds": "4",
    "size": "1120x480",
    "response_format": "url",
}).json()

while True:
    status = requests.get(f"{base}/videos/{job['id']}", headers=headers).json()
    if status["status"] in ("completed", "failed"):
        break
    time.sleep(5)

if status["status"] == "completed":
    open("output.mp4", "wb").write(requests.get(status["url"]).content)
```
