AirSpark/seedance视频生成文档.md
seaislee1209 acbd2e30ad Initial commit: Air Spark project
- frontend/: Next.js 16 app (App Router, React 19, Tailwind v4)
- skills/: project skills (seedance, automation, trae-agents, etc.)
- Docs: PRD, UI-Design-System, DEV-LOG, seedance integration notes
- skills-lock.json: skills version lock

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 16:08:49 +08:00

3045 lines
131 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Seedance 模型具备出色的语义理解能力,可根据用户输入的文本、图片等内容,快速生成优质的视频片段。通过这篇教程,您可学习到如何调用 [Video Generation API](https://www.volcengine.com/docs/82379/1520758) 生成视频。
:::warning
Seedance 2.0 模型目前仅支持 [控制台体验中心](https://console.volcengine.com/ark/region:ark+cn-beijing/experience/vision?modelId=doubao-seedance-2-0-260128&tab=GenVideo) 在免费额度内体验,暂不支持 API 调用,敬请期待。
:::
:::tip
方舟平台的新用户?获取 API Key 及 开通模型等准备工作,请参见 [快速入门](/docs/82379/1399008)。
:::
<span id="a06d249e"></span>
# 效果预览
访问[模型卡片](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-seedance-2-0)查看更多示例。
<span aceTableMode="list" aceTableWidth="2,2,4,4"></span>
|场景 |输入:提示词 |输入:图片、视频、音频 |输出 |
|---|---|---|---|
|首帧图生视频 |一辆地铁轰隆隆驶过书页和女孩的头发飞扬镜头开始环绕着女孩360度旋转周围的背景从地铁站渐渐转变为一个中世纪的教堂西式幻想风格的音乐渐入。夹在女孩书中的几页信纸随风飞扬在女孩的周身打着旋随风而动的纸张降落时女孩身处的环境已经彻底变成中世纪教堂的模样 |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/46ecf776adf14c9aaf842ac7b06ee924~tplv-goo7wpa0wc-image.image =250x) </span> |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2400b351c4514dae897c197dcc963364~tplv-goo7wpa0wc-image.image" controls></video>|\
| | | | |
|首尾帧生视频 |360度环绕运镜 |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f8fc1008f23a4908b7c897e8b7eb87df~tplv-goo7wpa0wc-image.image =250x) </span> |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ace519a8a6d24c2c9ab3ccab1f729240~tplv-goo7wpa0wc-image.image" controls></video>|\
| | | | |
<span id="fd30cc1a"></span>
# 新手入门
视频生成是一个异步过程:
1. 成功调用 `POST /contents/generations/tasks` 接口后API 将返回一个任务 ID 。
2. 您可以轮询 `GET /contents/generations/tasks/{id}` 接口,直到任务状态变为 `succeeded`;或者使用 Webhook 自动接收视频生成任务的状态变化。
3. 任务完成后,您可在 content.**video_url** 字段处,下载最终生成的 MP4 文件。
<span id="34b10d6d"></span>
## Step1: 创建视频生成任务
通过 `POST /contents/generations/tasks` 创建视频生成任务。
```mixin-react
return (<Tabs>
<Tabs.TabPane title="Curl" key="HHh29l3ni9"><RenderMd content={`\`\`\`Bash
curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \\
-H "Content-Type: application/json" \\
-H "Authorization: Bearer $ARK_API_KEY" \\
-d '{
"model": "doubao-seedance-1-5-pro-251215",
"content": [
{
"type": "text",
"text": "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声"
},
{
"type": "image_url",
"image_url": {
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png"
}
}
],
"generate_audio": true,
"ratio": "adaptive",
"duration": 5,
"watermark": false
}'
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Python" key="m5yR9UkPeV"><RenderMd content={`\`\`\`Python
import os
from volcenginesdkarkruntime import Ark
# Get API Keyhttps://console.volcengine.com/ark/region:ark+cn-beijing/apikey
client = Ark(api_key=os.environ.get("ARK_API_KEY"))
if __name__ == "__main__":
print("----- create request -----")
resp = client.content_generation.tasks.create(
model="doubao-seedance-1-5-pro-251215", # Replace with Model ID
content=[
{
"text": (
"女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动"
),
"type": "text"
},
{
"image_url": {
"url": (
"https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png"
)
},
"type": "image_url"
}
],
generate_audio=True,
ratio="adaptive",
duration=5,
watermark=False,
)
print(resp)
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Java" key="JLDLjzTEvb"><RenderMd content={`\`\`\`Java
package com.ark.sample;
import com.volcengine.ark.runtime.model.content.generation.*;
import com.volcengine.ark.runtime.model.content.generation.CreateContentGenerationTaskRequest.Content;
import com.volcengine.ark.runtime.service.ArkService;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class ContentGenerationTaskExample {
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
// Initialize the Ark client to read your API Key from an environment variable
static String apiKey = System.getenv("ARK_API_KEY");
static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS);
static Dispatcher dispatcher = new Dispatcher();
static ArkService service = ArkService.builder()
.baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation
.dispatcher(dispatcher)
.connectionPool(connectionPool)
.apiKey(apiKey)
.build();
public static void main(String[] args) {
String model = "doubao-seedance-1-5-pro-251215"; // Replace with Model ID
Boolean generateAudio = true;
String ratio = "adaptive";
Long duration = 5L;
Boolean watermark = false;
System.out.println("----- create request -----");
List<Content> contents = new ArrayList<>();
// Combination of text prompt and parameters
contents.add(Content.builder()
.type("text")
.text("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声")
.build());
// The URL of the first frame image
contents.add(Content.builder()
.type("image_url")
.imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
.url("https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png")
.build())
.build());
// Create a video generation task
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
.model(model)
.content(contents)
.generateAudio(generateAudio)
.ratio(ratio)
.duration(duration)
.watermark(watermark)
.build();
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
System.out.println(createResult);
service.shutdownExecutor();
}
}
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Go" key="VO7xzExGiI"><RenderMd content={`\`\`\`Go
package main
import (
"context"
"fmt"
"os"
"time"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
"github.com/volcengine/volcengine-go-sdk/volcengine"
)
func main() {
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
// Initialize the Ark client to read your API Key from an environment variable
client := arkruntime.NewClientWithApiKey(
// Get your API Key from the environment variable. This is the default mode and you can modify it as required
os.Getenv("ARK_API_KEY"),
// The base URL for model invocation
arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"),
)
ctx := context.Background()
// Replace with Model ID
modelEp := "doubao-seedance-1-5-pro-251215"
// Generate a task
fmt.Println("----- create request -----")
createReq := model.CreateContentGenerationTaskRequest{
Model: modelEp,
GenerateAudio: volcengine.Bool(true),
Ratio: volcengine.String("adaptive"),
Duration: volcengine.Int64(5),
Watermark: volcengine.Bool(false),
Content: []*model.CreateContentGenerationContentItem{
{
// Combination of text prompt and parameters
Type: model.ContentGenerationContentItemTypeText,
Text: volcengine.String("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声"),
},
{
// The URL of the first frame image
Type: model.ContentGenerationContentItemTypeImage,
ImageURL: &model.ImageURL{
URL: "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png",
},
},
},
}
createResp, err := client.CreateContentGenerationTask(ctx, createReq)
if err != nil {
fmt.Printf("create content generation error: %v", err)
return
}
taskID := createResp.ID
fmt.Printf("Task Created with ID: %s", taskID)
}
\`\`\`
`}></RenderMd></Tabs.TabPane></Tabs>);
```
请求成功后,系统将返回一个任务 ID。
```JSON
{
"id": "cgt-2025******-****"
}
```
<span id="a4fa0cc8"></span>
## Step2: 查询视频生成任务
利用创建视频生成任务时返回的 ID ,您可以查询视频生成任务的详细状态与结果。此接口会返回任务的当前状态(如 `queued` 、`running` 、 `succeeded` 等)以及生成的视频相关信息(如视频下载链接、分辨率、时长等)。
:::tip
因模型、API负载和视频输出规格的不同视频生成的过程可能耗时较长。为高效管理这一过程您可以通过轮询 API 接口(详见 [基础使用](/docs/82379/1366799#754e68e3) 和 [进阶使用](/docs/82379/1366799#e190e738) 部分的 SDK 示例)来请求状态更新,或通过 [使用 Webhook 通知](/docs/82379/1366799#724d67c3) 接收通知。
:::
```mixin-react
return (<Tabs>
<Tabs.TabPane title="Curl" key="LSIbbR5GyO"><RenderMd content={`\`\`\`Bash
# Replace cgt-2025**** with the ID acquired from "Create Video Generation Task".
curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/cgt-2025**** \\
-H "Content-Type: application/json" \\
-H "Authorization: Bearer $ARK_API_KEY"
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Python" key="MQxA6oNWWh"><RenderMd content={`\`\`\`Python
import os
from volcenginesdkarkruntime import Ark
client = Ark(api_key=os.environ.get("ARK_API_KEY"))
if __name__ == "__main__":
resp = client.content_generation.tasks.get(
task_id="cgt-2025****",
)
print(resp)
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Java" key="LejqOE9QI3"><RenderMd content={`\`\`\`Java
package com.ark.sample;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.volcengine.ark.runtime.model.content.generation.GetContentGenerationTaskRequest;
import com.volcengine.ark.runtime.service.ArkService;
import java.util.concurrent.TimeUnit;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;
public class Sample {
static String apiKey = System.getenv("ARK_API_KEY");
static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS);
static Dispatcher dispatcher = new Dispatcher();
static ArkService service =
ArkService.builder()
.dispatcher(dispatcher)
.connectionPool(connectionPool)
.apiKey(apiKey)
.build();
public static void main(String[] args) throws JsonProcessingException {
String taskId = "cgt-2025****";
GetContentGenerationTaskRequest req = GetContentGenerationTaskRequest.builder()
.taskId(taskId)
.build();
service.getContentGenerationTask(req).toString();
System.out.println(service.getContentGenerationTask(req));
service.shutdownExecutor();
}
}
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Go" key="Eqc43DGxTq"><RenderMd content={`\`\`\`Go
package main
import (
"context"
"fmt"
"os"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
)
func main() {
client := arkruntime.NewClientWithApiKey(os.Getenv("ARK_API_KEY"))
ctx := context.Background()
req := model.GetContentGenerationTaskRequest{
ID: "cgt-2025****",
}
resp, err := client.GetContentGenerationTask(ctx, req)
if err != nil {
fmt.Printf("get content generation task error: %v\\n", err)
return
}
fmt.Printf("%+v\\n", resp)
}
\`\`\`
`}></RenderMd></Tabs.TabPane></Tabs>);
```
当任务状态变为 succeeded 后,您可在 content.**video_url** 字段处,下载最终生成的视频文件。
```JSON
{
"id": "cgt-2025****",
"model": "doubao-seedance-1-5-pro-251215",
"status": "succeeded",
"content": {
// Video download URL (file format is MP4)
"video_url": "https://ark-content-generation-cn-beijing.tos-cn-beijing.volces.com/****"
},
"usage": {
"completion_tokens": 246840,
"total_tokens": 246840
},
"created_at": 1765510475,
"updated_at": 1765510559,
"seed": 58944,
"resolution": "1080p",
"ratio": "16:9",
"duration": 5,
"framespersecond": 24,
"service_tier": "default",
"execution_expires_after": 172800
}
```
<span id="e7b4c498"></span>
# 模型能力
<span aceTableMode="list" aceTableWidth="4,4,3,3,3,,"></span>
|模型名称 | |[Seedance 1.5 pro](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-seedance-1-5-pro&projectName=default) |[Seedance 1.0 pro](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-seedance-1-0-pro&projectName=default) |[Seedance 1.0 pro fast](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-seedance-1-0-pro-fast&projectName=default) |[Seedance 1.0 lite i2v](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-seedance-1-0-lite-i2v&projectName=default) |[Seedance-1.0 lite t2v](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-seedance-1-0-lite-t2v) |
|---|---|---|---|---|---|---|
|Model ID | |doubao\-seedance\-1\-5\-pro\-251215 |doubao\-seedance\-1\-0\-pro\-250528 |doubao\-seedance\-1\-0\-pro\-fast\-251015 |doubao\-seedance\-1\-0\-lite\-t2v\-250428 |doubao\-seedance\-1\-0\-lite\-i2v\-250428 |
|文生视频 | |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |
|图生视频\-首帧 | |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f359753773c94d97885008ca1223c9bc~tplv-goo7wpa0wc-image.image =20x) </span> |
|图生视频\-首尾帧 | |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f359753773c94d97885008ca1223c9bc~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f359753773c94d97885008ca1223c9bc~tplv-goo7wpa0wc-image.image =20x) </span> |
|生成有声视频 | |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f359753773c94d97885008ca1223c9bc~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f359753773c94d97885008ca1223c9bc~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f359753773c94d97885008ca1223c9bc~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f359753773c94d97885008ca1223c9bc~tplv-goo7wpa0wc-image.image =20x) </span> |
|样片模式 | |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f359753773c94d97885008ca1223c9bc~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f359753773c94d97885008ca1223c9bc~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f359753773c94d97885008ca1223c9bc~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f359753773c94d97885008ca1223c9bc~tplv-goo7wpa0wc-image.image =20x) </span> |
|返回视频尾帧 | |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |
|输出视频规格 |输出分辨率 |480p, 720p, 1080p |480p, 720p, 1080p |480p, 720p, 1080p |480p, 720p, 1080p |480p, 720p, 1080p |
| |输出宽高比 |21:9, 16:9, 4:3, 1:1, 3:4, 9:16 |||||
| |输出时长 |4~12 秒 |2~12 秒 |2~12 秒 |2~12 秒 |2~12 秒 |
| |输出视频格式 |mp4 |mp4 |mp4 |mp4 |mp4 |
|离线推理 | |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |
|在线推理限流 |RPM |600 |600 |600 |300 |300 |
| |并发数 |10 |10 |10 |5 |5 |
|离线推理限流 |TPD |5000亿 |5000亿 |5000亿 |2500亿 |2500亿 |
&nbsp;
&nbsp;
&nbsp;
&nbsp;
<span id="c637f771"></span>
# 基础使用
<span id="42750622"></span>
## 文生视频
根据用户输入的提示词生成视频,结果具有较大的随机性,可以用于激发创作灵感。
<span aceTableMode="list" aceTableWidth="1,1"></span>
|提示词 |输出 |
|---|---|
|写实风格,晴朗的蓝天之下,一大片白色的雏菊花田,镜头逐渐拉近,最终定格在一朵雏菊花的特写上,花瓣上有几颗晶莹的露珠 |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/62699e55f1674309b6692d188c9ed492~tplv-goo7wpa0wc-image.image" controls></video>|\
| | |
```mixin-react
return (<Tabs>
<Tabs.TabPane title="Python" key="y2VCq6qGBT"><RenderMd content={`\`\`\`Python
import os
import time
# Install SDK: pip install 'volcengine-python-sdk[ark]'
from volcenginesdkarkruntime import Ark
# Make sure that you have stored the API Key in the environment variable ARK_API_KEY
# Initialize the Ark client to read your API Key from an environment variable
client = Ark(
# This is the default path. You can configure it based on the service location
base_url="https://ark.cn-beijing.volces.com/api/v3",
# Get API Keyhttps://console.volcengine.com/ark/region:ark+cn-beijing/apikey
api_key=os.environ.get("ARK_API_KEY"),
)
if __name__ == "__main__":
print("----- create request -----")
create_result = client.content_generation.tasks.create(
model="doubao-seedance-1-5-pro-251215", # Replace with Model ID
content=[
{
# Combination of text prompt and parameters
"type": "text",
"text": "写实风格,晴朗的蓝天之下,一大片白色的雏菊花田,镜头逐渐拉近,最终定格在一朵雏菊花的特写上,花瓣上有几颗晶莹的露珠"
}
],
ratio="16:9",
duration=5,
watermark=False,
)
print(create_result)
# Polling query section
print("----- polling task status -----")
task_id = create_result.id
while True:
get_result = client.content_generation.tasks.get(task_id=task_id)
status = get_result.status
if status == "succeeded":
print("----- task succeeded -----")
print(get_result)
break
elif status == "failed":
print("----- task failed -----")
print(f"Error: {get_result.error}")
break
else:
print(f"Current status: {status}, Retrying after 10 seconds...")
time.sleep(10)
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Java" key="QsDO8OmIHL"><RenderMd content={`\`\`\`Java
package com.ark.sample;
import com.volcengine.ark.runtime.model.content.generation.*;
import com.volcengine.ark.runtime.model.content.generation.CreateContentGenerationTaskRequest.Content;
import com.volcengine.ark.runtime.service.ArkService;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class ContentGenerationTaskExample {
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
// Initialize the Ark client to read your API Key from an environment variable
static String apiKey = System.getenv("ARK_API_KEY");
static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS);
static Dispatcher dispatcher = new Dispatcher();
static ArkService service = ArkService.builder()
.baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation
.dispatcher(dispatcher)
.connectionPool(connectionPool)
.apiKey(apiKey)
.build();
public static void main(String[] args) {
String model = "doubao-seedance-1-5-pro-251215"; // Replace with Model ID
String ratio = "16:9";
Long duration = 5L;
Boolean watermark = false;
System.out.println("----- create request -----");
List<Content> contents = new ArrayList<>();
// Combination of text prompt and parameters
contents.add(Content.builder()
.type("text")
.text("写实风格,晴朗的蓝天之下,一大片白色的雏菊花田,镜头逐渐拉近,最终定格在一朵雏菊花的特写上,花瓣上有几颗晶莹的露珠")
.build());
// Create a video generation task
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
.model(model)
.content(contents)
.ratio(ratio)
.duration(duration)
.watermark(watermark)
.build();
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
System.out.println(createResult);
// Get the details of the task
String taskId = createResult.getId();
GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
.taskId(taskId)
.build();
// Polling query section
System.out.println("----- polling task status -----");
while (true) {
try {
GetContentGenerationTaskResponse getResponse = service.getContentGenerationTask(getRequest);
String status = getResponse.getStatus();
if ("succeeded".equalsIgnoreCase(status)) {
System.out.println("----- task succeeded -----");
System.out.println(getResponse);
break;
} else if ("failed".equalsIgnoreCase(status)) {
System.out.println("----- task failed -----");
System.out.println("Error: " + getResponse.getStatus());
break;
} else {
System.out.printf("Current status: %s, Retrying in 10 seconds...", status);
TimeUnit.SECONDS.sleep(10);
}
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
System.err.println("Polling interrupted");
break;
}
}
}
}
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Go" key="OmweI48v9D"><RenderMd content={`\`\`\`Go
package main
import (
"context"
"fmt"
"os"
"time"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
"github.com/volcengine/volcengine-go-sdk/volcengine"
)
func main() {
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
// Initialize the Ark client to read your API Key from an environment variable
client := arkruntime.NewClientWithApiKey(
// Get your API Key from the environment variable. This is the default mode and you can modify it as required
os.Getenv("ARK_API_KEY"),
// The base URL for model invocation
arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"),
)
ctx := context.Background()
// Replace with Model ID
modelEp := "doubao-seedance-1-5-pro-251215"
// Generate a task
fmt.Println("----- create request -----")
createReq := model.CreateContentGenerationTaskRequest{
Model: modelEp,
Ratio: volcengine.String("16:9"),
Duration: volcengine.Int64(5),
Watermark: volcengine.Bool(false),
Content: []*model.CreateContentGenerationContentItem{
{
// Combination of text prompt and parameters
Type: model.ContentGenerationContentItemTypeText,
Text: volcengine.String("写实风格,晴朗的蓝天之下,一大片白色的雏菊花田,镜头逐渐拉近,最终定格在一朵雏菊花的特写上,花瓣上有几颗晶莹的露珠"),
},
},
}
createResp, err := client.CreateContentGenerationTask(ctx, createReq)
if err != nil {
fmt.Printf("create content generation error: %v", err)
return
}
taskID := createResp.ID
fmt.Printf("Task Created with ID: %s", taskID)
// Polling query section
fmt.Println("----- polling task status -----")
for {
getReq := model.GetContentGenerationTaskRequest{ID: taskID}
getResp, err := client.GetContentGenerationTask(ctx, getReq)
if err != nil {
fmt.Printf("get content generation task error: %v", err)
return
}
status := getResp.Status
if status == "succeeded" {
fmt.Println("----- task succeeded -----")
fmt.Printf("Task ID: %s \\n", getResp.ID)
fmt.Printf("Model: %s \\n", getResp.Model)
fmt.Printf("Video URL: %s \\n", getResp.Content.VideoURL)
fmt.Printf("Completion Tokens: %d \\n", getResp.Usage.CompletionTokens)
fmt.Printf("Created At: %d, Updated At: %d", getResp.CreatedAt, getResp.UpdatedAt)
return
} else if status == "failed" {
fmt.Println("----- task failed -----")
if getResp.Error != nil {
fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Code, getResp.Error.Message)
}
return
} else {
fmt.Printf("Current status: %s, Retrying in 10 seconds... \\n", status)
time.Sleep(10 * time.Second)
}
}
}
\`\`\`
`}></RenderMd></Tabs.TabPane></Tabs>);
```
<span id="979b2d28"></span>
## 图生视频\-基于首帧(`含音频`
通过指定视频的首帧图片,模型能够基于该图片生成与之相关且画面连贯的视频内容。
Seedance 1.5 pro 可通过设置参数 **generate_audio** 为 `true`,生成有声视频。
<span aceTableMode="list" aceTableWidth="3,4,4"></span>
|提示词 |首帧 |输出 |
|---|---|---|
|女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声 |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a28ec84ff9fc4287a0d98191020a3218~tplv-goo7wpa0wc-image.image =230x) </span> |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/bb440efca0934d65845e2c6ee75501fa~tplv-goo7wpa0wc-image.image" controls></video>|\
| | | |
```mixin-react
return (<Tabs>
<Tabs.TabPane title="Python" key="Xiv8K6YBqJ"><RenderMd content={`\`\`\`Python
import os
import time
# Install SDK: pip install 'volcengine-python-sdk[ark]'
from volcenginesdkarkruntime import Ark
# Make sure that you have stored the API Key in the environment variable ARK_API_KEY
# Initialize the Ark client to read your API Key from an environment variable
client = Ark(
# This is the default path. You can configure it based on the service location
base_url="https://ark.cn-beijing.volces.com/api/v3",
# Get API Keyhttps://console.volcengine.com/ark/region:ark+cn-beijing/apikey
api_key=os.environ.get("ARK_API_KEY"),
)
if __name__ == "__main__":
print("----- create request -----")
create_result = client.content_generation.tasks.create(
model="doubao-seedance-1-5-pro-251215", # Replace with Model ID
content=[
{
# Combination of text prompt and parameters
"type": "text",
"text": "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声"
},
{
# The URL of the first frame image
"type": "image_url",
"image_url": {
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png"
}
}
],
generate_audio=True,
ratio="adaptive",
duration=5,
watermark=False,
)
print(create_result)
# Polling query section
print("----- polling task status -----")
task_id = create_result.id
while True:
get_result = client.content_generation.tasks.get(task_id=task_id)
status = get_result.status
if status == "succeeded":
print("----- task succeeded -----")
print(get_result)
break
elif status == "failed":
print("----- task failed -----")
print(f"Error: {get_result.error}")
break
else:
print(f"Current status: {status}, Retrying after 10 seconds...")
time.sleep(10)
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Java" key="Wg6jaFp9Q5"><RenderMd content={`\`\`\`Java
package com.ark.sample;
import com.volcengine.ark.runtime.model.content.generation.*;
import com.volcengine.ark.runtime.model.content.generation.CreateContentGenerationTaskRequest.Content;
import com.volcengine.ark.runtime.service.ArkService;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class ContentGenerationTaskExample {
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
// Initialize the Ark client to read your API Key from an environment variable
static String apiKey = System.getenv("ARK_API_KEY");
static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS);
static Dispatcher dispatcher = new Dispatcher();
static ArkService service = ArkService.builder()
.baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation
.dispatcher(dispatcher)
.connectionPool(connectionPool)
.apiKey(apiKey)
.build();
public static void main(String[] args) {
String model = "doubao-seedance-1-5-pro-251215"; // Replace with Model ID
Boolean generateAudio = true;
String ratio = "adaptive";
Long duration = 5L;
Boolean watermark = false;
System.out.println("----- create request -----");
List<Content> contents = new ArrayList<>();
// Combination of text prompt and parameters
contents.add(Content.builder()
.type("text")
.text("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声")
.build());
// The URL of the first frame image
contents.add(Content.builder()
.type("image_url")
.imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
.url("https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png")
.build())
.build());
// Create a video generation task
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
.model(model)
.content(contents)
.generateAudio(generateAudio)
.ratio(ratio)
.duration(duration)
.watermark(watermark)
.build();
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
System.out.println(createResult);
// Get the details of the task
String taskId = createResult.getId();
GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
.taskId(taskId)
.build();
// Polling query section
System.out.println("----- polling task status -----");
while (true) {
try {
GetContentGenerationTaskResponse getResponse = service.getContentGenerationTask(getRequest);
String status = getResponse.getStatus();
if ("succeeded".equalsIgnoreCase(status)) {
System.out.println("----- task succeeded -----");
System.out.println(getResponse);
break;
} else if ("failed".equalsIgnoreCase(status)) {
System.out.println("----- task failed -----");
System.out.println("Error: " + getResponse.getStatus());
break;
} else {
System.out.printf("Current status: %s, Retrying in 10 seconds...", status);
TimeUnit.SECONDS.sleep(10);
}
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
System.err.println("Polling interrupted");
break;
}
}
}
}
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Go" key="B5JEPgvMU1"><RenderMd content={`\`\`\`Go
package main
import (
"context"
"fmt"
"os"
"time"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
"github.com/volcengine/volcengine-go-sdk/volcengine"
)
func main() {
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
// Initialize the Ark client to read your API Key from an environment variable
client := arkruntime.NewClientWithApiKey(
// Get your API Key from the environment variable. This is the default mode and you can modify it as required
os.Getenv("ARK_API_KEY"),
// The base URL for model invocation
arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"),
)
ctx := context.Background()
// Replace with Model ID
modelEp := "doubao-seedance-1-5-pro-251215"
// Generate a task
fmt.Println("----- create request -----")
createReq := model.CreateContentGenerationTaskRequest{
Model: modelEp,
GenerateAudio: volcengine.Bool(true),
Ratio: volcengine.String("adaptive"),
Duration: volcengine.Int64(5),
Watermark: volcengine.Bool(false),
Content: []*model.CreateContentGenerationContentItem{
{
// Combination of text prompt and parameters
Type: model.ContentGenerationContentItemTypeText,
Text: volcengine.String("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声"),
},
{
// The URL of the first frame image
Type: model.ContentGenerationContentItemTypeImage,
ImageURL: &model.ImageURL{
URL: "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png",
},
},
},
}
createResp, err := client.CreateContentGenerationTask(ctx, createReq)
if err != nil {
fmt.Printf("create content generation error: %v", err)
return
}
taskID := createResp.ID
fmt.Printf("Task Created with ID: %s", taskID)
// Polling query section
fmt.Println("----- polling task status -----")
for {
getReq := model.GetContentGenerationTaskRequest{ID: taskID}
getResp, err := client.GetContentGenerationTask(ctx, getReq)
if err != nil {
fmt.Printf("get content generation task error: %v", err)
return
}
status := getResp.Status
if status == "succeeded" {
fmt.Println("----- task succeeded -----")
fmt.Printf("Task ID: %s \\n", getResp.ID)
fmt.Printf("Model: %s \\n", getResp.Model)
fmt.Printf("Video URL: %s \\n", getResp.Content.VideoURL)
fmt.Printf("Completion Tokens: %d \\n", getResp.Usage.CompletionTokens)
fmt.Printf("Created At: %d, Updated At: %d", getResp.CreatedAt, getResp.UpdatedAt)
return
} else if status == "failed" {
fmt.Println("----- task failed -----")
if getResp.Error != nil {
fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Code, getResp.Error.Message)
}
return
} else {
fmt.Printf("Current status: %s, Retrying in 10 seconds... \\n", status)
time.Sleep(10 * time.Second)
}
}
}
\`\`\`
`}></RenderMd></Tabs.TabPane></Tabs>);
```
<span id="0d55ca07"></span>
## 图生视频\-基于首尾帧(`含音频`
通过指定视频的起始和结束图片,模型即可生成流畅衔接首、尾帧的视频,实现画面间自然、连贯的过渡效果。
Seedance 1.5 pro 可通过设置参数 **generate_audio** 为 `true`,生成有声视频。
<span aceTableMode="list" aceTableWidth="2,3,3,3"></span>
|提示词 |首帧 |尾帧 |输出 |
|---|---|---|---|
|图中女孩对着镜头说“茄子”360度环绕运镜 |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/649cb2057eae48d6a6eec872d912c75c~tplv-goo7wpa0wc-image.image =160x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e39fd8e500a34bbdad50d06659c4ea6b~tplv-goo7wpa0wc-image.image =160x) </span> |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ca99026747b148c2bd06b3bcc09fc717~tplv-goo7wpa0wc-image.image" controls></video>|\
| | | | |
```mixin-react
return (<Tabs>
<Tabs.TabPane title="Python" key="NbK0rdnFut"><RenderMd content={`\`\`\`Python
import os
import time
# Install SDK: pip install 'volcengine-python-sdk[ark]'
from volcenginesdkarkruntime import Ark
# Make sure that you have stored the API Key in the environment variable ARK_API_KEY
# Initialize the Ark client to read your API Key from an environment variable
client = Ark(
# This is the default path. You can configure it based on the service location
base_url="https://ark.cn-beijing.volces.com/api/v3",
# Get API Keyhttps://console.volcengine.com/ark/region:ark+cn-beijing/apikey
api_key=os.environ.get("ARK_API_KEY"),
)
if __name__ == "__main__":
print("----- create request -----")
create_result = client.content_generation.tasks.create(
model="doubao-seedance-1-5-pro-251215", # Replace with Model ID
content=[
{
# Combination of text prompt and parameters
"type": "text",
"text": "图中女孩对着镜头说\\"茄子\\"360度环绕运镜"
},
{
# The URL of the first frame image
"type": "image_url",
"image_url": {
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_first_frame.jpeg"
},
"role": "first_frame"
},
{
# The URL of the last frame image
"type": "image_url",
"image_url": {
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_last_frame.jpeg"
},
"role": "last_frame"
}
],
generate_audio=True,
ratio="adaptive",
duration=5,
watermark=False,
)
print(create_result)
# Polling query section
print("----- polling task status -----")
task_id = create_result.id
while True:
get_result = client.content_generation.tasks.get(task_id=task_id)
status = get_result.status
if status == "succeeded":
print("----- task succeeded -----")
print(get_result)
break
elif status == "failed":
print("----- task failed -----")
print(f"Error: {get_result.error}")
break
else:
print(f"Current status: {status}, Retrying after 10 seconds...")
time.sleep(10)
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Java" key="wjhclBC1yd"><RenderMd content={`\`\`\`Java
package com.ark.sample;
import com.volcengine.ark.runtime.model.content.generation.*;
import com.volcengine.ark.runtime.model.content.generation.CreateContentGenerationTaskRequest.Content;
import com.volcengine.ark.runtime.service.ArkService;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class ContentGenerationTaskExample {
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
// Initialize the Ark client to read your API Key from an environment variable
static String apiKey = System.getenv("ARK_API_KEY");
static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS);
static Dispatcher dispatcher = new Dispatcher();
static ArkService service = ArkService.builder()
.baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation
.dispatcher(dispatcher)
.connectionPool(connectionPool)
.apiKey(apiKey)
.build();
public static void main(String[] args) {
String model = "doubao-seedance-1-5-pro-251215"; // Replace with Model ID
Boolean generateAudio = true;
String ratio = "adaptive";
Long duration = 5L;
Boolean watermark = false;
System.out.println("----- create request -----");
List<Content> contents = new ArrayList<>();
// Combination of text prompt and parameters
contents.add(Content.builder()
.type("text")
.text("图中女孩对着镜头说“茄子”360度环绕运镜")
.build());
// The URL of the first frame image
contents.add(Content.builder()
.type("image_url")
.imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
.url("https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_first_frame.jpeg")
.build())
.role("first_frame")
.build());
// The URL of the last frame image
contents.add(Content.builder()
.type("image_url")
.imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
.url("https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_last_frame.jpeg")
.build())
.role("last_frame")
.build());
// Create a video generation task
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
.model(model)
.content(contents)
.generateAudio(generateAudio)
.ratio(ratio)
.duration(duration)
.watermark(watermark)
.build();
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
System.out.println(createResult);
// Get the details of the task
String taskId = createResult.getId();
GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
.taskId(taskId)
.build();
// Polling query section
System.out.println("----- polling task status -----");
while (true) {
try {
GetContentGenerationTaskResponse getResponse = service.getContentGenerationTask(getRequest);
String status = getResponse.getStatus();
if ("succeeded".equalsIgnoreCase(status)) {
System.out.println("----- task succeeded -----");
System.out.println(getResponse);
break;
} else if ("failed".equalsIgnoreCase(status)) {
System.out.println("----- task failed -----");
System.out.println("Error: " + getResponse.getStatus());
break;
} else {
System.out.printf("Current status: %s, Retrying in 10 seconds...", status);
TimeUnit.SECONDS.sleep(10);
}
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
System.err.println("Polling interrupted");
break;
}
}
}
}
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Go" key="bN2QSjlDBA"><RenderMd content={`\`\`\`Go
package main
import (
"context"
"fmt"
"os"
"time"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
"github.com/volcengine/volcengine-go-sdk/volcengine"
)
func main() {
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
// Initialize the Ark client to read your API Key from an environment variable
client := arkruntime.NewClientWithApiKey(
// Get your API Key from the environment variable. This is the default mode and you can modify it as required
os.Getenv("ARK_API_KEY"),
// The base URL for model invocation
arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"),
)
ctx := context.Background()
// Replace with Model ID
modelEp := "doubao-seedance-1-5-pro-251215"
// Generate a task
fmt.Println("----- create request -----")
createReq := model.CreateContentGenerationTaskRequest{
Model: modelEp,
GenerateAudio: volcengine.Bool(true),
Ratio: volcengine.String("adaptive"),
Duration: volcengine.Int64(5),
Watermark: volcengine.Bool(false),
Content: []*model.CreateContentGenerationContentItem{
{
// Combination of text prompt and parameters
Type: model.ContentGenerationContentItemTypeText,
Text: volcengine.String("图中女孩对着镜头说“茄子”360度环绕运镜"),
},
{
// The URL of the first frame image
Type: model.ContentGenerationContentItemTypeImage,
ImageURL: &model.ImageURL{
URL: "https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_first_frame.jpeg",
},
Role: volcengine.String("first_frame"),
},
{
// The URL of the last frame image
Type: model.ContentGenerationContentItemTypeImage,
ImageURL: &model.ImageURL{
URL: "https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_last_frame.jpeg",
},
Role: volcengine.String("last_frame"),
},
},
}
createResp, err := client.CreateContentGenerationTask(ctx, createReq)
if err != nil {
fmt.Printf("create content generation error: %v", err)
return
}
taskID := createResp.ID
fmt.Printf("Task Created with ID: %s", taskID)
// Polling query section
fmt.Println("----- polling task status -----")
for {
getReq := model.GetContentGenerationTaskRequest{ID: taskID}
getResp, err := client.GetContentGenerationTask(ctx, getReq)
if err != nil {
fmt.Printf("get content generation task error: %v", err)
return
}
status := getResp.Status
if status == "succeeded" {
fmt.Println("----- task succeeded -----")
fmt.Printf("Task ID: %s \\n", getResp.ID)
fmt.Printf("Model: %s \\n", getResp.Model)
fmt.Printf("Video URL: %s \\n", getResp.Content.VideoURL)
fmt.Printf("Completion Tokens: %d \\n", getResp.Usage.CompletionTokens)
fmt.Printf("Created At: %d, Updated At: %d", getResp.CreatedAt, getResp.UpdatedAt)
return
} else if status == "failed" {
fmt.Println("----- task failed -----")
if getResp.Error != nil {
fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Code, getResp.Error.Message)
}
return
} else {
fmt.Printf("Current status: %s, Retrying in 10 seconds... \\n", status)
time.Sleep(10 * time.Second)
}
}
}
\`\`\`
`}></RenderMd></Tabs.TabPane></Tabs>);
```
<span id="c5f5f577"></span>
## 图生视频\-基于参考图
模型能精准提取参考图片支持输入1\-4张中各类对象的关键特征并依据这些特征在视频生成过程中高度还原对象的形态、色彩和纹理等细节确保生成的视频与参考图的视觉风格一致。
<span aceTableMode="list" aceTableWidth="1,1,1,1,2"></span>
|提示词 |参考图1 |参考图2 |参考图3 |输出 |
|---|---|---|---|---|
|[图1]戴着眼镜穿着蓝色T恤的男生和[图2]的柯基小狗,坐在[图3]的草坪上,视频卡通风格 |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/2637ac87f1e64bd897bfc651fe7d0386~tplv-goo7wpa0wc-image.image =90x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/9450c9444b574112a9f228db9e81cdf4~tplv-goo7wpa0wc-image.image =90x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/574b8785f4b740ddaff791655e8633ba~tplv-goo7wpa0wc-image.image =90x) </span> |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/489a331a1d6c4966adcb343f3d19faf3~tplv-goo7wpa0wc-image.image" controls></video>|\
| | | | | |
```mixin-react
return (<Tabs>
<Tabs.TabPane title="Python" key="A067ekxtBn"><RenderMd content={`\`\`\`Python
import os
import time
# Install SDK: pip install 'volcengine-python-sdk[ark]'
from volcenginesdkarkruntime import Ark
# Make sure that you have stored the API Key in the environment variable ARK_API_KEY
# Initialize the Ark client to read your API Key from an environment variable
client = Ark(
# This is the default path. You can configure it based on the service location
base_url="https://ark.cn-beijing.volces.com/api/v3",
# Get API Keyhttps://console.volcengine.com/ark/region:ark+cn-beijing/apikey
api_key=os.environ.get("ARK_API_KEY"),
)
if __name__ == "__main__":
print("----- create request -----")
try:
create_result = client.content_generation.tasks.create(
model="doubao-seedance-1-0-lite-i2v-250428", # Replace with Model ID
content=[
{
# Combination of text prompt and parameters
"type": "text",
"text": "[图1]戴着眼镜穿着蓝色T恤的男生和[图2]的柯基小狗,坐在[图3]的草坪上,视频卡通风格"
},
{
# The URL of the first reference image
# 1-4 reference images need to be provided
"type": "image_url",
"image_url": {
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_1.png"
},
"role": "reference_image"
},
{
# The URL of the second reference image
"type": "image_url",
"image_url": {
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_2.png"
},
"role": "reference_image"
},
{
# The URL of the third reference image
"type": "image_url",
"image_url": {
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_3.png"
},
"role": "reference_image"
}
],
ratio="16:9",
duration=5,
watermark=False,
)
print(create_result)
# Polling query section
print("----- polling task status -----")
task_id = create_result.id
while True:
get_result = client.content_generation.tasks.get(task_id=task_id)
status = get_result.status
if status == "succeeded":
print("----- task succeeded -----")
print(get_result)
break
elif status == "failed":
print("----- task failed -----")
print(f"Error: {get_result.error}")
break
else:
print(f"Current status: {status}, Retrying after 10 seconds...")
time.sleep(10)
except Exception as e:
print(f"An error occurred: {e}")
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Java" key="vHX8r5Vj6R"><RenderMd content={`\`\`\`Java
package com.ark.sample;
import com.volcengine.ark.runtime.model.content.generation.*;
import com.volcengine.ark.runtime.model.content.generation.CreateContentGenerationTaskRequest.Content;
import com.volcengine.ark.runtime.service.ArkService;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class ContentGenerationTaskExample {
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
// Initialize the Ark client to read your API Key from an environment variable
static String apiKey = System.getenv("ARK_API_KEY");
static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS);
static Dispatcher dispatcher = new Dispatcher();
static ArkService service = ArkService.builder()
.baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation
.dispatcher(dispatcher)
.connectionPool(connectionPool)
.apiKey(apiKey)
.build();
public static void main(String[] args) {
String model = "doubao-seedance-1-0-lite-i2v-250428"; // Replace with Model ID
String ratio = "16:9";
Long duration = 5L;
Boolean watermark = false;
System.out.println("----- create request -----");
List<Content> contents = new ArrayList<>();
// Combination of text prompt and parameters
contents.add(Content.builder()
.type("text")
.text("[图1]戴着眼镜穿着蓝色T恤的男生和[图2]的柯基小狗,坐在[图3]的草坪上,视频卡通风格")
.build());
// The URL of the first reference image
contents.add(Content.builder()
.type("image_url")
.imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
.url("https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_1.png")
.build())
.role("reference_image")
.build());
// The URL of the second reference image
contents.add(Content.builder()
.type("image_url")
.imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
.url("https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_2.png")
.build())
.role("reference_image")
.build());
// The URL of the third reference image
contents.add(Content.builder()
.type("image_url")
.imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
.url("https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_3.png")
.build())
.role("reference_image")
.build());
// Create a video generation task
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
.model(model)
.content(contents)
.ratio(ratio)
.duration(duration)
.watermark(watermark)
.build();
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
System.out.println(createResult);
// Get the details of the task
String taskId = createResult.getId();
GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
.taskId(taskId)
.build();
// Polling query section
System.out.println("----- polling task status -----");
while (true) {
try {
GetContentGenerationTaskResponse getResponse = service.getContentGenerationTask(getRequest);
String status = getResponse.getStatus();
if ("succeeded".equalsIgnoreCase(status)) {
System.out.println("----- task succeeded -----");
System.out.println(getResponse);
break;
} else if ("failed".equalsIgnoreCase(status)) {
System.out.println("----- task failed -----");
System.out.println("Error: " + getResponse.getStatus());
break;
} else {
System.out.printf("Current status: %s, Retrying in 10 seconds...", status);
TimeUnit.SECONDS.sleep(10);
}
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
System.err.println("Polling interrupted");
break;
}
}
}
}
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Go" key="cA15jN1HMM"><RenderMd content={`\`\`\`Go
package main
import (
"context"
"fmt"
"os"
"time"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
"github.com/volcengine/volcengine-go-sdk/volcengine"
)
func main() {
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
// Initialize the Ark client to read your API Key from an environment variable
client := arkruntime.NewClientWithApiKey(
// Get your API Key from the environment variable. This is the default mode and you can modify it as required
os.Getenv("ARK_API_KEY"),
// The base URL for model invocation
arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"),
)
ctx := context.Background()
// Replace with Model ID
modelEp := "doubao-seedance-1-0-lite-i2v-250428"
// Generate a task
fmt.Println("----- create request -----")
createReq := model.CreateContentGenerationTaskRequest{
Model: modelEp,
Ratio: volcengine.String("16:9"),
Duration: volcengine.Int64(5),
Watermark: volcengine.Bool(false),
Content: []*model.CreateContentGenerationContentItem{
{
// Combination of text prompt and parameters
Type: model.ContentGenerationContentItemTypeText,
Text: volcengine.String("[图1]戴着眼镜穿着蓝色T恤的男生和[图2]的柯基小狗,坐在[图3]的草坪上,视频卡通风格"),
},
{
// The URL of the first reference image
// # 1-4 reference images need to be provided
Type: model.ContentGenerationContentItemTypeImage,
ImageURL: &model.ImageURL{
URL: "https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_1.png",
},
Role: volcengine.String("reference_image"),
},
{
// The URL of the second reference image
Type: model.ContentGenerationContentItemTypeImage,
ImageURL: &model.ImageURL{
URL: "https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_2.png",
},
Role: volcengine.String("reference_image"),
},
{
// The URL of the third reference image
Type: model.ContentGenerationContentItemTypeImage,
ImageURL: &model.ImageURL{
URL: "https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_3.png",
},
Role: volcengine.String("reference_image"),
},
},
}
createResp, err := client.CreateContentGenerationTask(ctx, createReq)
if err != nil {
fmt.Printf("create content generation error: %v", err)
return
}
taskID := createResp.ID
fmt.Printf("Task Created with ID: %s", taskID)
// Polling query section
fmt.Println("----- polling task status -----")
for {
getReq := model.GetContentGenerationTaskRequest{ID: taskID}
getResp, err := client.GetContentGenerationTask(ctx, getReq)
if err != nil {
fmt.Printf("get content generation task error: %v", err)
return
}
status := getResp.Status
if status == "succeeded" {
fmt.Println("----- task succeeded -----")
fmt.Printf("Task ID: %s \\n", getResp.ID)
fmt.Printf("Model: %s \\n", getResp.Model)
fmt.Printf("Video URL: %s \\n", getResp.Content.VideoURL)
fmt.Printf("Completion Tokens: %d \\n", getResp.Usage.CompletionTokens)
fmt.Printf("Created At: %d, Updated At: %d", getResp.CreatedAt, getResp.UpdatedAt)
return
} else if status == "failed" {
fmt.Println("----- task failed -----")
if getResp.Error != nil {
fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Code, getResp.Error.Message)
}
return
} else {
fmt.Printf("Current status: %s, Retrying in 10 seconds... \\n", status)
time.Sleep(10 * time.Second)
}
}
}
\`\`\`
`}></RenderMd></Tabs.TabPane></Tabs>);
```
<span id="68fd42bf"></span>
## 管理视频任务
<span id="360a1a86"></span>
### 查询视频生成任务列表
该接口支持传入条件筛选参数,以查询符合条件的视频生成任务列表。
```mixin-react
return (<Tabs>
<Tabs.TabPane title="Curl" key="QxHAvY6Phh"><RenderMd content={`\`\`\`Bash
curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks?page_size=2&filter.status=succeeded& \\
-H "Content-Type: application/json" \\
-H "Authorization: Bearer $ARK_API_KEY"
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Python" key="xvfBJkdSMf"><RenderMd content={`\`\`\`Python
import os
from volcenginesdkarkruntime import Ark
client = Ark(api_key=os.environ.get("ARK_API_KEY"))
if __name__ == "__main__":
resp = client.content_generation.tasks.list(
page_size=3,
status="succeeded",
)
print(resp)
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Java" key="uyVqVPAfg2"><RenderMd content={`\`\`\`Java
package com.ark.sample;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.volcengine.ark.runtime.model.content.generation.ListContentGenerationTasksRequest;
import com.volcengine.ark.runtime.service.ArkService;
import java.util.concurrent.TimeUnit;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;
public class Sample {
static String apiKey = System.getenv("ARK_API_KEY");
static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS);
static Dispatcher dispatcher = new Dispatcher();
static ArkService service =
ArkService.builder()
.dispatcher(dispatcher)
.connectionPool(connectionPool)
.apiKey(apiKey)
.build();
public static void main(String[] args) throws JsonProcessingException {
ListContentGenerationTasksRequest req =
ListContentGenerationTasksRequest.builder().pageSize(3).status("succeeded").build();
service.listContentGenerationTasks(req).toString();
System.out.println(service.getContentGenerationTask(req));
// shutdown service after all requests is finished
service.shutdownExecutor();
}
}
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Go" key="WEQqkjtJQG"><RenderMd content={`\`\`\`Go
package main
import (
"context"
"fmt"
"os"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
"github.com/volcengine/volcengine-go-sdk/volcengine"
)
func main() {
client := arkruntime.NewClientWithApiKey(os.Getenv("ARK_API_KEY"))
ctx := context.Background()
req := model.ListContentGenerationTasksRequest{
PageSize: volcengine.Int(3),
Filter: &model.ListContentGenerationTasksFilter{
Status: volcengine.String("succeeded"),
},
}
resp, err := client.ListContentGenerationTasks(ctx, req)
if err != nil {
fmt.Printf("failed to list content generation tasks: %v\\n", err)
return
}
fmt.Printf("%+v\\n", resp)
}
\`\`\`
`}></RenderMd></Tabs.TabPane></Tabs>);
```
<span id="64914c89"></span>
### 删除或取消视频生成任务
取消排队中的视频生成任务,或者删除视频生成任务记录。
```mixin-react
return (<Tabs>
<Tabs.TabPane title="Curl" key="pcSYFHFPIW"><RenderMd content={`\`\`\`Bash
# Replace cgt-2025**** with the ID acquired from "Create Video Generation Task".
curl -X DELETE https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/cgt-2025**** \\
-H "Content-Type: application/json" \\
-H "Authorization: Bearer $ARK_API_KEY"
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Python" key="FFuaXAvSPo"><RenderMd content={`\`\`\`Python
import os
from volcenginesdkarkruntime import Ark
client = Ark(api_key=os.environ.get("ARK_API_KEY"))
if __name__ == "__main__":
try:
client.content_generation.tasks.delete(
task_id="cgt-2025****",
)
except Exception as e:
print(f"failed to delete task: {e}")
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Java" key="zRP4j5bXE9"><RenderMd content={`\`\`\`Java
package com.ark.sample;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.volcengine.ark.runtime.model.content.generation.DeleteContentGenerationTaskRequest;
import com.volcengine.ark.runtime.service.ArkService;
import java.util.concurrent.TimeUnit;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;
public class Sample {
static String apiKey = System.getenv("ARK_API_KEY");
static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS);
static Dispatcher dispatcher = new Dispatcher();
static ArkService service =
ArkService.builder()
.dispatcher(dispatcher)
.connectionPool(connectionPool)
.apiKey(apiKey)
.build();
public static void main(String[] args) throws JsonProcessingException {
DeleteContentGenerationTaskRequest req =
DeleteContentGenerationTaskRequest.builder()
.taskId("cgt-2025****")
.build();
service.deleteContentGenerationTask(req).toString();
service.shutdownExecutor();
}
}
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Go" key="BofVIYmGlW"><RenderMd content={`\`\`\`Go
package main
import (
"context"
"fmt"
"os"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
)
func main() {
client := arkruntime.NewClientWithApiKey(os.Getenv("ARK_API_KEY"))
ctx := context.Background()
req := model.DeleteContentGenerationTaskRequest{
ID: "cgt-2025****",
}
err := client.DeleteContentGenerationTask(ctx, req)
if err != nil {
fmt.Printf("delete content generation task error: %v\\n", err)
return
}
}
\`\`\`
`}></RenderMd></Tabs.TabPane></Tabs>);
```
<span id="9fe4cce0"></span>
## 设置视频输出规格【New】
支持通过 **resolution、ratio、duration、frames、seed、camera_fixed、watermark** 参数控制视频输出的规格。
:::warning
不同模型,可能对应支持不同的参数与取值,详见下方表格。当输入的参数或取值不符合所选的模型时,该参数将被忽略或触发报错。
* **新方式:** 在 request body 中直接传入参数。此方式为**强校验,** 若参数填写错误,模型会返回错误提示。
* **旧方式:** 在文本提示词后追加 \-\-[parameters]。此方式为**弱校验,** 若参数填写错误,模型将自动使用默认值且不会报错。
:::
* **新方式(推荐):在 request body 中直接传入参数**
```JSON
...
// Strongly recommended
// Specify the aspect ratio of the generated video as 16:9, duration as 5 seconds, resolution as 720p, seed as 11, and include a watermark. The camera is not fixed.
"model": "doubao-seedance-1-5-pro-251215",
"content": [
{
"type": "text",
"text": "小猫对着镜头打哈欠"
}
],
// All parameters must be written in full; abbreviations are not supported
"resolution": "720p",
"ratio":"16:9",
"duration": 5,
// "frames": 29, Either duration or frames is required
"seed": 11,
"camera_fixed": false,
"watermark": true
...
```
* **旧方式:在文本提示词后追加** **\-\-[parameters]**
```JSON
...
// Specify the aspect ratio of the generated video as 16:9, duration as 5 seconds, resolution as 720p, seed as 11, and include a watermark. The camera is not fixed.
"content": [
{
"type": "text",
"text": "小猫对着镜头打哈欠 --rs 720p --rt 16:9 --dur 5 --seed 11 --cf false --wm true"
// "text": "小猫对着镜头打哈欠 --resolution 720p --ratio 16:9 --duration 5 --seed 11 --camerafixed false --watermark true"
}
]
...
```
<span aceTableMode="list" aceTableWidth="2,4,4,4"></span>
| |doubao\-seedance\-1\-5\-pro |doubao\-seedance\-1\-0\-pro|doubao\-seedance\-1\-0\-lite\-t2v|\
| | |doubao\-seedance\-1\-0\-pro\-fast |doubao\-seedance\-1\-0\-lite\-i2v |
|---|---|---|---|
|resolution|* 480p|* 480p|* 480p|\
|分辨率 |* 720p|* 720p|* 720p|\
| |* 1080p |* 1080p |* 1080p`参考图场景不支持` |
|ratio|* 16:9|* 16:9|* 16:9|\
|宽高比 |* 4:3|* 4:3|* 4:3|\
| |* 1:1|* 1:1|* 1:1|\
| |* 3:4|* 3:4|* 3:4|\
| |* 9:16|* 9:16|* 9:16|\
| |* 21:9|* 21:9|* 21:9|\
| |* adaptive|* adaptive`文生视频场景不支持`|* adaptive`参考图和文生视频场景不支持`|\
| ||||\
| ||||\
| |---|---|---|\
| ||||\
| ||||\
| |480p 各画面比例的宽高像素值如下|480p 各画面比例的宽高像素值如下|480p 各画面比例的宽高像素值如下|\
| ||||\
| |* `16:9`864×496|* `16:9`864×480|* `16:9`864×480|\
| |* `4:3`752×560|* `4:3`736×544|* `4:3`736×544|\
| |* `1:1`640×640|* `1:1`640×640|* `1:1`640×640|\
| |* `3:4`560×752|* `3:4`544×736|* `3:4`544×736|\
| |* `9:16`496×864|* `9:16`480×864|* `9:16`480×864|\
| |* `21:9`992×432|* `21:9`960×416|* `21:9`960×416|\
| ||||\
| ||||\
| |---|---|---|\
| ||||\
| ||||\
| |720p 各画面比例的宽高像素值如下|720p 各画面比例的宽高像素值如下|720p 各画面比例的宽高像素值如下|\
| ||||\
| |* `16:9`1280×720|* `16:9`1248×704|* `16:9`1248×704|\
| |* `4:3`1112×834|* `4:3`1120×832|* `4:3`1120×832|\
| |* `1:1`960×960|* `1:1`960×960|* `1:1`960×960|\
| |* `3:4`834×1112|* `3:4`832×1120|* `3:4`832×1120|\
| |* `9:16`720×1280|* `9:16`704×1248|* `9:16`704×1248|\
| |* `21:9`1470×630|* `21:9`1504×640|* `21:9`1504×640|\
| ||||\
| ||||\
| |---|---|---|\
| ||||\
| ||||\
| |1080p 各画面比例的宽高像素值如下|1080p 各画面比例的宽高像素值如下|1080p 各画面比例的宽高像素值如下`参考图场景不支持`|\
| ||||\
| |* `16:9`1920×1080|* `16:9`1920×1088|* `16:9`1920×1088|\
| |* `4:3`1664×1248|* `4:3`1664×1248|* `4:3`1664×1248|\
| |* `1:1`1440×1440|* `1:1`1440×1440|* `1:1`1440×1440|\
| |* `3:4`1248×1664|* `3:4`1248×1664|* `3:4`1248×1664|\
| |* `9:16`1080×1920|* `9:16`1088×1920|* `9:16`1088×1920|\
| |* `21:9`2206×946 |* `21:9`2176×928 |* `21:9`2176×928 |
|duration|4 ~12 秒 |2 ~12 秒 |2 ~12 秒 |\
|生成视频时长(秒) | | | |
|frames|<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f359753773c94d97885008ca1223c9bc~tplv-goo7wpa0wc-image.image =20x) </span> |支持 [29, 289] 区间内所有满足 25 + 4n 格式的整数值,其中 n 为正整数。 |支持 [29, 289] 区间内所有满足 25 + 4n 格式的整数值,其中 n 为正整数。 |\
|生成视频帧数 | | | |
|seed|<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |\
|种子整数 | | | |
|camera_fixed|<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span>|\
|是否固定摄像头 | | |`参考图场景不支持` |
|watermark|<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ee51ce32c1914aed81ff95080bb7db1d~tplv-goo7wpa0wc-image.image =20x) </span> |\
|是否包含水印 | | | |
<span id="44236b6a"></span>
## 提示词建议
* **提示词 = 主体 + 运动, 背景 + 运动,镜头 + 运动 ...**
* 用简洁准确的自然语言写出你想要的效果。
* 如果有较为明确的效果预期,建议先用生图模型生成符合预期的图片,再用图生视频进行视频片段的生成。
* 文生视频会有较大的结果随机性,可以用于激发创作灵感
* 图生视频时请尽量上传高清高质量的图片,上传图片的质量对图生视频影响较大。
* 当生成的视频不符合预期时,建议修改提示词,将抽象描述换成具象描述,并注意删除不重要的部分,将重要内容前置。
* 更多提示词的使用技巧请参见 [Seedance-1.5-pro 提示词指南](/docs/82379/2168087)、[Seedance-1.0-pro&pro-fast 提示词指南](/docs/82379/1631633)、 [Seedance-1.0-lite 提示词指南](/docs/82379/1587797)。
<span id="e190e738"></span>
# 进阶使用
<span id="c3588bd1"></span>
## 离线推理
针对推理时延敏感度低(例如小时级响应)的场景,建议将 **service_tier** 设为 `flex`,一键切换至离线推理模式——价格仅为在线推理的 50%,显著降低业务成本。
注意根据业务场景设置合适的超时时间,超过该时间后任务将自动终止。
```mixin-react
return (<Tabs>
<Tabs.TabPane title="Python" key="FxnmuCZe0F"><RenderMd content={`\`\`\`Python
import os
import time
# Install SDK: pip install 'volcengine-python-sdk[ark]'
from volcenginesdkarkruntime import Ark
# Make sure that you have stored the API Key in the environment variable ARK_API_KEY
# Initialize the Ark client to read your API Key from an environment variable
client = Ark(
# This is the default path. You can configure it based on the service location
base_url="https://ark.cn-beijing.volces.com/api/v3",
# Get API Keyhttps://console.volcengine.com/ark/region:ark+cn-beijing/apikey
api_key=os.environ.get("ARK_API_KEY"),
)
if __name__ == "__main__":
print("----- create request -----")
create_result = client.content_generation.tasks.create(
model="doubao-seedance-1-5-pro-251215", # Replace with Model ID
content=[
{
# Combination of text prompt and parameters
"type": "text",
"text": "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动"
},
{
# The URL of the first frame image
"type": "image_url",
"image_url": {
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png"
}
}
],
ratio="adaptive",
duration=5,
watermark=False,
service_tier="flex",
execution_expires_after=172800,
)
print(create_result)
# Polling query section
print("----- polling task status -----")
task_id = create_result.id
while True:
get_result = client.content_generation.tasks.get(task_id=task_id)
status = get_result.status
if status == "succeeded":
print("----- task succeeded -----")
print(get_result)
break
elif status == "failed":
print("----- task failed -----")
print(f"Error: {get_result.error}")
break
else:
print(f"Current status: {status}, Retrying after 60 seconds...")
time.sleep(60)
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Java" key="w8VwFFAPaU"><RenderMd content={`\`\`\`Java
package com.ark.sample;
import com.volcengine.ark.runtime.model.content.generation.*;
import com.volcengine.ark.runtime.model.content.generation.CreateContentGenerationTaskRequest.Content;
import com.volcengine.ark.runtime.service.ArkService;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class ContentGenerationTaskExample {
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
// Initialize the Ark client to read your API Key from an environment variable
static String apiKey = System.getenv("ARK_API_KEY");
static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS);
static Dispatcher dispatcher = new Dispatcher();
static ArkService service = ArkService.builder()
.baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation
.dispatcher(dispatcher)
.connectionPool(connectionPool)
.apiKey(apiKey)
.build();
public static void main(String[] args) {
String model = "doubao-seedance-1-5-pro-251215"; // Replace with Model ID
String ratio = "adaptive";
Long duration = 5L;
Boolean watermark = false;
String serviceTier = "flex";
Long executionExpiresAfter = 172800L;
System.out.println("----- create request -----");
List<Content> contents = new ArrayList<>();
// Combination of text prompt and parameters
contents.add(Content.builder()
.type("text")
.text("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动")
.build());
// The URL of the first frame image
contents.add(Content.builder()
.type("image_url")
.imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
.url("https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png")
.build())
.build());
// Create a video generation task
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
.model(model)
.content(contents)
.ratio(ratio)
.duration(duration)
.watermark(watermark)
.serviceTier(serviceTier)
.executionExpiresAfter(executionExpiresAfter)
.build();
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
System.out.println(createResult);
// Get the details of the task
String taskId = createResult.getId();
GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
.taskId(taskId)
.build();
// Polling query section
System.out.println("----- polling task status -----");
while (true) {
try {
GetContentGenerationTaskResponse getResponse = service.getContentGenerationTask(getRequest);
String status = getResponse.getStatus();
if ("succeeded".equalsIgnoreCase(status)) {
System.out.println("----- task succeeded -----");
System.out.println(getResponse);
break;
} else if ("failed".equalsIgnoreCase(status)) {
System.out.println("----- task failed -----");
System.out.println("Error: " + getResponse.getStatus());
break;
} else {
System.out.printf("Current status: %s, Retrying in 60 seconds...", status);
TimeUnit.SECONDS.sleep(60);
}
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
System.err.println("Polling interrupted");
break;
}
}
}
}
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Go" key="aS5odaF5rN"><RenderMd content={`\`\`\`Go
package main
import (
"context"
"fmt"
"os"
"time"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
"github.com/volcengine/volcengine-go-sdk/volcengine"
)
func main() {
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
// Initialize the Ark client to read your API Key from an environment variable
client := arkruntime.NewClientWithApiKey(
// Get your API Key from the environment variable. This is the default mode and you can modify it as required
os.Getenv("ARK_API_KEY"),
// The base URL for model invocation
arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"),
)
ctx := context.Background()
// Replace with Model ID
modelEp := "doubao-seedance-1-5-pro-251215"
// Generate a task
fmt.Println("----- create request -----")
createReq := model.CreateContentGenerationTaskRequest{
Model: modelEp,
Ratio: volcengine.String("adaptive"),
Duration: volcengine.Int64(5),
Watermark: volcengine.Bool(false),
ServiceTier: volcengine.String("flex"),
ExecutionExpiresAfter: volcengine.Int64(172800),
Content: []*model.CreateContentGenerationContentItem{
{
// Combination of text prompt and parameters
Type: model.ContentGenerationContentItemTypeText,
Text: volcengine.String("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动"),
},
{
// The URL of the first frame image
Type: model.ContentGenerationContentItemTypeImage,
ImageURL: &model.ImageURL{
URL: "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png",
},
},
},
}
createResp, err := client.CreateContentGenerationTask(ctx, createReq)
if err != nil {
fmt.Printf("create content generation error: %v", err)
return
}
taskID := createResp.ID
fmt.Printf("Task Created with ID: %s", taskID)
// Polling query section
fmt.Println("----- polling task status -----")
for {
getReq := model.GetContentGenerationTaskRequest{ID: taskID}
getResp, err := client.GetContentGenerationTask(ctx, getReq)
if err != nil {
fmt.Printf("get content generation task error: %v", err)
return
}
status := getResp.Status
if status == "succeeded" {
fmt.Println("----- task succeeded -----")
fmt.Printf("Task ID: %s \\n", getResp.ID)
fmt.Printf("Model: %s \\n", getResp.Model)
fmt.Printf("Video URL: %s \\n", getResp.Content.VideoURL)
fmt.Printf("Completion Tokens: %d \\n", getResp.Usage.CompletionTokens)
fmt.Printf("Created At: %d, Updated At: %d", getResp.CreatedAt, getResp.UpdatedAt)
return
} else if status == "failed" {
fmt.Println("----- task failed -----")
if getResp.Error != nil {
fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Code, getResp.Error.Message)
}
return
} else {
fmt.Printf("Current status: %s, Retrying in 60 seconds... \\n", status)
time.Sleep(60 * time.Second)
}
}
}
\`\`\`
`}></RenderMd></Tabs.TabPane></Tabs>);
```
<span id="5acd28c8"></span>
## 样片模式
获得一个符合预期的生产级别视频通常需要多次抽卡耗时耗力。Draft 样片模式是平台推出的中间产物可视化功能,开启该功能后,将生成一段预览视频,帮助用户 **低成本验证** 生成视频的场景结构、镜头调度、主体动作与 Prompt 意图等关键要素是否符合预期,快速调整方向。确认符合预期后,再基于 Draft 视频生成最终的高质量视频。
<span aceTableMode="list" aceTableWidth="3,3,3"></span>
|输入 |Draft 视频 |正式视频 |
|---|---|---|
|<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ebb5217645b04cfc94209a6f7d36a523~tplv-goo7wpa0wc-image.image =240x) </span>|<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1c92b2d2fb1749d28a21ad56d46bd2d1~tplv-goo7wpa0wc-image.image" controls></video>|<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1aa51109dee44b8a9b263f713754dd40~tplv-goo7wpa0wc-image.image" controls></video>|\
|> 提示词:女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动,可以听到风声 |||\
| |> 生成一段预览视频,低成本验证结果。 |> 复用 Draft 视频使用 **模型、提示词、输入图片、种子值、音频设置、视频宽高比、视频时长等** 生成正式视频,保证视频关键要素一致。 |
本功能使用分为两步:
<span id="13ae3900"></span>
### Step1: 生成 Draft 视频
1. 设置 `"draft": true`,调用`POST /contents/generations/tasks`接口创建 Draft 视频生成任务。
2. 调用`GET /contents/generations/tasks/{id}`接口查询生成状态和结果,下载 Draft 视频,确认是否符合预期。
:::tip
* 仅 Seedance 1.5 pro 支持该功能。
* 仅支持 480p 分辨率(使用其他分辨率会报错),不支持返回尾帧功能,不支持离线推理功能。
* Draft 视频的 token 单价不变,消耗的 token 更少。`Draft视频token用量 = 正常视频token用量 × 折算系数`,以 Seedance 1.5 pro 为例,有声视频的折算系数为 0.6,故生成一个 Draft 有声视频的价格是正常视频的 0.6 倍,显著降低了成本。
:::
```mixin-react
return (<Tabs>
<Tabs.TabPane title="Curl" key="b7pWB7Kiur"><RenderMd content={`1. 创建 Draft 视频生成任务。
\`\`\`Bash
curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \\
-H "Content-Type: application/json" \\
-H "Authorization: Bearer $ARK_API_KEY" \\
-d '{
"model": "doubao-seedance-1-5-pro-251215",
"content": [
{
"type": "text",
"text": "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动"
},
{
"type": "image_url",
"image_url": {
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png"
}
}
],
"seed": 20,
"duration": 6,
"draft": true
}'
\`\`\`
请求成功后,系统将返回一个任务 ID。此 ID 即为 Draft 视频任务 ID后续需基于这个 ID 生成最终视频。
2. 使用 Draft 视频任务 ID查询生成状态和结果
\`\`\`Bash
# Replace cgt-2026****-pzjqb with the ID acquired from last step
curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/cgt-2026****-pzjqb \\
-H "Content-Type: application/json" \\
-H "Authorization: Bearer $ARK_API_KEY"
\`\`\`
当任务状态变为 succeeded 后,您可在 content.**video_url** 字段处,下载生成的 Draft 视频文件,检视效果是否符合预期。若不符合预期,可重新调整参数并再次创建 Draft 视频生成任务。当确认 Draft 视频效果符合预期后,即可按照后续步骤生成最终视频。
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Python" key="mGZzjBTzc9"><RenderMd content={`1. 创建 Draft 视频任务并轮询任务状态;
2. 当任务状态变为 \`succeeded\`后,您可在 content.**video_url** 字段处,下载生成的 Draft 视频文件,检视效果是否符合预期。若不符合预期,可重新调整参数并再次创建 Draft 视频生成任务。当确认 Draft 视频效果符合预期后,即可按照后续步骤生成最终视频。
\`\`\`Python
import os
import time
# Install SDK: pip install 'volcengine-python-sdk[ark]'
from volcenginesdkarkruntime import Ark
# Make sure that you have stored the API Key in the environment variable ARK_API_KEY
# Initialize the Ark client to read your API Key from an environment variable
client = Ark(
# This is the default path. You can configure it based on the service location
base_url="https://ark.cn-beijing.volces.com/api/v3",
# Get API Keyhttps://console.volcengine.com/ark/region:ark+cn-beijing/apikey
api_key=os.environ.get("ARK_API_KEY"),
)
if __name__ == "__main__":
print("----- create request -----")
create_result = client.content_generation.tasks.create(
model="doubao-seedance-1-5-pro-251215", # Replace with Model ID
content=[
{
# Combination of text prompt and parameters
"type": "text",
"text": "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动"
},
{
# The URL of the first frame image
"type": "image_url",
"image_url": {
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png"
}
}
],
seed= 20,
duration= 6,
draft= True,
)
print(create_result)
# Polling query section
print("----- polling task status -----")
task_id = create_result.id
while True:
get_result = client.content_generation.tasks.get(task_id=task_id)
status = get_result.status
if status == "succeeded":
print("----- task succeeded -----")
print(get_result)
break
elif status == "failed":
print("----- task failed -----")
print(f"Error: {get_result.error}")
break
else:
print(f"Current status: {status}, Retrying after 10 seconds...")
time.sleep(10)
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Java" key="APeJMCL5TZ"><RenderMd content={`1. 创建 Draft 视频任务并轮询任务状态;
2. 当任务状态变为 \`succeeded\`后,您可在 content.**video_url** 字段处,下载生成的 Draft 视频文件,检视效果是否符合预期。若不符合预期,可重新调整参数并再次创建 Draft 视频生成任务。当确认 Draft 视频效果符合预期后,即可按照后续步骤生成最终视频。
\`\`\`Java
package com.ark.sample;
import com.volcengine.ark.runtime.model.content.generation.*;
import com.volcengine.ark.runtime.model.content.generation.CreateContentGenerationTaskRequest.Content;
import com.volcengine.ark.runtime.service.ArkService;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class ContentGenerationTaskExample {
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
// Initialize the Ark client to read your API Key from an environment variable
static String apiKey = System.getenv("ARK_API_KEY");
static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS);
static Dispatcher dispatcher = new Dispatcher();
static ArkService service = ArkService.builder()
.baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation
.dispatcher(dispatcher)
.connectionPool(connectionPool)
.apiKey(apiKey)
.build();
public static void main(String[] args) {
String model = "doubao-seedance-1-5-pro-251215"; // Replace with Model ID
Long seed = 20L;
Long duration = 6L;
Boolean draft = true;
System.out.println("----- create request -----");
List<Content> contents = new ArrayList<>();
// Combination of text prompt and parameters
contents.add(Content.builder()
.type("text")
.text("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动")
.build());
// The URL of the first frame image
contents.add(Content.builder()
.type("image_url")
.imageUrl(CreateContentGenerationTaskRequest.ImageUrl.builder()
.url("https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png")
.build())
.build());
// Create a video generation task
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
.model(model)
.content(contents)
.seed(seed)
.duration(duration)
.draft(draft)
.build();
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
System.out.println(createResult);
// Get the details of the task
String taskId = createResult.getId();
GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
.taskId(taskId)
.build();
// Polling query section
System.out.println("----- polling task status -----");
while (true) {
try {
GetContentGenerationTaskResponse getResponse = service.getContentGenerationTask(getRequest);
String status = getResponse.getStatus();
if ("succeeded".equalsIgnoreCase(status)) {
System.out.println("----- task succeeded -----");
System.out.println(getResponse);
break;
} else if ("failed".equalsIgnoreCase(status)) {
System.out.println("----- task failed -----");
System.out.println("Error: " + getResponse.getStatus());
break;
} else {
System.out.printf("Current status: %s, Retrying in 10 seconds...", status);
TimeUnit.SECONDS.sleep(10);
}
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
System.err.println("Polling interrupted");
break;
}
}
}
}
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Go" key="SdHXO0O9i4"><RenderMd content={`1. 创建 Draft 视频任务并轮询任务状态;
2. 当任务状态变为 \`succeeded\`后,您可在 content.**video_url** 字段处,下载生成的 Draft 视频文件,检视效果是否符合预期。若不符合预期,可重新调整参数并再次创建 Draft 视频生成任务。当确认 Draft 视频效果符合预期后,即可按照后续步骤生成最终视频。
\`\`\`Go
package main
import (
"context"
"fmt"
"time"
"os"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
"github.com/volcengine/volcengine-go-sdk/volcengine"
)
func main() {
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
// Initialize the Ark client to read your API Key from an environment variable
client := arkruntime.NewClientWithApiKey(
// Get your API Key from the environment variable. This is the default mode and you can modify it as required
os.Getenv("ARK_API_KEY"),
// The base URL for model invocation
arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"),
)
ctx := context.Background()
// Replace with Model ID
modelEp := "doubao-seedance-1-5-pro-251215"
// Generate a task
fmt.Println("----- create request -----")
createReq := model.CreateContentGenerationTaskRequest{
Model: modelEp,
Seed: volcengine.Int64(20),
Duration: volcengine.Int64(6),
Draft: volcengine.Bool(true),
Content: []*model.CreateContentGenerationContentItem{
{
// Combination of text prompt and parameters
Type: model.ContentGenerationContentItemTypeText,
Text: volcengine.String("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动"),
},
{
// The URL of the first frame image
Type: model.ContentGenerationContentItemTypeImage,
ImageURL: &model.ImageURL{
URL: "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png",
},
},
},
}
createResp, err := client.CreateContentGenerationTask(ctx, createReq)
if err != nil {
fmt.Printf("create content generation error: %v", err)
return
}
taskID := createResp.ID
fmt.Printf("Task Created with ID: %s", taskID)
// Polling query section
fmt.Println("----- polling task status -----")
for {
getReq := model.GetContentGenerationTaskRequest{ID: taskID}
getResp, err := client.GetContentGenerationTask(ctx, getReq)
if err != nil {
fmt.Printf("get content generation task error: %v", err)
return
}
status := getResp.Status
if status == "succeeded" {
fmt.Println("----- task succeeded -----")
fmt.Printf("Task ID: %s \\n", getResp.ID)
fmt.Printf("Model: %s \\n", getResp.Model)
fmt.Printf("Video URL: %s \\n", getResp.Content.VideoURL)
fmt.Printf("Completion Tokens: %d \\n", getResp.Usage.CompletionTokens)
fmt.Printf("Created At: %d, Updated At: %d", getResp.CreatedAt, getResp.UpdatedAt)
return
} else if status == "failed" {
fmt.Println("----- task failed -----")
if getResp.Error != nil {
fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Code, getResp.Error.Message)
}
return
} else {
fmt.Printf("Current status: %s, Retrying in 10 seconds... \\n", status)
time.Sleep(10 * time.Second)
}
}
}
\`\`\`
`}></RenderMd></Tabs.TabPane></Tabs>);
```
<span id="015173ef"></span>
### Step2: 基于 Draft 视频生成正式视频
如果确认 Draft 视频符合预期,可基于 Step1 返回的 Draft 视频任务 ID再次调用`POST /contents/generations/tasks`接口,生成最终视频。
:::tip
* 平台将自动复用 Draft 视频使用的用户输入( **model、** content.**text、** content.**image_url、generate_audio、seed、ratio、duration、camera_fixed** ),生成正式视频。
* 其余参数支持指定,不指定将使用本模型的默认值。例如:指定正式视频的分辨率、是否包含水印、是否使用离线推理、是否返回尾帧等。
* 基于 Draft 视频生成最终视频属于正常推理过程,按照正常视频消耗 token 量计费。
* Draft 视频任务 ID 的有效期为 7 天(从 **created at** 时间戳开始计算),超时后将无法使用该 Draft 视频生成正式视频。
:::
```mixin-react
return (<Tabs>
<Tabs.TabPane title="Curl" key="N9ThhrbaV9"><RenderMd content={`1. 基于 \`content.draft_task.id\` 创建视频生成任务。
\`\`\`Bash
curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks \\
-H "Content-Type: application/json" \\
-H "Authorization: Bearer $ARK_API_KEY" \\
-d '{
"model": "doubao-seedance-1-5-pro-251215",
"content": [
{
"type": "draft_task",
"draft_task": {"id": "cgt-2026****-pzjqb"}
}
],
"watermark": false,
"resolution": "720p",
"return_last_frame": true,
"service_tier": "default"
}'
\`\`\`
请求成功后,系统将返回一个任务 ID。
2. 使用视频任务 ID查询生成状态和结果
\`\`\`Bash
# Replace cgt-2026****-bn6zj with the ID acquired from last step
curl https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/cgt-2026****-bn6zj \\
-H "Content-Type: application/json" \\
-H "Authorization: Bearer $ARK_API_KEY"
\`\`\`
当任务状态变为 succeeded 后,您可在 content.**video_url** 字段处,下载生成的视频文件。
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Python" key="fTIWNoOAdT"><RenderMd content={`1. 基于\`content.draft_task.id\` (此 ID 通过 Step1 的返回信息获取)创建视频生成任务并轮询获取任务状态;
2. 当任务状态变为 \`succeeded\` 后,您可在 content.**video_url** 字段处,下载生成的视频文件。
\`\`\`Python
import os
import time
# Install SDK: pip install 'volcengine-python-sdk[ark]'
from volcenginesdkarkruntime import Ark
# Make sure that you have stored the API Key in the environment variable ARK_API_KEY
# Initialize the Ark client to read your API Key from an environment variable
client = Ark(
# This is the default path. You can configure it based on the service location
base_url="https://ark.cn-beijing.volces.com/api/v3",
# Get API Keyhttps://console.volcengine.com/ark/region:ark+cn-beijing/apikey
api_key=os.environ.get("ARK_API_KEY"),
)
if __name__ == "__main__":
print("----- create request -----")
create_result = client.content_generation.tasks.create(
model="doubao-seedance-1-5-pro-251215", # Replace with Model ID
content=[
{
"type": "draft_task",
"draft_task": {
"id": "cgt-2026****-pzjqb"
}
}
],
watermark= False,
resolution= "720p",
return_last_frame= True,
service_tier= "default",
)
print(create_result)
# Polling query section
print("----- polling task status -----")
task_id = create_result.id
while True:
get_result = client.content_generation.tasks.get(task_id=task_id)
status = get_result.status
if status == "succeeded":
print("----- task succeeded -----")
print(get_result)
break
elif status == "failed":
print("----- task failed -----")
print(f"Error: {get_result.error}")
break
else:
print(f"Current status: {status}, Retrying after 10 seconds...")
time.sleep(10)
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Java" key="r9TfYnhxy4"><RenderMd content={`1. 基于\`content.draft_task.id\` (此 ID 通过 Step1 的返回信息获取)创建视频生成任务并轮询获取任务状态;
2. 当任务状态变为 \`succeeded\` 后,您可在 content.**video_url** 字段处,下载生成的视频文件。
\`\`\`Java
package com.ark.sample;
import com.volcengine.ark.runtime.model.content.generation.*;
import com.volcengine.ark.runtime.model.content.generation.CreateContentGenerationTaskRequest.Content;
import com.volcengine.ark.runtime.service.ArkService;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class ContentGenerationTaskExample {
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
// Initialize the Ark client to read your API Key from an environment variable
static String apiKey = System.getenv("ARK_API_KEY");
static ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS);
static Dispatcher dispatcher = new Dispatcher();
static ArkService service = ArkService.builder()
.baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation
.dispatcher(dispatcher)
.connectionPool(connectionPool)
.apiKey(apiKey)
.build();
public static void main(String[] args) {
String model = "doubao-seedance-1-5-pro-251215"; // Replace with Model ID
Boolean watermark = false;
String resolution = "720p";
Boolean returnLastFrame = true;
String serviceTier = "default";
System.out.println("----- create request -----");
List<Content> contents = new ArrayList<>();
// Combination of text prompt and parameters
contents.add(Content.builder()
.type("draft_task")
.draftTask(CreateContentGenerationTaskRequest.DraftTask.builder()
.id("cgt-2026****-pzjqb")
.build())
.build());
// Create a video generation task
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
.model(model)
.content(contents)
.watermark(watermark)
.resolution(resolution)
.returnLastFrame(returnLastFrame)
.serviceTier(serviceTier)
.build();
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
System.out.println(createResult);
// Get the details of the task
String taskId = createResult.getId();
GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
.taskId(taskId)
.build();
// Polling query section
System.out.println("----- polling task status -----");
while (true) {
try {
GetContentGenerationTaskResponse getResponse = service.getContentGenerationTask(getRequest);
String status = getResponse.getStatus();
if ("succeeded".equalsIgnoreCase(status)) {
System.out.println("----- task succeeded -----");
System.out.println(getResponse);
break;
} else if ("failed".equalsIgnoreCase(status)) {
System.out.println("----- task failed -----");
System.out.println("Error: " + getResponse.getStatus());
break;
} else {
System.out.printf("Current status: %s, Retrying in 10 seconds...", status);
TimeUnit.SECONDS.sleep(10);
}
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
System.err.println("Polling interrupted");
break;
}
}
}
}
\`\`\`
`}></RenderMd></Tabs.TabPane>
<Tabs.TabPane title="Go" key="mqElFrgHUZ"><RenderMd content={`1. 基于\`content.draft_task.id\` (此 ID 通过 Step1 的返回信息获取)创建视频生成任务并轮询获取任务状态;
2. 当任务状态变为 \`succeeded\` 后,您可在 content.**video_url** 字段处,下载生成的视频文件。
\`\`\`Go
package main
import (
"context"
"fmt"
"time"
"os"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime"
"github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
"github.com/volcengine/volcengine-go-sdk/volcengine"
)
func main() {
// Make sure that you have stored the API Key in the environment variable ARK_API_KEY
// Initialize the Ark client to read your API Key from an environment variable
client := arkruntime.NewClientWithApiKey(
// Get your API Key from the environment variable. This is the default mode and you can modify it as required
os.Getenv("ARK_API_KEY"),
// The base URL for model invocation
arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"),
)
ctx := context.Background()
// Replace with Model ID
modelEp := "doubao-seedance-1-5-pro-251215"
// Generate a task
fmt.Println("----- create request -----")
createReq := model.CreateContentGenerationTaskRequest{
Model: modelEp,
Watermark: volcengine.Bool(false),
Resolution: volcengine.String("720p"),
ReturnLastFrame: volcengine.Bool(true),
ServiceTier: volcengine.String("default"),
Content: []*model.CreateContentGenerationContentItem{
{
Type: model.ContentGenerationContentItemTypeDraftTask,
DraftTask: &model.DraftTask{ID: "cgt-2026****-pzjqb"},
},
},
}
createResp, err := client.CreateContentGenerationTask(ctx, createReq)
if err != nil {
fmt.Printf("create content generation error: %v", err)
return
}
taskID := createResp.ID
fmt.Printf("Task Created with ID: %s", taskID)
// Polling query section
fmt.Println("----- polling task status -----")
for {
getReq := model.GetContentGenerationTaskRequest{ID: taskID}
getResp, err := client.GetContentGenerationTask(ctx, getReq)
if err != nil {
fmt.Printf("get content generation task error: %v", err)
return
}
status := getResp.Status
if status == "succeeded" {
fmt.Println("----- task succeeded -----")
fmt.Printf("Task ID: %s \\n", getResp.ID)
fmt.Printf("Model: %s \\n", getResp.Model)
fmt.Printf("Video URL: %s \\n", getResp.Content.VideoURL)
fmt.Printf("Completion Tokens: %d \\n", getResp.Usage.CompletionTokens)
fmt.Printf("Created At: %d, Updated At: %d", getResp.CreatedAt, getResp.UpdatedAt)
return
} else if status == "failed" {
fmt.Println("----- task failed -----")
if getResp.Error != nil {
fmt.Printf("Error Code: %s, Message: %s", getResp.Error.Code, getResp.Error.Message)
}
return
} else {
fmt.Printf("Current status: %s, Retrying in 10 seconds... \\n", status)
time.Sleep(10 * time.Second)
}
}
}
\`\`\`
`}></RenderMd></Tabs.TabPane></Tabs>);
```
<span id="141cf7fa"></span>
## 生成多个连续视频
使用前一个生成视频的尾帧,作为后一个视频任务的首帧,循环生成多个连续的视频。
后续您可以自行使用 FFmpeg 等工具,将生成的多个短视频拼接成一个完整长视频。
<span aceTableMode="list" aceTableWidth="1,1,1"></span>
|输出1 |输出2 |输出3 |
|---|---|---|
|<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/09e5e4cf5aed462fb426ab9ce1eec485~tplv-goo7wpa0wc-image.image" controls></video>|<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/d3f181984db040ac98d4d16f5c0115e6~tplv-goo7wpa0wc-image.image" controls></video>|<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/4bc452920fa94ffc838d871c2619323b~tplv-goo7wpa0wc-image.image" controls></video>|\
||||\
|> 女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动 |> 女孩和狐狸在草地上奔跑,阳光明媚,女孩的笑容灿烂,狐狸欢快地跳跃 |> 女孩和狐狸坐在树下休息,女孩轻轻抚摸狐狸的毛发,狐狸温顺地趴在女孩腿上 |
```Python
import os
import time
# Install SDK: pip install 'volcengine-python-sdk[ark]'
from volcenginesdkarkruntime import Ark
# Make sure that you have stored the API Key in the environment variable ARK_API_KEY
# Initialize the Ark client to read your API Key from an environment variable
client = Ark(
# This is the default path. You can configure it based on the service location
base_url="https://ark.cn-beijing.volces.com/api/v3",
# Get API Keyhttps://console.volcengine.com/ark/region:ark+cn-beijing/apikey
api_key=os.environ.get("ARK_API_KEY"),
)
def generate_video_with_last_frame(prompt, initial_image_url=None):
"""
Generate video and return video URL and last frame URL
Parameters:
prompt: Text prompt for video generation
initial_image_url: Initial image URL (optional)
Returns:
video_url: Generated video URL
last_frame_url: URL of the last frame of the video
"""
print(f"----- Generating video: {prompt} -----")
# Build content list
content = [{
"text": prompt,
"type": "text"
}]
# If initial image is provided, add to content
if initial_image_url:
content.append({
"image_url": {
"url": initial_image_url
},
"type": "image_url"
})
# Create video generation task
create_result = client.content_generation.tasks.create(
model="doubao-seedance-1-5-pro-251215", # Replace with Model ID
content=content,
return_last_frame=True,
ratio="adaptive",
duration=5,
watermark=False,
)
# Poll to check task status
task_id = create_result.id
while True:
get_result = client.content_generation.tasks.get(task_id=task_id)
status = get_result.status
if get_result.status == "succeeded":
print("Video generation succeeded")
try:
if hasattr(get_result, 'content') and hasattr(get_result.content, 'video_url') and hasattr(get_result.content, 'last_frame_url'):
return get_result.content.video_url, get_result.content.last_frame_url
print("Failed to obtain video URL or last frame URL")
return None, None
except Exception as e:
print(f"Error occurred while obtaining video URL and last frame URL: {e}")
return None, None
elif status == "failed":
print(f"----- Video generation failed -----")
print(f"Error: {get_result.error}")
return None, None
else:
print(f"Current status: {status}, retrying in 10 seconds...")
time.sleep(10)
if __name__ == "__main__":
# Define 3 video prompts
prompts = [
"女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动",
"女孩和狐狸在草地上奔跑,阳光明媚,女孩的笑容灿烂,狐狸欢快地跳跃",
"女孩和狐狸坐在树下休息,女孩轻轻抚摸狐狸的毛发,狐狸温顺地趴在女孩腿上"
]
# Store generated video URLs
video_urls = []
# Initial image URL
initial_image_url = "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png"
# Generate 3 short videos
for i, prompt in enumerate(prompts):
print(f"Generating video {i+1}")
video_url, last_frame_url = generate_video_with_last_frame(prompt, initial_image_url)
if video_url and last_frame_url:
video_urls.append(video_url)
print(f"Video {i+1} URL: {video_url}")
# Use the last frame of the current video as the first frame of the next video
initial_image_url = last_frame_url
else:
print(f"Video {i+1} generation failed, exiting program")
exit(1)
print("All videos generated successfully!")
print("Generated video URL list:")
for i, url in enumerate(video_urls):
print(f"Video {i+1}: {url}")
```
<span id="caf01f12"></span>
## 使用 Webhook 通知
通过 **callback_url** 参数可以指定一个回调通知地址,当视频生成任务的状态发生变化时,方舟会向该地址发送一条 POST 请求,方便您及时获取任务最新情况。 请求内容结构与[查询任务API](https://www.volcengine.com/docs/82379/1521309)的返回体一致。
```Bash
{
"id": "cgt-2025****",
"model": "doubao-seedance-1-5-pro-251215",
"status": "running", # Possible status values: queued, running, succeeded, failed, expired
"created_at": 1765434920,
"updated_at": 1765434920,
"service_tier": "default",
"execution_expires_after": 172800
}
```
您需要自行搭建一个公网可访问的 Web Server 来接收 Webhook 通知。以下是一个简单的 Web Server 代码示例,供您参考。
```Python
# Building a Simple Web Server with Python Flask for Webhook Notification Processing
from flask import Flask, request, jsonify
import sqlite3
import logging
from datetime import datetime
import os
# === Basic Configuration ===
app = Flask(__name__)
# Configure logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[logging.FileHandler('webhook.log'), logging.StreamHandler()]
)
# Database path
DB_PATH = 'video_tasks.db'
# === Database Initialization ===
def init_db():
"""Automatically create task table on first run, aligning fields with callback parameters"""
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
# Create table: task_id as primary key for idempotent updates
cursor.execute('''
CREATE TABLE IF NOT EXISTS video_generation_tasks (
task_id TEXT PRIMARY KEY,
model TEXT NOT NULL,
status TEXT NOT NULL,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
service_tier TEXT NOT NULL,
execution_expires_after INTEGER NOT NULL,
last_callback_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
conn.commit()
conn.close()
logging.info("Database initialized, table created/exists")
# === Core Webhook Interface ===
@app.route('/webhook/callback', methods=['POST'])
def video_task_callback():
"""Core interface for receiving Ark callback"""
try:
# 1. Parse callback request body (JSON format)
callback_data = request.get_json()
if not callback_data:
logging.error("Callback request body empty or non-JSON format")
return jsonify({"code": 400, "msg": "Invalid JSON data"}), 400
# 2. Validate required fields
required_fields = ['id', 'model', 'status', 'created_at', 'updated_at', 'service_tier', 'execution_expires_after']
for field in required_fields:
if field not in callback_data:
logging.error(f"Callback data missing required field: {field}, data: {callback_data}")
return jsonify({"code": 400, "msg": f"Missing field: {field}"}), 400
# 3. Extract key information and log
task_id = callback_data['id']
status = callback_data['status']
model = callback_data['model']
logging.info(f"Received task callback | Task ID: {task_id} | Status: {status} | Model: {model}")
print(f"[{datetime.now()}] Task {task_id} status updated to: {status}") # Console output
# 4. Database operation
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
cursor.execute('''
INSERT OR REPLACE INTO video_generation_tasks (
task_id, model, status, created_at, updated_at, service_tier, execution_expires_after
) VALUES (?, ?, ?, ?, ?, ?, ?)
''', (
task_id,
model,
status,
callback_data['created_at'],
callback_data['updated_at'],
callback_data['service_tier'],
callback_data['execution_expires_after']
))
conn.commit()
conn.close()
logging.info(f"Task {task_id} database update successful")
# 5. Return 200 response
return jsonify({"code": 200, "msg": "Callback received successfully", "task_id": task_id}), 200
except Exception as e:
# Catch all exceptions to avoid returning 5xx
logging.error(f"Callback processing failed: {str(e)}", exc_info=True)
return jsonify({"code": 200, "msg": "Callback received successfully (internal processing exception)"}), 200
# === Helper Interface (Optional, for querying task status) ===
@app.route('/tasks/<task_id>', methods=['GET'])
def get_task_status(task_id):
"""Query latest status of specified task"""
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
cursor.execute('SELECT * FROM video_generation_tasks WHERE task_id = ?', (task_id,))
task = cursor.fetchone()
conn.close()
if not task:
return jsonify({"code": 404, "msg": "Task not found"}), 404
# Map field names for response
fields = ['task_id', 'model', 'status', 'created_at', 'updated_at', 'service_tier', 'execution_expires_after', 'last_callback_at']
task_dict = dict(zip(fields, task))
return jsonify({"code": 200, "data": task_dict}), 200
# === Service Startup ===
if __name__ == '__main__':
# Initialize database
init_db()
# Start Flask service (bind to 0.0.0.0 for public access, port customizable)
# Test environment: debug=True; Production environment should disable debug and use gunicorn
app.run(host='0.0.0.0', port=8080, debug=False)
```
<span id="66cb028f"></span>
# 使用限制
<span id="2760a484"></span>
## 保存时间
任务数据如任务状态、视频URL等仅保留24小时超时后会被自动清除。请您务必及时保存生成的视频。
<span id="b25b1821"></span>
## 限流说明
**模型限流**
**default在线推理**
* RPM 限流:账号下同模型(区分模型版本)每分钟允许创建的任务数量上限。若超过该限制,创建视频生成任务时会报错。
* 并发数限制:账号下同模型(区分模型版本)同一时刻在处理中的任务数量上限。超过此限制的任务将进入队列等待处理。
* 不同模型的限制值不同,详见[视频生成能力](/docs/82379/1330310#2705b333)。
**flex离线推理**
* TPD 限流:账号在一天内对同一模型(区分模型版本)的总调用 token 上限。超过此限制的调用请求将被拒绝。不同模型的 TPD 限流值不同,详见[视频生成能力](/docs/82379/1330310#2705b333)。
<span id="f76aafc8"></span>
## 图片裁剪规则
**Seedance 系列模型的图生视频场景,支持设置生成视频的宽高比。** 当选择的视频宽高与您上传的图片宽高比不一致时,方舟会对您的图片进行裁剪,裁剪时会居中裁剪。详细规则如下:
:::tip
若要呈现出较好的视频效果建议所指定的视频宽高比ratio与实际上传图片的宽高比尽可能接近。
:::
1. 输入参数:
* 原始图片宽度记为`W`(单位:像素),高度记为`H`(单位:像素)。
* 目标比例记为`A:B`例如21:9这表示裁剪后的宽度与高度之比应为 `A/B`(如 21/9≈2.333)。
2. 比较宽高比:
* 计算原始图片的宽高比`Ratio_原始=W/H`。
* 计算目标比例的比值`Ratio_目标=A/B`例如21:9 的 Ratio目标=21/9≈2.333)。
* 根据比较结果,决定裁剪基准:
* 如果`Ratio_原始<Ratio_目标`(即原始图片“太高”或“竖高”),则以宽度为基准裁剪。
* 如果`Ratio_原始>Ratio_目标`(即原始图片“太宽”或“横宽”),则以高度为基准裁剪。
* 如果相等,则无需裁剪,直接使用全图。
3. 裁剪尺寸计算(量化公式):
* 以宽度为基准(适用于竖高图片):
* 裁剪宽度`Crop_W=W`(使用整个原始宽度)。
* 裁剪高度`Crop_H=(B/A)×W`(根据目标比例等比例计算高度)。
* 裁剪区域的起始坐标(居中定位):
* X 坐标(水平):总是 0因为宽度全用从左侧开始
* Y 坐标(垂直):`(HCrop_H)/2`(确保垂直居中,从顶部开始)。
* 以高度为基准(适用于横宽图片):
* 裁剪高度`Crop_H=H`(使用整个原始高度)。
* 裁剪宽度`Crop_W=(A/B)×H`(根据目标比例等比例计算宽度)。
* 裁剪区域的起始坐标(居中定位):
* X 坐标(水平):`(WCrop_W)/2`(确保水平居中,从左侧开始)。
* Y 坐标(垂直):总是 0因为高度全用从顶部开始
4. 裁剪结果:
* 最终裁剪出的图片尺寸为`Crop_W×Crop_H`,比例严格为`A:B`,且完全位于原始图片内部,无黑边。
* 裁剪区域总是以原始图片中心为基准,因此内容居中。
5. 裁剪示例:
> 以 Seedance 1.0 Pro 首帧图生视频功能为例
<span aceTableMode="list" aceTableWidth="2,1,2"></span>
|输入的首帧图片 |指定的宽高比ratio |生成的视频结果 |
|---|---|---|
|16:9|21:9 |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/6e8590c07be9406d805209355b799a37~tplv-goo7wpa0wc-image.image" controls></video>|\
|<span>![图片](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c66d7faff6104320a981b36149dc713f~tplv-goo7wpa0wc-image.image =1920x) </span> | | |
|^^|16:9 |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/e0bef5f3806f439da5f0c9f5acc44c9b~tplv-goo7wpa0wc-image.image" controls></video>|\
| | | |
|^^|4:3 |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a8e3202b77744bec83e0c7baa247b84c~tplv-goo7wpa0wc-image.image" controls></video>|\
| | | |
|^^|1:1 |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/436df8f6dae74d6c86d08bf1e18bc9d0~tplv-goo7wpa0wc-image.image" controls></video>|\
| | | |
|^^|3:4 |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a3a94a577d754501889535a651d03a55~tplv-goo7wpa0wc-image.image" controls></video>|\
| | | |
|^^|9:16 |<video src="https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/1423ee0fc9cf451398788dc57e9f55c4~tplv-goo7wpa0wc-image.image" controls></video>|\
| | | |