视频生成
MiniMax H3
MiniMax H3 — 全模态视频生成,文生 / 图生 / 参考生三合一,原生出声,4–15 秒
POST
/
v1
/
tasks
MiniMax H3
curl --request POST \
--url https://www.qingbo.dev/v1/tasks \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"prompt": "<string>",
"resolution": "<string>",
"duration": 123,
"image_urls": [
"<string>"
],
"first_frame_image": "<string>",
"last_frame_image": "<string>",
"video_urls": [
"<string>"
],
"audio_urls": [
"<string>"
],
"callback_url": "<string>"
}
'import requests
url = "https://www.qingbo.dev/v1/tasks"
payload = {
"model": "<string>",
"prompt": "<string>",
"resolution": "<string>",
"duration": 123,
"image_urls": ["<string>"],
"first_frame_image": "<string>",
"last_frame_image": "<string>",
"video_urls": ["<string>"],
"audio_urls": ["<string>"],
"callback_url": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
model: '<string>',
prompt: '<string>',
resolution: '<string>',
duration: 123,
image_urls: ['<string>'],
first_frame_image: '<string>',
last_frame_image: '<string>',
video_urls: ['<string>'],
audio_urls: ['<string>'],
callback_url: '<string>'
})
};
fetch('https://www.qingbo.dev/v1/tasks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.qingbo.dev/v1/tasks"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"prompt\": \"<string>\",\n \"resolution\": \"<string>\",\n \"duration\": 123,\n \"image_urls\": [\n \"<string>\"\n ],\n \"first_frame_image\": \"<string>\",\n \"last_frame_image\": \"<string>\",\n \"video_urls\": [\n \"<string>\"\n ],\n \"audio_urls\": [\n \"<string>\"\n ],\n \"callback_url\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://www.qingbo.dev/v1/tasks")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"prompt\": \"<string>\",\n \"resolution\": \"<string>\",\n \"duration\": 123,\n \"image_urls\": [\n \"<string>\"\n ],\n \"first_frame_image\": \"<string>\",\n \"last_frame_image\": \"<string>\",\n \"video_urls\": [\n \"<string>\"\n ],\n \"audio_urls\": [\n \"<string>\"\n ],\n \"callback_url\": \"<string>\"\n}")
.asString();MiniMax H3 是 MiniMax 2026 年 7 月发布的全模态视频模型。一个 endpoint 同时吃文本、图片、视频、音频四类输入,单次渲染直接出带音轨的成片,不用再单独配音。
三种用法在同一个接口里,靠传什么决定:
按 分辨率 × 时长 计费,
- 文生视频 — 只给
prompt - 图生视频 — 给
image_urls,或用first_frame_image/last_frame_image指定首尾帧 - 参考生视频 — 给
video_urls(参考运镜与风格)或audio_urls(参考节奏与配乐)
task_id,轮询 任务状态 直到 completed。
定价
本页不列单价 —— 价格会随上游调整,写在文档里迟早和实际对不上。看实时价格: 控制台「模型市场」,或
GET /v1/models 查询接口(见 模型列表)。
看单次实际花费: 每次调用的响应里都带 cost / usage.cost,以它为准。可用模型
| 模型 ID | 分辨率 | 时长(秒) | 音轨 | 特色 |
|---|---|---|---|---|
minimax-h3 | 768p / 2k | 4–15 任意整数 | ✅ 原生 | 全模态输入,单次出带声成片 |
minimax-h3-max | 480p / 768p | 4–15 任意整数 | ✅ 原生 | 更快更省的低分辨率档,能力与 H3 相同 |
minimax-h3-regeneration | 2k | 4–15 任意整数 | ✅ 原生 | 把已有的 768p H3 成片按原生 2K 重渲染,video_urls 必传 |
2k 档更贵。传参考视频(video_urls)时按 2× 单价计:上游按输入视频时长 + 输出时长收,这是过渡折算;minimax-h3-regeneration 的单价已含输入部分,不再翻倍。参考图前 5 张免费,之后上游按张加收,我们目前不另计。
调用示例
curl -X POST https://www.qingbo.dev/v1/tasks \
-H "Authorization: Bearer $WAVE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "minimax-h3",
"prompt": "清晨的山间小镇,雾气缓缓散开,镜头从屋顶推向远山",
"resolution": "2k",
"duration": 8
}'
curl -X POST https://www.qingbo.dev/v1/tasks \
-H "Authorization: Bearer $WAVE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "minimax-h3",
"prompt": "人物缓缓抬头,风吹动头发,镜头轻微推近",
"image_urls": ["https://cdn.example.com/portrait.jpg"],
"resolution": "768p",
"duration": 6
}'
curl -X POST https://www.qingbo.dev/v1/tasks \
-H "Authorization: Bearer $WAVE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "minimax-h3",
"prompt": "从白天过渡到夜晚,灯光逐盏亮起",
"first_frame_image": "https://cdn.example.com/day.jpg",
"last_frame_image": "https://cdn.example.com/night.jpg",
"duration": 10
}'
curl -X POST https://www.qingbo.dev/v1/tasks \
-H "Authorization: Bearer $WAVE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "minimax-h3",
"prompt": "同样的运镜节奏,换成雪山场景",
"video_urls": ["https://cdn.example.com/reference.mp4"],
"audio_urls": ["https://cdn.example.com/bgm.mp3"],
"resolution": "2k",
"duration": 12
}'
通用参数
string
必填
固定
minimax-h3string
必填
画面描述。即使给了参考素材也建议写清楚要什么 —— 参考素材负责”像什么”,prompt 负责”做什么”
string
默认值:"768p"
768p / 2kinteger
默认值:"5"
4–15 之间任意整数秒
string[]
参考图或首帧。公网可访问的图片 URL
string
首帧图 URL
string
尾帧图 URL,与
first_frame_image 配合做「从 A 变到 B」string[]
参考视频,提供运镜、节奏与风格参考
string[]
参考音频,影响成片的节奏与配乐走向
图生与参考生互斥。 首尾帧(
first_frame_image / last_frame_image)与参考素材(video_urls / audio_urls)不能在同一次请求里混用 —— 上游把它们当两种不同的生成模式。资源限制
| 项目 | 限制 |
|---|---|
| 参考图 | 最多 9 张 |
| 参考视频 | 最多 3 段,每段 2–15 秒 |
| 参考音频 | 最多 3 段,每段 2–15 秒 |
| 参考素材总时长 | ≤ 15 秒 |
| 提示词 | ≤ 7000 字符 |
相关文档
⌘I
MiniMax H3
curl --request POST \
--url https://www.qingbo.dev/v1/tasks \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"prompt": "<string>",
"resolution": "<string>",
"duration": 123,
"image_urls": [
"<string>"
],
"first_frame_image": "<string>",
"last_frame_image": "<string>",
"video_urls": [
"<string>"
],
"audio_urls": [
"<string>"
],
"callback_url": "<string>"
}
'import requests
url = "https://www.qingbo.dev/v1/tasks"
payload = {
"model": "<string>",
"prompt": "<string>",
"resolution": "<string>",
"duration": 123,
"image_urls": ["<string>"],
"first_frame_image": "<string>",
"last_frame_image": "<string>",
"video_urls": ["<string>"],
"audio_urls": ["<string>"],
"callback_url": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
model: '<string>',
prompt: '<string>',
resolution: '<string>',
duration: 123,
image_urls: ['<string>'],
first_frame_image: '<string>',
last_frame_image: '<string>',
video_urls: ['<string>'],
audio_urls: ['<string>'],
callback_url: '<string>'
})
};
fetch('https://www.qingbo.dev/v1/tasks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.qingbo.dev/v1/tasks"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"prompt\": \"<string>\",\n \"resolution\": \"<string>\",\n \"duration\": 123,\n \"image_urls\": [\n \"<string>\"\n ],\n \"first_frame_image\": \"<string>\",\n \"last_frame_image\": \"<string>\",\n \"video_urls\": [\n \"<string>\"\n ],\n \"audio_urls\": [\n \"<string>\"\n ],\n \"callback_url\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://www.qingbo.dev/v1/tasks")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"prompt\": \"<string>\",\n \"resolution\": \"<string>\",\n \"duration\": 123,\n \"image_urls\": [\n \"<string>\"\n ],\n \"first_frame_image\": \"<string>\",\n \"last_frame_image\": \"<string>\",\n \"video_urls\": [\n \"<string>\"\n ],\n \"audio_urls\": [\n \"<string>\"\n ],\n \"callback_url\": \"<string>\"\n}")
.asString();