1921 lines
73 KiB
Plaintext
1921 lines
73 KiB
Plaintext
视频生成模型具备出色的语义理解能力,可根据用户输入的文本、图片等内容,快速生成优质的视频片段。通过这篇教程,您可学习到如何调用视频生成 API 生成视频。
|
||
<span id="2c6a9e64"></span>
|
||
# 快速开始
|
||
您可以通过下面代码快速体验文生视频能力。
|
||
:::tip
|
||
* 视频生成为异步接口,您需要先创建视频生成任务,再通过视频生成任务的 ID 去查询视频生成结果。
|
||
* 视频生成过程耗时较长,查询结果时请您耐心等待。
|
||
:::
|
||
|
||
|
||
```mixin-react
|
||
return (<Tabs>
|
||
<Tabs.TabPane title="Python" key="D1RwhEl5ig"><RenderMd content={`\`\`\`Python
|
||
import time
|
||
import os
|
||
# Install SDK: pip install 'volcengine-python-sdk[ark]' .
|
||
from volcenginesdkarkruntime import Ark
|
||
|
||
client = Ark(
|
||
# The base URL for model invocation .
|
||
base_url="https://ark.cn-beijing.volces.com/api/v3",
|
||
# Get API Key:https://console.volcengine.com/ark/region:ark+cn-beijing/apikey
|
||
api_key=os.getenv('ARK_API_KEY'),
|
||
)
|
||
|
||
if __name__ == "__main__":
|
||
print("----- create request -----")
|
||
create_result = client.content_generation.tasks.create(
|
||
# Replace with Model ID .
|
||
model="doubao-seedance-1-0-pro-250528",
|
||
content=[
|
||
{
|
||
# 文本提示词
|
||
"type": "text",
|
||
"text": "多个镜头。一名侦探进入一间光线昏暗的房间。他检查桌上的线索,手里拿起桌上的某个物品。镜头转向他正在思索。 --ratio 16:9"
|
||
},
|
||
]
|
||
)
|
||
print(create_result)
|
||
|
||
# 轮询查询部分
|
||
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="zyILXb1P3Z"><RenderMd content={`\`\`\`Java
|
||
package com.volcengine.ark.runtime;
|
||
|
||
import java.util.ArrayList;
|
||
import java.util.List;
|
||
import java.util.concurrent.TimeUnit;
|
||
import com.volcengine.ark.runtime.model.content.generation.CreateContentGenerationTaskRequest;
|
||
import com.volcengine.ark.runtime.model.content.generation.CreateContentGenerationTaskRequest.Content;
|
||
import com.volcengine.ark.runtime.model.content.generation.CreateContentGenerationTaskResult;
|
||
import com.volcengine.ark.runtime.model.content.generation.GetContentGenerationTaskRequest;
|
||
import com.volcengine.ark.runtime.model.content.generation.GetContentGenerationTaskResponse;
|
||
import com.volcengine.ark.runtime.service.ArkService;
|
||
import okhttp3.ConnectionPool;
|
||
import okhttp3.Dispatcher;
|
||
|
||
public class ContentGenerationTaskExample {
|
||
// 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中
|
||
// 初始化Ark客户端,从环境变量中读取您的API Key
|
||
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)
|
||
.baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .
|
||
.build();
|
||
public static void main(String[] args) {
|
||
//Replace with Model ID .
|
||
String model = "doubao-seedance-1-0-pro-250528";
|
||
|
||
System.out.println("----- create request -----");
|
||
List<Content> contents = new ArrayList<>();
|
||
contents.add(Content.builder()
|
||
.type("text")
|
||
.text("多个镜头。一名侦探进入一间光线昏暗的房间。他检查桌上的线索,手里拿起桌上的某个物品。镜头转向他正在思索。 --ratio 16:9")
|
||
.build());
|
||
|
||
// 创建视频生成任务
|
||
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
|
||
.model(model)
|
||
.content(contents)
|
||
.build();
|
||
|
||
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
|
||
System.out.println(createResult);
|
||
|
||
// 获取任务详情
|
||
String taskId = createResult.getId();
|
||
GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
|
||
.taskId(taskId)
|
||
.build();
|
||
|
||
// 轮询查询部分
|
||
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="fOLOh4FWkB"><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() {
|
||
// 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中
|
||
// 初始化Ark客户端,从环境变量中读取您的API Key
|
||
client := arkruntime.NewClientWithApiKey(
|
||
// 从环境变量中获取您的 API Key。此为默认方式,您可根据需要进行修改
|
||
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-pro-250528"
|
||
|
||
// 创建任务
|
||
fmt.Println("----- create request -----")
|
||
createReq := model.CreateContentGenerationTaskRequest{
|
||
Model: modelEp,
|
||
Content: []*model.CreateContentGenerationContentItem{
|
||
{
|
||
Type: model.ContentGenerationContentItemTypeText,
|
||
Text: volcengine.String("多个镜头。一名侦探进入一间光线昏暗的房间。他检查桌上的线索,手里拿起桌上的某个物品。镜头转向他正在思索。 --ratio 16:9"),
|
||
},
|
||
},
|
||
}
|
||
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)
|
||
|
||
// 轮询查询部分
|
||
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", getResp.ID)
|
||
fmt.Printf("Model: %s", getResp.Model)
|
||
fmt.Printf("Video URL: %s", getResp.Content.VideoURL)
|
||
fmt.Printf("Completion Tokens: %d", 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...", status)
|
||
time.Sleep(10 * time.Second)
|
||
}
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane></Tabs>);
|
||
```
|
||
|
||
|
||
模型回复预览:
|
||
```Shell
|
||
# 视频生成过程中
|
||
----- create request -----
|
||
Task Created with ID: cgt-2025xxxx-xxxx
|
||
----- polling task status -----
|
||
Current status: queued, Retrying in 10 seconds...
|
||
Current status: running, Retrying in 10 seconds...
|
||
|
||
# 视频生成后
|
||
----- task succeeded -----
|
||
ContentGenerationTask(id='cgt-2025xxxx-xxxx', model='doubao-xxxx', status='succeeded', error=None, content=Content(video_url='https://xxxx'), usage=Usage(completion_tokens=103818, total_tokens=103818), created_at=1746606910, updated_at=1746606932)
|
||
```
|
||
|
||
<span id="5b7f9f24"></span>
|
||
##
|
||
<span id="e7b4c498"></span>
|
||
# 支持模型
|
||
|
||
| | | | | | | | | | \
|
||
|**模型名称** |**版本** |\
|
||
| |<div style="width:150px"></div> |**模型 ID(Model ID)** |\
|
||
| | |<div style="width:150px"></div> |**模型能力** |\
|
||
| | | |<div style="width:150px"></div> |**输出视频格式** |\
|
||
| | | | |<div style="width:120px"></div> |**RPM 限流** |\
|
||
| | | | | | |\
|
||
| | | | | |<div style="width:100px"></div> |**并发数限制** |**免费额度** |\
|
||
| | | | | | | |(token) |**定价** |\
|
||
| | | | | | | | |(元/百万 token) |
|
||
|---|---|---|---|---|---|---|---|---|
|
||
| | | | | | | | | | \
|
||
|[doubao-seedance-1.0-pro](/docs/82379/1587798) |250528`强烈推荐` |doubao-seedance-1-0-pro-250528 |图生视频-首尾帧 |\
|
||
| | | |图生视频-首帧 |\
|
||
| | | |文生视频 |分辨率: |\
|
||
| | | | |480p, |\
|
||
| | | | |720p, |\
|
||
| | | | |1080p`参考图场景不支持` |\
|
||
| | | | |帧率:24 fps |\
|
||
| | | | |时长:2~12 秒 |\
|
||
| | | | |视频格式:mp4 |\
|
||
| | | | | |600 |10 |200万 |[视频生成模型](/docs/82379/1544106#02affcb8) |
|
||
| | | | |^^| | | | | \
|
||
|[doubao-seedance-1.0-pro-fast](/docs/82379/1901652) |251015`强烈推荐` |doubao-seedance-1-0-pro-fast-251015 |图生视频-首帧 |\
|
||
| | | |文生视频 | |600 |10 |200万 |[视频生成模型](/docs/82379/1544106#02affcb8) |
|
||
| | | | |^^| | | | | \
|
||
|[doubao-seedance-1.0-lite](/docs/82379/1553576) |250428 |doubao-seedance-1-0-lite-t2v-250428 |文生视频 | |300 |5 |200万 |[视频生成模型](/docs/82379/1544106#02affcb8) |
|
||
|^^| | | |^^| | | | | \
|
||
| |250428 |doubao-seedance-1-0-lite-i2v-250428 |图生视频-参考图 |\
|
||
| | | |图生视频-首尾帧 |\
|
||
| | | |图生视频-首帧 | |300 |5 |200万 |[视频生成模型](/docs/82379/1544106#02affcb8) |
|
||
|
||
<span id="d1b0ff92"></span>
|
||
# API 参数说明
|
||
视频生成的 API 接口详细介绍请参见 [视频生成 API](https://www.volcengine.com/docs/82379/1520758)。
|
||
<span id="a57e57b6"></span>
|
||
# 模型文本命令比较
|
||
在文本提示词后追加--[parameters],控制视频输出的规格,包括宽高比、帧率、分辨率等。使用不同的模型,可能对应支持不同的参数与取值,详见下表。
|
||
|
||
| | | | | | \
|
||
| |doubao-seedance-1-0-pro |\
|
||
| |<div style="width:150px"></div> |doubao-seedance-1-0-pro-fast |\
|
||
| | |<div style="width:150px"></div> |doubao-seedance-1-0-lite-t2v |\
|
||
| | | |<div style="width:150px"></div> |doubao-seedance-1-0-lite-i2v |\
|
||
| | | | |<div style="width:150px"></div> |
|
||
|---|---|---|---|---|
|
||
| | | | | | \
|
||
|模型能力 |图生视频-首尾帧 |\
|
||
| |图生视频-首帧 |\
|
||
| |文生视频 |图生视频-首帧 |\
|
||
| | |文生视频 |文生视频 |图生视频-参考图 |\
|
||
| | | | |图生视频-首尾帧 |\
|
||
| | | | |图生视频-首帧 |
|
||
| | || || \
|
||
|resolution |\
|
||
|分辨率 |* 480p |\
|
||
| |* 720p |\
|
||
| |* 1080p | |* 480p |\
|
||
| | | |* 720p |\
|
||
| | | |* 1080p`参考图场景不支持` | |
|
||
| | || | | \
|
||
|ratio |\
|
||
|宽高比 | |\
|
||
| | |\
|
||
| |* 16:9 |\
|
||
| |* 4:3 |\
|
||
| |* 1:1 |\
|
||
| |* 3:4 |\
|
||
| |* 9:16 |\
|
||
| |* 21:9 |\
|
||
| |* adaptive |\
|
||
| | |\
|
||
| | |\
|
||
| |480p 各画面比例的宽高像素值如下 |\
|
||
| | |\
|
||
| |* `16:9`:864×480 |\
|
||
| |* `4:3`:736×544 |\
|
||
| |* `1:1`:640×640 |\
|
||
| |* `3:4`:544×736 |\
|
||
| |* `9:16`:480×864 |\
|
||
| |* `21:9`:960×416 |\
|
||
| | |\
|
||
| |720p 各画面比例的宽高像素值如下 |\
|
||
| | |\
|
||
| |* `16:9`:1248×704 |\
|
||
| |* `4:3`:1120×832 |\
|
||
| |* `1:1`:960×960 |\
|
||
| |* `3:4`:832×1120 |\
|
||
| |* `9:16`:704×1248 |\
|
||
| |* `21:9`:1504×640 |\
|
||
| | |\
|
||
| |1080p 各画面比例的宽高像素值如下 |\
|
||
| | |\
|
||
| |* `16:9`:1920×1088 |\
|
||
| |* `4:3`:1664×1248 |\
|
||
| |* `1:1`:1440×1440 |\
|
||
| |* `3:4`:1248×1664 |\
|
||
| |* `9:16`:1088×1920 |\
|
||
| |* `21:9`:2176×928 | | |\
|
||
| | | | |\
|
||
| | | |* 16:9 |\
|
||
| | | |* 4:3 |\
|
||
| | | |* 1:1 |\
|
||
| | | |* 3:4 |\
|
||
| | | |* 9:16 |\
|
||
| | | |* 21:9 |\
|
||
| | | | |\
|
||
| | | | |\
|
||
| | | | |\
|
||
| | | |480p 各画面比例的宽高像素值如下 |\
|
||
| | | | |\
|
||
| | | |* `16:9`:864×480 |\
|
||
| | | |* `4:3`:736×544 |\
|
||
| | | |* `1:1`:640×640 |\
|
||
| | | |* `3:4`:544×736 |\
|
||
| | | |* `9:16`:480×864 |\
|
||
| | | |* `21:9`:960×416 |\
|
||
| | | | |\
|
||
| | | |720p 各画面比例的宽高像素值如下 |\
|
||
| | | | |\
|
||
| | | |* `16:9`:1248×704 |\
|
||
| | | |* `4:3`:1120×832 |\
|
||
| | | |* `1:1`:960×960 |\
|
||
| | | |* `3:4`:832×1120 |\
|
||
| | | |* `9:16`:704×1248 |\
|
||
| | | |* `21:9`:1504×640 |\
|
||
| | | | |\
|
||
| | | |1080p 各画面比例的宽高像素值如下 |\
|
||
| | | | |\
|
||
| | | |* `16:9`:1920×1088 |\
|
||
| | | |* `4:3`:1664×1248 |\
|
||
| | | |* `1:1`:1440×1440 |\
|
||
| | | |* `3:4`:1248×1664 |\
|
||
| | | |* `9:16`:1088×1920 |\
|
||
| | | |* `21:9`:2176×928 | |\
|
||
| | | | | |\
|
||
| | | | |* 16:9 |\
|
||
| | | | |* 4:3 |\
|
||
| | | | |* 1:1 |\
|
||
| | | | |* 3:4 |\
|
||
| | | | |* 9:16 |\
|
||
| | | | |* 21:9 |\
|
||
| | | | |* adaptive`参考图场景不支持` |\
|
||
| | | | | |\
|
||
| | | | | |\
|
||
| | | | |480p 各画面比例的宽高像素值如下 |\
|
||
| | | | | |\
|
||
| | | | |* `16:9`:864×480 |\
|
||
| | | | |* `4:3`:736×544 |\
|
||
| | | | |* `1:1`:640×640 |\
|
||
| | | | |* `3:4`:544×736 |\
|
||
| | | | |* `9:16`:480×864 |\
|
||
| | | | |* `21:9`:960×416 |\
|
||
| | | | | |\
|
||
| | | | |720p 各画面比例的宽高像素值如下 |\
|
||
| | | | | |\
|
||
| | | | |* `16:9`:1248×704 |\
|
||
| | | | |* `4:3`:1120×832 |\
|
||
| | | | |* `1:1`:960×960 |\
|
||
| | | | |* `3:4`:832×1120 |\
|
||
| | | | |* `9:16`:704×1248 |\
|
||
| | | | |* `21:9`:1504×640 |\
|
||
| | | | | |\
|
||
| | | | |1080p 各画面比例的宽高像素值如下`参考图场景不支持` |\
|
||
| | | | | |\
|
||
| | | | |* `16:9`:1920×1088 |\
|
||
| | | | |* `4:3`:1664×1248 |\
|
||
| | | | |* `1:1`:1440×1440 |\
|
||
| | | | |* `3:4`:1248×1664 |\
|
||
| | | | |* `9:16`:1088×1920 |\
|
||
| | | | |* `21:9`:2176×928 |
|
||
| | || || \
|
||
|duration |\
|
||
|生成视频时长(秒) |2 ~12 秒 | |2 ~12 秒 | |
|
||
| | || || \
|
||
|frames |\
|
||
|生成视频帧数 |支持 [29, 289] 区间内所有满足 25 + 4n 格式的整数值,其中 n 为正整数。 | |支持 [29, 289] 区间内所有满足 25 + 4n 格式的整数值,其中 n 为正整数。 | |
|
||
| | || || \
|
||
|framespersecond |\
|
||
|帧率 |24 | |24 | |
|
||
| | || || \
|
||
|seed |\
|
||
| 种子整数 |✅ | | |\
|
||
| | | |✅ | |
|
||
| | || || \
|
||
|camerafixed |\
|
||
|是否固定摄像头 |✅ | | |\
|
||
| | | |✅`参考图场景不支持` | |
|
||
| | || || \
|
||
|watermark |\
|
||
|是否包含水印 |✅ | | |\
|
||
| | | |✅ | |
|
||
|
||
|
||
<span id="f5531933"></span>
|
||
# 前提条件
|
||
* [获取 API Key](https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey) 。
|
||
* [开通模型服务](https://console.volcengine.com/ark/region:ark+cn-beijing/openManagement?LLM=%7B%7D&OpenTokenDrawer=false)。
|
||
* 在[模型列表](/docs/82379/1330310)获取所需 Model ID 。
|
||
* 通过 Endpoint ID 调用模型服务请参考[获取 Endpoint ID(创建自定义推理接入点)](/docs/82379/1099522)。
|
||
|
||
<span id="9dc301c3"></span>
|
||
# 使用限制
|
||
<span id="41ebef67"></span>
|
||
## 保存时间
|
||
任务数据(如任务状态、视频URL等)仅保留24小时,超时后会被自动清除。请您务必及时保存生成的视频。
|
||
<span id="a1387a96"></span>
|
||
## 限流说明
|
||
<span id="a7163bd8"></span>
|
||
### 模型限流
|
||
|
||
* RPM 限流:账号下同模型(区分模型版本)每分钟允许创建的任务数量上限。若超过该限制,创建视频生成任务时会报错。
|
||
* 并发数限制:账号下同模型(区分模型版本)同一时刻在处理中的任务数量上限。超过此限制的任务将进入队列等待处理。
|
||
* 不同模型的限制值不同,详见[视频生成能力](/docs/82379/1330310#2705b333)。
|
||
|
||
|
||
<span id="1b7439df"></span>
|
||
## 使用说明及建议
|
||
|
||
* 用简洁准确的自然语言写出你想要的效果。
|
||
* 如果有较为明确的效果预期,建议先用生图模型生成符合预期的图片,再用图生视频进行视频片段的生成
|
||
* 文生视频会有较大的结果随机性,可以用于激发创作灵感
|
||
* 图生视频时请尽量上传高清高质量的图片,上传图片的质量对图生视频影响较大。
|
||
* 当生成的视频不符合预期时,建议修改提示词,将抽象描述换成具象描述,并注意删除不重要的部分,将重要内容前置。
|
||
* 更多提示词的使用技巧请参见 [Seedance 提示词指南](https://www.volcengine.com/docs/82379/1587797)。
|
||
|
||
<span id="e6bd4a79"></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 坐标(垂直):`(H−Crop_H)/2`(确保垂直居中,从顶部开始)。
|
||
* 以高度为基准(适用于横宽图片):
|
||
* 裁剪高度`Crop_H=H`(使用整个原始高度)。
|
||
* 裁剪宽度`Crop_W=(A/B)×H`(根据目标比例等比例计算宽度)。
|
||
* 裁剪区域的起始坐标(居中定位):
|
||
* X 坐标(水平):`(W−Crop_W)/2`(确保水平居中,从左侧开始)。
|
||
* Y 坐标(垂直):总是 0(因为高度全用,从顶部开始)。
|
||
4. 裁剪结果:
|
||
* 最终裁剪出的图片尺寸为`Crop_W×Crop_H`,比例严格为`A:B`,且完全位于原始图片内部,无黑边。
|
||
* 裁剪区域总是以原始图片中心为基准,因此内容居中。
|
||
5. 裁剪示例:
|
||
|
||
> 以 Seedance 1.0 Pro 首帧图生视频功能为例
|
||
|
||
|
||
| | | | \
|
||
|输入的首帧图片 |指定的宽高比ratio |生成的视频结果 |
|
||
|---|---|---|
|
||
| | | | \
|
||
|16:9 |\
|
||
| |\
|
||
| |\
|
||
| |21:9 |\
|
||
| | | |\
|
||
| | |<BytedReactXgplayer config={{ url: 'https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/db372038e0ba464f9656364f0b5aabba~tplv-goo7wpa0wc-image.image', poster: 'https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/db372038e0ba464f9656364f0b5aabba~tplv-goo7wpa0wc-video-poster.jpeg' }} ></BytedReactXgplayer> |\
|
||
| | | |\
|
||
| | | |
|
||
|^^| | | \
|
||
| |16:9 | |\
|
||
| | |<BytedReactXgplayer config={{ url: 'https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a3b21bf79c1948ff8f43cbed05c48d66~tplv-goo7wpa0wc-image.image', poster: 'https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/a3b21bf79c1948ff8f43cbed05c48d66~tplv-goo7wpa0wc-video-poster.jpeg' }} ></BytedReactXgplayer> |\
|
||
| | | |\
|
||
| | | |\
|
||
| | | |
|
||
|^^| | | \
|
||
| |4:3 | |\
|
||
| | |<BytedReactXgplayer config={{ url: 'https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/3917539f20904631a1a0fae540b708ae~tplv-goo7wpa0wc-image.image', poster: 'https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/3917539f20904631a1a0fae540b708ae~tplv-goo7wpa0wc-video-poster.jpeg' }} ></BytedReactXgplayer> |\
|
||
| | | |\
|
||
| | | |
|
||
|^^| | | \
|
||
| |1:1 | |\
|
||
| | |<BytedReactXgplayer config={{ url: 'https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ccc12b9d3b0f43f088316e5a22f2b75e~tplv-goo7wpa0wc-image.image', poster: 'https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/ccc12b9d3b0f43f088316e5a22f2b75e~tplv-goo7wpa0wc-video-poster.jpeg' }} ></BytedReactXgplayer> |\
|
||
| | | |\
|
||
| | | |
|
||
|^^| | | \
|
||
| |3:4 | |\
|
||
| | |<BytedReactXgplayer config={{ url: 'https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/9c42b44d5a0949ab8afa8da59cdf9786~tplv-goo7wpa0wc-image.image', poster: 'https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/9c42b44d5a0949ab8afa8da59cdf9786~tplv-goo7wpa0wc-video-poster.jpeg' }} ></BytedReactXgplayer> |\
|
||
| | | |\
|
||
| | | |
|
||
|^^| | | \
|
||
| |9:16 | |\
|
||
| | |<BytedReactXgplayer config={{ url: 'https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/9b0bc3b269a94f0b8a02c537b176075f~tplv-goo7wpa0wc-image.image', poster: 'https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/9b0bc3b269a94f0b8a02c537b176075f~tplv-goo7wpa0wc-video-poster.jpeg' }} ></BytedReactXgplayer> |\
|
||
| | | |\
|
||
| | | |
|
||
|
||
<span id="0c66686f"></span>
|
||
# 使用示例
|
||
<span id="fded0dfc"></span>
|
||
## 设置生成视频格式
|
||
通过在文本提示词后追加`--[parameters]`的方式,可控制视频输出的规格,包括宽高比、帧率、分辨率等。
|
||
```Shell
|
||
// 指定生成视频的宽高比为16:9,时长为 5 秒,帧率为 24 fps,分辨率为720p,包含水印,不固定摄像头
|
||
一位身穿绿色亮片礼服的女性站在粉红色背景前,周围飘落着五彩斑斓的彩纸 --rt 16:9 --dur 5 --fps 24 --rs 720p --wm true --cf false
|
||
```
|
||
|
||
<span id="19d393e1"></span>
|
||
## 文生视频
|
||
|
||
```mixin-react
|
||
return (<Tabs>
|
||
<Tabs.TabPane title="Python" key="YFtcTQj2jj"><RenderMd content={`\`\`\`Python
|
||
import os
|
||
# Install SDK: pip install 'volcengine-python-sdk[ark]' .
|
||
from volcenginesdkarkruntime import Ark
|
||
|
||
# 初始化Ark客户端
|
||
client = Ark(
|
||
# The base URL for model invocation .
|
||
base_url="https://ark.cn-beijing.volces.com/api/v3",
|
||
# Get API Key:https://console.volcengine.com/ark/region:ark+cn-beijing/apikey
|
||
api_key=os.getenv('ARK_API_KEY'),
|
||
)
|
||
|
||
print("----- create request -----")
|
||
# 创建视频生成任务
|
||
create_result = client.content_generation.tasks.create(
|
||
# Replace with Model ID .
|
||
model="doubao-seedance-1-0-pro-250528",
|
||
content=[
|
||
{
|
||
# 文本提示词与参数组合
|
||
"type": "text",
|
||
"text": "一位身穿绿色亮片礼服的女性站在粉红色背景前,周围飘落着五彩斑斓的彩纸 --wm true --dur 5"
|
||
}
|
||
]
|
||
)
|
||
print(create_result)
|
||
|
||
|
||
print("----- get request -----")
|
||
# 获取任务详情
|
||
get_result = client.content_generation.tasks.get(task_id=create_result.id)
|
||
print(get_result)
|
||
|
||
|
||
print("----- list request -----")
|
||
# 列出符合特定条件的任务
|
||
list_result = client.content_generation.tasks.list(
|
||
page_num=1,
|
||
page_size=10,
|
||
status="queued", # 按状态筛选, e.g succeeded, failed, running, cancelled
|
||
# model="<YOUR_MODEL_EP>, # 按 ep 筛选
|
||
# task_ids=["test-id-1", "test-id-2"] # 按 task_id 筛选
|
||
)
|
||
print(list_result)
|
||
|
||
|
||
print("----- delete request -----")
|
||
# 通过任务 id 删除任务
|
||
try:
|
||
client.content_generation.tasks.delete(task_id=create_result.id)
|
||
print(create_result.id)
|
||
except Exception as e:
|
||
print(f"failed to delete task: {e}")
|
||
\`\`\`
|
||
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Java" key="yTipEVgAHK"><RenderMd content={`\`\`\`Java
|
||
package com.volcengine.ark.runtime;
|
||
|
||
import com.volcengine.ark.runtime.model.content.generation.DeleteContentGenerationTaskResponse;
|
||
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 {
|
||
// 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中
|
||
// 初始化Ark客户端,从环境变量中读取您的API Key
|
||
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)
|
||
.baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .
|
||
.build();
|
||
public static void main(String[] args) {
|
||
//Replace with Model ID .
|
||
String model = "doubao-seedance-1-0-pro-250528";
|
||
|
||
System.out.println("----- CREATE Task Request -----");
|
||
List<Content> contents = new ArrayList<>();
|
||
|
||
// 文本提示词与参数组合
|
||
contents.add(Content.builder()
|
||
.type("text")
|
||
.text("一位身穿绿色亮片礼服的女性站在粉红色背景前,周围飘落着五彩斑斓的彩纸 --wm true --dur 5")
|
||
.build());
|
||
|
||
// 创建视频生成任务
|
||
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
|
||
.model(model)
|
||
.content(contents)
|
||
.build();
|
||
|
||
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
|
||
System.out.println(createResult);
|
||
|
||
System.out.println("----- GET Task Request -----");
|
||
|
||
// 获取任务详情
|
||
GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
|
||
.taskId(createResult.getId())
|
||
.build();
|
||
|
||
GetContentGenerationTaskResponse getResult = service.getContentGenerationTask(getRequest);
|
||
System.out.println(getResult);
|
||
|
||
System.out.println("----- LIST Task Request -----");
|
||
|
||
// 列出符合特定条件的任务
|
||
ListContentGenerationTasksRequest listRequest = ListContentGenerationTasksRequest.builder()
|
||
.pageNum(1)
|
||
.pageSize(10)
|
||
.status(TaskStatus.RUNNING)
|
||
.addTaskId(createResult.getId()) // 按 task_id 筛选
|
||
// 如果您需要按多个 task_id 进行筛选
|
||
// .taskIds(Arrays.asList("test-id-1", "test-id-2"))
|
||
.model(model)
|
||
.build();
|
||
|
||
ListContentGenerationTasksResponse listResponse = service.listContentGenerationTasks(listRequest);
|
||
System.out.println(listResponse);
|
||
|
||
System.out.println("----- DELETE Task Request -----");
|
||
|
||
// 通过任务 id 删除任务
|
||
DeleteContentGenerationTaskRequest deleteRequest = DeleteContentGenerationTaskRequest.builder()
|
||
.taskId(getResult.getId())
|
||
.build();
|
||
|
||
try {
|
||
DeleteContentGenerationTaskResponse deleteResult = service.deleteContentGenerationTask(deleteRequest);
|
||
System.out.println(deleteResult);
|
||
} catch (Exception e) {
|
||
System.out.println(e.getMessage());
|
||
}
|
||
|
||
service.shutdownExecutor();
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Go" key="dunqw92qil"><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() {
|
||
// 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中
|
||
// 初始化Ark客户端,从环境变量中读取您的API Key
|
||
client := arkruntime.NewClientWithApiKey(
|
||
// 从环境变量中获取您的 API Key。此为默认方式,您可根据需要进行修改
|
||
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-pro-250528"
|
||
fmt.Println("----- create content generation task -----")
|
||
// 创建视频生成任务
|
||
createReq := model.CreateContentGenerationTaskRequest{
|
||
Model: modelEp,
|
||
Content: []*model.CreateContentGenerationContentItem{
|
||
{
|
||
// 文本提示词与参数组合
|
||
Type: model.ContentGenerationContentItemTypeText,
|
||
Text: volcengine.String("一位身穿绿色亮片礼服的女性站在粉红色背景前,周围飘落着五彩斑斓的彩纸 --wm true --dur 5"),
|
||
},
|
||
},
|
||
}
|
||
|
||
createResponse, err := client.CreateContentGenerationTask(ctx, createReq)
|
||
if err != nil {
|
||
fmt.Printf("create content generation error: %v", err)
|
||
return
|
||
}
|
||
fmt.Printf("Task Created with ID: %s", createResponse.ID)
|
||
|
||
fmt.Println("----- get content generation task -----")
|
||
// 获取任务详情
|
||
taskID := createResponse.ID
|
||
|
||
getRequest := model.GetContentGenerationTaskRequest{ID: taskID}
|
||
|
||
getResponse, err := client.GetContentGenerationTask(ctx, getRequest)
|
||
if err != nil {
|
||
fmt.Printf("get content generation task error: %v", err)
|
||
return
|
||
}
|
||
|
||
fmt.Printf("Task ID: %s", getResponse.ID)
|
||
fmt.Printf("Model: %s", getResponse.Model)
|
||
fmt.Printf("Status: %s", getResponse.Status)
|
||
fmt.Printf("Video URL: %s", getResponse.Content.VideoURL)
|
||
fmt.Printf("Completion Tokens: %d", getResponse.Usage.CompletionTokens)
|
||
fmt.Printf("Created At: %d", getResponse.CreatedAt)
|
||
fmt.Printf("Updated At: %d", getResponse.UpdatedAt)
|
||
if getResponse.Error != nil {
|
||
fmt.Printf("Error Code: %s", getResponse.Error.Code)
|
||
fmt.Printf("Error Message: %s", getResponse.Error.Message)
|
||
}
|
||
|
||
fmt.Println("----- list content generation task -----")
|
||
|
||
// 列出符合特定条件的任务
|
||
listRequest := model.ListContentGenerationTasksRequest{
|
||
PageNum: volcengine.Int(1),
|
||
PageSize: volcengine.Int(10),
|
||
Filter: &model.ListContentGenerationTasksFilter{
|
||
Status: volcengine.String(model.StatusSucceeded),
|
||
//TaskIDs: volcengine.StringSlice([]string{"cgt-example-1", "cgt-example-2"}),
|
||
//Model: volcengine.String(modelEp),
|
||
},
|
||
}
|
||
|
||
listResponse, err := client.ListContentGenerationTasks(ctx, listRequest)
|
||
if err != nil {
|
||
fmt.Printf("failed to list content generation tasks: %v", err)
|
||
}
|
||
|
||
fmt.Printf("ListContentGenerationTasks returned %v results", listResponse.Total)
|
||
|
||
fmt.Println("----- delete content generation task -----")
|
||
|
||
// 通过任务 id 删除任务
|
||
deleteRequest := model.DeleteContentGenerationTaskRequest{ID: taskID}
|
||
|
||
err = client.DeleteContentGenerationTask(ctx, deleteRequest)
|
||
if err != nil {
|
||
fmt.Printf("delete content generation task error: %v", err)
|
||
} else {
|
||
fmt.Println("successfully deleted task id: ", taskID)
|
||
}
|
||
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane></Tabs>);
|
||
```
|
||
|
||
<span id="979b2d28"></span>
|
||
## 图生视频-基于首帧
|
||
|
||
|
||
```mixin-react
|
||
return (<Tabs>
|
||
<Tabs.TabPane title="Python" key="dAdayzXTrF"><RenderMd content={`\`\`\`Python
|
||
import os
|
||
# Install SDK: pip install 'volcengine-python-sdk[ark]' .
|
||
from volcenginesdkarkruntime import Ark
|
||
|
||
# 初始化Ark客户端
|
||
client = Ark(
|
||
# The base URL for model invocation .
|
||
base_url="https://ark.cn-beijing.volces.com/api/v3",
|
||
# Get API Key:https://console.volcengine.com/ark/region:ark+cn-beijing/apikey
|
||
api_key=os.getenv('ARK_API_KEY'),
|
||
)
|
||
|
||
print("----- create request -----")
|
||
# 创建视频生成任务
|
||
create_result = client.content_generation.tasks.create(
|
||
# Replace with Model ID .
|
||
model="doubao-seedance-1-0-pro-fast-251015",
|
||
content=[
|
||
{
|
||
# 文本提示词与参数组合
|
||
"type": "text",
|
||
"text": "女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动 --wm true --dur 5"
|
||
},
|
||
{
|
||
# 图片URL
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png"
|
||
}
|
||
}
|
||
]
|
||
)
|
||
print(create_result)
|
||
|
||
|
||
print("----- get request -----")
|
||
# 获取任务详情
|
||
get_result = client.content_generation.tasks.get(task_id=create_result.id)
|
||
print(get_result)
|
||
|
||
|
||
print("----- list request -----")
|
||
# 列出符合特定条件的任务
|
||
list_result = client.content_generation.tasks.list(
|
||
page_num=1,
|
||
page_size=10,
|
||
status="queued", # 按状态筛选, e.g succeeded, failed, running, cancelled
|
||
# model="<YOUR_MODEL_EP>", # 按 ep 筛选
|
||
# task_ids=["test-id-1", "test-id-2"] # 按 task_id 筛选
|
||
)
|
||
print(list_result)
|
||
|
||
|
||
print("----- delete request -----")
|
||
# 通过任务 id 删除任务
|
||
try:
|
||
client.content_generation.tasks.delete(task_id=create_result.id)
|
||
print(create_result.id)
|
||
except Exception as e:
|
||
print(f"failed to delete task: {e}")
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Java" key="GFyqZNivpT"><RenderMd content={`\`\`\`Java
|
||
package com.volcengine.ark.runtime;
|
||
|
||
import com.volcengine.ark.runtime.model.content.generation.DeleteContentGenerationTaskResponse;
|
||
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 {
|
||
// 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中
|
||
// 初始化Ark客户端,从环境变量中读取您的API Key
|
||
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)
|
||
.baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .
|
||
.build();
|
||
public static void main(String[] args) {
|
||
//Replace with Model ID .
|
||
String model = "doubao-seedance-1-0-pro-fast-251015";
|
||
|
||
System.out.println("----- CREATE Task Request -----");
|
||
List<Content> contents = new ArrayList<>();
|
||
|
||
// 文本提示词与参数组合
|
||
contents.add(Content.builder()
|
||
.type("text")
|
||
.text("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动 --wm true --dur 5")
|
||
.build());
|
||
|
||
// 图片URL
|
||
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());
|
||
|
||
// 创建视频生成任务
|
||
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
|
||
.model(model)
|
||
.content(contents)
|
||
.build();
|
||
|
||
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
|
||
System.out.println(createResult);
|
||
|
||
System.out.println("----- GET Task Request -----");
|
||
|
||
// 获取任务详情
|
||
GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
|
||
.taskId(createResult.getId())
|
||
.build();
|
||
|
||
GetContentGenerationTaskResponse getResult = service.getContentGenerationTask(getRequest);
|
||
System.out.println(getResult);
|
||
|
||
System.out.println("----- LIST Task Request -----");
|
||
|
||
// 列出符合特定条件的任务
|
||
ListContentGenerationTasksRequest listRequest = ListContentGenerationTasksRequest.builder()
|
||
.pageNum(1)
|
||
.pageSize(10)
|
||
.status(TaskStatus.RUNNING)
|
||
.addTaskId(createResult.getId()) // 按 task_id 筛选
|
||
// 如果您需要按多个 task_id 进行筛选
|
||
// .taskIds(Arrays.asList("test-id-1", "test-id-2"))
|
||
.model(model)
|
||
.build();
|
||
|
||
ListContentGenerationTasksResponse listResponse = service.listContentGenerationTasks(listRequest);
|
||
System.out.println(listResponse);
|
||
|
||
System.out.println("----- DELETE Task Request -----");
|
||
|
||
// 通过任务 id 删除任务
|
||
DeleteContentGenerationTaskRequest deleteRequest = DeleteContentGenerationTaskRequest.builder()
|
||
.taskId(getResult.getId())
|
||
.build();
|
||
|
||
try {
|
||
DeleteContentGenerationTaskResponse deleteResult = service.deleteContentGenerationTask(deleteRequest);
|
||
System.out.println(deleteResult);
|
||
} catch (Exception e) {
|
||
System.out.println(e.getMessage());
|
||
}
|
||
|
||
service.shutdownExecutor();
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Go" key="ZePqhns7y0"><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() {
|
||
// 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中
|
||
// 初始化Ark客户端,从环境变量中读取您的API Key
|
||
client := arkruntime.NewClientWithApiKey(
|
||
// 从环境变量中获取您的 API Key。此为默认方式,您可根据需要进行修改
|
||
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-pro-fast-251015"
|
||
|
||
fmt.Println("----- create content generation task -----")
|
||
// 创建视频生成任务
|
||
createReq := model.CreateContentGenerationTaskRequest{
|
||
Model: modelEp,
|
||
Content: []*model.CreateContentGenerationContentItem{
|
||
{
|
||
// 文本提示词与参数组合
|
||
Type: model.ContentGenerationContentItemTypeText,
|
||
Text: volcengine.String("女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动 --wm true --dur 5"),
|
||
},
|
||
{
|
||
// 图片URL
|
||
Type: model.ContentGenerationContentItemTypeImage,
|
||
ImageURL: &model.ImageURL{
|
||
URL: "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png",
|
||
},
|
||
},
|
||
},
|
||
}
|
||
|
||
createResponse, err := client.CreateContentGenerationTask(ctx, createReq)
|
||
if err != nil {
|
||
fmt.Printf("create content generation error: %v", err)
|
||
return
|
||
}
|
||
fmt.Printf("Task Created with ID: %s", createResponse.ID)
|
||
|
||
fmt.Println("----- get content generation task -----")
|
||
// 获取任务详情
|
||
taskID := createResponse.ID
|
||
|
||
getRequest := model.GetContentGenerationTaskRequest{ID: taskID}
|
||
|
||
getResponse, err := client.GetContentGenerationTask(ctx, getRequest)
|
||
if err != nil {
|
||
fmt.Printf("get content generation task error: %v", err)
|
||
return
|
||
}
|
||
|
||
fmt.Printf("Task ID: %s", getResponse.ID)
|
||
fmt.Printf("Model: %s", getResponse.Model)
|
||
fmt.Printf("Status: %s", getResponse.Status)
|
||
fmt.Printf("Video URL: %s", getResponse.Content.VideoURL)
|
||
fmt.Printf("Completion Tokens: %d", getResponse.Usage.CompletionTokens)
|
||
fmt.Printf("Created At: %d", getResponse.CreatedAt)
|
||
fmt.Printf("Updated At: %d", getResponse.UpdatedAt)
|
||
if getResponse.Error != nil {
|
||
fmt.Printf("Error Code: %s", getResponse.Error.Code)
|
||
fmt.Printf("Error Message: %s", getResponse.Error.Message)
|
||
}
|
||
|
||
fmt.Println("----- list content generation task -----")
|
||
|
||
// 列出符合特定条件的任务
|
||
listRequest := model.ListContentGenerationTasksRequest{
|
||
PageNum: volcengine.Int(1),
|
||
PageSize: volcengine.Int(10),
|
||
Filter: &model.ListContentGenerationTasksFilter{
|
||
Status: volcengine.String(model.StatusSucceeded),
|
||
//TaskIDs: volcengine.StringSlice([]string{"cgt-example-1", "cgt-example-2"}),
|
||
//Model: volcengine.String(modelEp),
|
||
},
|
||
}
|
||
|
||
listResponse, err := client.ListContentGenerationTasks(ctx, listRequest)
|
||
if err != nil {
|
||
fmt.Printf("failed to list content generation tasks: %v", err)
|
||
}
|
||
|
||
fmt.Printf("ListContentGenerationTasks returned %v results", listResponse.Total)
|
||
|
||
fmt.Println("----- delete content generation task -----")
|
||
|
||
// 通过任务 id 删除任务
|
||
deleteRequest := model.DeleteContentGenerationTaskRequest{ID: taskID}
|
||
|
||
err = client.DeleteContentGenerationTask(ctx, deleteRequest)
|
||
if err != nil {
|
||
fmt.Printf("delete content generation task error: %v", err)
|
||
} else {
|
||
fmt.Println("successfully deleted task id: ", taskID)
|
||
}
|
||
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane></Tabs>);
|
||
```
|
||
|
||
<span id="0d55ca07"></span>
|
||
## 图生视频-基于首尾帧
|
||
|
||
```mixin-react
|
||
return (<Tabs>
|
||
<Tabs.TabPane title="Python" key="bukFdSpLyj"><RenderMd content={`\`\`\`Python
|
||
import os
|
||
# Install SDK: pip install 'volcengine-python-sdk[ark]' .
|
||
from volcenginesdkarkruntime import Ark
|
||
|
||
# 初始化Ark客户端
|
||
client = Ark(
|
||
# The base URL for model invocation .
|
||
base_url="https://ark.cn-beijing.volces.com/api/v3",
|
||
# Get API Key:https://console.volcengine.com/ark/region:ark+cn-beijing/apikey
|
||
api_key=os.getenv('ARK_API_KEY'),
|
||
)
|
||
|
||
print("----- create request -----")
|
||
# 创建视频生成任务
|
||
create_result = client.content_generation.tasks.create(
|
||
# Replace with Model ID .
|
||
model="doubao-seedance-1-0-pro-250528",
|
||
content=[
|
||
{
|
||
# 文本提示词与参数组合
|
||
"type": "text",
|
||
"text": "360度环绕运镜"
|
||
},
|
||
{
|
||
# 首帧图片URL
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_first_frame.jpeg"
|
||
},
|
||
"role": "first_frame"
|
||
},
|
||
{
|
||
# 尾帧图片URL
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/seepro_last_frame.jpeg"
|
||
},
|
||
"role": "last_frame"
|
||
}
|
||
]
|
||
)
|
||
print(create_result)
|
||
|
||
|
||
print("----- get request -----")
|
||
# 获取任务详情
|
||
get_result = client.content_generation.tasks.get(task_id=create_result.id)
|
||
print(get_result)
|
||
|
||
|
||
print("----- list request -----")
|
||
# 列出符合特定条件的任务
|
||
list_result = client.content_generation.tasks.list(
|
||
page_num=1,
|
||
page_size=10,
|
||
status="queued", # 按状态筛选, e.g succeeded, failed, running, cancelled
|
||
# model="<YOUR_MODEL_EP>", # 按 ep 筛选
|
||
# task_ids=["test-id-1", "test-id-2"] # 按 task_id 筛选
|
||
)
|
||
print(list_result)
|
||
|
||
|
||
print("----- delete request -----")
|
||
# 通过任务 id 删除任务
|
||
try:
|
||
client.content_generation.tasks.delete(task_id=create_result.id)
|
||
print(create_result.id)
|
||
except Exception as e:
|
||
print(f"failed to delete task: {e}")
|
||
\`\`\`
|
||
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Java" key="ezIC1aYZ42"><RenderMd content={`\`\`\`Java
|
||
package com.volcengine.ark.runtime;
|
||
|
||
import com.volcengine.ark.runtime.model.content.generation.DeleteContentGenerationTaskResponse;
|
||
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 {
|
||
// 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中
|
||
// 初始化Ark客户端,从环境变量中读取您的API Key
|
||
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)
|
||
.baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .
|
||
.build();
|
||
public static void main(String[] args) {
|
||
//Replace with Model ID .
|
||
String model = "doubao-seedance-1-0-pro-250528";
|
||
|
||
System.out.println("----- CREATE Task Request -----");
|
||
List<Content> contents = new ArrayList<>();
|
||
|
||
// 添加文本提示词与参数组合
|
||
contents.add(Content.builder()
|
||
.type("text")
|
||
.text("360度环绕运镜")
|
||
.build());
|
||
|
||
// 添加首帧图片URL
|
||
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());
|
||
|
||
// 添加尾帧图片URL
|
||
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());
|
||
|
||
// 创建视频生成任务
|
||
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
|
||
.model(model)
|
||
.content(contents)
|
||
.build();
|
||
|
||
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
|
||
System.out.println(createResult);
|
||
|
||
System.out.println("----- GET Task Request -----");
|
||
|
||
// 获取任务详情
|
||
GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
|
||
.taskId(createResult.getId())
|
||
.build();
|
||
|
||
GetContentGenerationTaskResponse getResult = service.getContentGenerationTask(getRequest);
|
||
System.out.println(getResult);
|
||
|
||
System.out.println("----- LIST Task Request -----");
|
||
|
||
// 列出符合特定条件的任务
|
||
ListContentGenerationTasksRequest listRequest = ListContentGenerationTasksRequest.builder()
|
||
.pageNum(1)
|
||
.pageSize(10)
|
||
.status(TaskStatus.RUNNING)
|
||
.addTaskId(createResult.getId()) // 按 task_id 筛选
|
||
// 如果您需要按多个 task_id 进行筛选
|
||
// .taskIds(Arrays.asList("test-id-1", "test-id-2"))
|
||
.model(model)
|
||
.build();
|
||
|
||
ListContentGenerationTasksResponse listResponse = service.listContentGenerationTasks(listRequest);
|
||
System.out.println(listResponse);
|
||
|
||
System.out.println("----- DELETE Task Request -----");
|
||
|
||
// 通过任务 id 删除任务
|
||
DeleteContentGenerationTaskRequest deleteRequest = DeleteContentGenerationTaskRequest.builder()
|
||
.taskId(getResult.getId())
|
||
.build();
|
||
|
||
try {
|
||
DeleteContentGenerationTaskResponse deleteResult = service.deleteContentGenerationTask(deleteRequest);
|
||
System.out.println(deleteResult);
|
||
} catch (Exception e) {
|
||
System.out.println(e.getMessage());
|
||
}
|
||
|
||
service.shutdownExecutor();
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Go" key="qWIVc7tvC1"><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() {
|
||
// 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中
|
||
// 初始化Ark客户端,从环境变量中读取您的API Key
|
||
client := arkruntime.NewClientWithApiKey(
|
||
// 从环境变量中获取您的 API Key。此为默认方式,您可根据需要进行修改
|
||
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-pro-250528"
|
||
|
||
fmt.Println("----- create content generation task -----")
|
||
// 创建视频生成任务
|
||
createReq := model.CreateContentGenerationTaskRequest{
|
||
Model: modelEp,
|
||
Content: []*model.CreateContentGenerationContentItem{
|
||
{
|
||
// 文本提示词与参数组合
|
||
Type: model.ContentGenerationContentItemTypeText,
|
||
Text: volcengine.String("360度环绕运镜"),
|
||
},
|
||
{
|
||
// 首帧图片URL
|
||
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"),
|
||
},
|
||
{
|
||
// 尾帧图片URL
|
||
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"),
|
||
},
|
||
},
|
||
}
|
||
|
||
createResponse, err := client.CreateContentGenerationTask(ctx, createReq)
|
||
if err != nil {
|
||
fmt.Printf("create content generation error: %v", err)
|
||
return
|
||
}
|
||
fmt.Printf("Task Created with ID: %s", createResponse.ID)
|
||
|
||
fmt.Println("----- get content generation task -----")
|
||
// 获取任务详情
|
||
taskID := createResponse.ID
|
||
|
||
getRequest := model.GetContentGenerationTaskRequest{ID: taskID}
|
||
|
||
getResponse, err := client.GetContentGenerationTask(ctx, getRequest)
|
||
if err != nil {
|
||
fmt.Printf("get content generation task error: %v", err)
|
||
return
|
||
}
|
||
|
||
fmt.Printf("Task ID: %s", getResponse.ID)
|
||
fmt.Printf("Model: %s", getResponse.Model)
|
||
fmt.Printf("Status: %s", getResponse.Status)
|
||
fmt.Printf("Video URL: %s", getResponse.Content.VideoURL)
|
||
fmt.Printf("Completion Tokens: %d", getResponse.Usage.CompletionTokens)
|
||
fmt.Printf("Created At: %d", getResponse.CreatedAt)
|
||
fmt.Printf("Updated At: %d", getResponse.UpdatedAt)
|
||
if getResponse.Error != nil {
|
||
fmt.Printf("Error Code: %s", getResponse.Error.Code)
|
||
fmt.Printf("Error Message: %s", getResponse.Error.Message)
|
||
}
|
||
|
||
fmt.Println("----- list content generation task -----")
|
||
|
||
// 列出符合特定条件的任务
|
||
listRequest := model.ListContentGenerationTasksRequest{
|
||
PageNum: volcengine.Int(1),
|
||
PageSize: volcengine.Int(10),
|
||
Filter: &model.ListContentGenerationTasksFilter{
|
||
Status: volcengine.String(model.StatusSucceeded),
|
||
//TaskIDs: volcengine.StringSlice([]string{"cgt-example-1", "cgt-example-2"}),
|
||
//Model: volcengine.String(modelEp),
|
||
},
|
||
}
|
||
|
||
listResponse, err := client.ListContentGenerationTasks(ctx, listRequest)
|
||
if err != nil {
|
||
fmt.Printf("failed to list content generation tasks: %v", err)
|
||
}
|
||
|
||
fmt.Printf("ListContentGenerationTasks returned %v results", listResponse.Total)
|
||
|
||
fmt.Println("----- delete content generation task -----")
|
||
|
||
// 通过任务 id 删除任务
|
||
deleteRequest := model.DeleteContentGenerationTaskRequest{ID: taskID}
|
||
|
||
err = client.DeleteContentGenerationTask(ctx, deleteRequest)
|
||
if err != nil {
|
||
fmt.Printf("delete content generation task error: %v", err)
|
||
} else {
|
||
fmt.Println("successfully deleted task id: ", taskID)
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
|
||
`}></RenderMd></Tabs.TabPane></Tabs>);
|
||
```
|
||
|
||
<span id="c5f5f577"></span>
|
||
## 图生视频-基于参考图
|
||
|
||
|
||
```mixin-react
|
||
return (<Tabs>
|
||
<Tabs.TabPane title="Python" key="Z7NYvc0isV"><RenderMd content={`\`\`\`Python
|
||
import os
|
||
# Install SDK: pip install 'volcengine-python-sdk[ark]' .
|
||
from volcenginesdkarkruntime import Ark
|
||
|
||
# 初始化Ark客户端
|
||
client = Ark(
|
||
# The base URL for model invocation .
|
||
base_url="https://ark.cn-beijing.volces.com/api/v3",
|
||
# Get API Key:https://console.volcengine.com/ark/region:ark+cn-beijing/apikey
|
||
api_key=os.getenv('ARK_API_KEY'),
|
||
)
|
||
|
||
print("----- create request -----")
|
||
# 创建视频生成任务
|
||
create_result = client.content_generation.tasks.create(
|
||
# Replace with Model ID .
|
||
model="doubao-seedance-1-0-lite-i2v-250428",
|
||
content=[
|
||
{
|
||
# 文本提示词与参数组合
|
||
"type": "text",
|
||
"text": "[图1]戴着眼镜穿着蓝色T恤的男生和[图2]的柯基小狗,坐在[图3]的草坪上,3D卡通风格"
|
||
},
|
||
{
|
||
# 第一张参考图片URL
|
||
# 参考图需要传入1~4张
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_1.png"
|
||
},
|
||
"role": "reference_image"
|
||
},
|
||
{
|
||
# 第二张参考图片URL
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_2.png"
|
||
},
|
||
"role": "reference_image"
|
||
},
|
||
{
|
||
# 第三张参考图片URL
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": "https://ark-project.tos-cn-beijing.volces.com/doc_image/seelite_ref_3.png"
|
||
},
|
||
"role": "reference_image"
|
||
}
|
||
]
|
||
)
|
||
print(create_result)
|
||
|
||
|
||
print("----- get request -----")
|
||
# 获取任务详情
|
||
get_result = client.content_generation.tasks.get(task_id=create_result.id)
|
||
print(get_result)
|
||
|
||
|
||
print("----- list request -----")
|
||
# 列出符合特定条件的任务
|
||
list_result = client.content_generation.tasks.list(
|
||
page_num=1,
|
||
page_size=10,
|
||
status="queued", # 按状态筛选, e.g succeeded, failed, running, cancelled
|
||
# model="<YOUR_MODEL_EP>", # 按 ep 筛选
|
||
# task_ids=["test-id-1", "test-id-2"] # 按 task_id 筛选
|
||
)
|
||
print(list_result)
|
||
|
||
|
||
print("----- delete request -----")
|
||
# 通过任务 id 删除任务
|
||
try:
|
||
client.content_generation.tasks.delete(task_id=create_result.id)
|
||
print(create_result.id)
|
||
except Exception as e:
|
||
print(f"failed to delete task: {e}")
|
||
\`\`\`
|
||
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Java" key="W3OZmZ8Rmi"><RenderMd content={`\`\`\`Java
|
||
package com.volcengine.ark.runtime;
|
||
|
||
import com.volcengine.ark.runtime.model.content.generation.DeleteContentGenerationTaskResponse;
|
||
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 {
|
||
// 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中
|
||
// 初始化Ark客户端,从环境变量中读取您的API Key
|
||
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)
|
||
.baseUrl("https://ark.cn-beijing.volces.com/api/v3") // The base URL for model invocation .
|
||
.build();
|
||
public static void main(String[] args) {
|
||
//Replace with Model ID .
|
||
String model = "doubao-seedance-1-0-lite-i2v-250428";
|
||
|
||
System.out.println("----- CREATE Task Request -----");
|
||
List<Content> contents = new ArrayList<>();
|
||
|
||
// 添加文本提示词与参数组合
|
||
contents.add(Content.builder()
|
||
.type("text")
|
||
.text("[图1]戴着眼镜穿着蓝色T恤的男生和[图2]的柯基小狗,坐在[图3]的草坪上,3D卡通风格")
|
||
.build());
|
||
|
||
// 第一张参考图片URL
|
||
// 参考图需要传入1~4张
|
||
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());
|
||
|
||
// 第二张参考图片URL
|
||
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());
|
||
|
||
// 第三张参考图片URL
|
||
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());
|
||
|
||
// 创建视频生成任务
|
||
CreateContentGenerationTaskRequest createRequest = CreateContentGenerationTaskRequest.builder()
|
||
.model(model)
|
||
.content(contents)
|
||
.build();
|
||
|
||
CreateContentGenerationTaskResult createResult = service.createContentGenerationTask(createRequest);
|
||
System.out.println(createResult);
|
||
|
||
System.out.println("----- GET Task Request -----");
|
||
|
||
// 获取任务详情
|
||
GetContentGenerationTaskRequest getRequest = GetContentGenerationTaskRequest.builder()
|
||
.taskId(createResult.getId())
|
||
.build();
|
||
|
||
GetContentGenerationTaskResponse getResult = service.getContentGenerationTask(getRequest);
|
||
System.out.println(getResult);
|
||
|
||
System.out.println("----- LIST Task Request -----");
|
||
|
||
// 列出符合特定条件的任务
|
||
ListContentGenerationTasksRequest listRequest = ListContentGenerationTasksRequest.builder()
|
||
.pageNum(1)
|
||
.pageSize(10)
|
||
.status(TaskStatus.RUNNING)
|
||
.addTaskId(createResult.getId()) // 按 task_id 筛选
|
||
// 如果您需要按多个 task_id 进行筛选
|
||
// .taskIds(Arrays.asList("test-id-1", "test-id-2"))
|
||
.model(model)
|
||
.build();
|
||
|
||
ListContentGenerationTasksResponse listResponse = service.listContentGenerationTasks(listRequest);
|
||
System.out.println(listResponse);
|
||
|
||
System.out.println("----- DELETE Task Request -----");
|
||
|
||
// 通过任务 id 删除任务
|
||
DeleteContentGenerationTaskRequest deleteRequest = DeleteContentGenerationTaskRequest.builder()
|
||
.taskId(getResult.getId())
|
||
.build();
|
||
|
||
try {
|
||
DeleteContentGenerationTaskResponse deleteResult = service.deleteContentGenerationTask(deleteRequest);
|
||
System.out.println(deleteResult);
|
||
} catch (Exception e) {
|
||
System.out.println(e.getMessage());
|
||
}
|
||
|
||
service.shutdownExecutor();
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
|
||
`}></RenderMd></Tabs.TabPane>
|
||
<Tabs.TabPane title="Go" key="XlxT2kQCal"><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() {
|
||
// 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中
|
||
// 初始化Ark客户端,从环境变量中读取您的API Key
|
||
client := arkruntime.NewClientWithApiKey(
|
||
// 从环境变量中获取您的 API Key。此为默认方式,您可根据需要进行修改
|
||
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"
|
||
|
||
fmt.Println("----- create content generation task -----")
|
||
// 创建视频生成任务
|
||
createReq := model.CreateContentGenerationTaskRequest{
|
||
Model: modelEp,
|
||
Content: []*model.CreateContentGenerationContentItem{
|
||
{
|
||
// 文本提示词与参数组合
|
||
Type: model.ContentGenerationContentItemTypeText,
|
||
Text: volcengine.String("[图1]戴着眼镜穿着蓝色T恤的男生和[图2]的柯基小狗,坐在[图3]的草坪上,3D卡通风格"),
|
||
},
|
||
{
|
||
// 第一张参考图片URL
|
||
// 参考图需要传入1~4张
|
||
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"),
|
||
},
|
||
{
|
||
// 第二张参考图片URL
|
||
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"),
|
||
},
|
||
{
|
||
// 第三张参考图片URL
|
||
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"),
|
||
},
|
||
},
|
||
}
|
||
|
||
createResponse, err := client.CreateContentGenerationTask(ctx, createReq)
|
||
if err != nil {
|
||
fmt.Printf("create content generation error: %v", err)
|
||
return
|
||
}
|
||
fmt.Printf("Task Created with ID: %s", createResponse.ID)
|
||
|
||
fmt.Println("----- get content generation task -----")
|
||
// 获取任务详情
|
||
taskID := createResponse.ID
|
||
|
||
getRequest := model.GetContentGenerationTaskRequest{ID: taskID}
|
||
|
||
getResponse, err := client.GetContentGenerationTask(ctx, getRequest)
|
||
if err != nil {
|
||
fmt.Printf("get content generation task error: %v", err)
|
||
return
|
||
}
|
||
|
||
fmt.Printf("Task ID: %s", getResponse.ID)
|
||
fmt.Printf("Model: %s", getResponse.Model)
|
||
fmt.Printf("Status: %s", getResponse.Status)
|
||
fmt.Printf("Video URL: %s", getResponse.Content.VideoURL)
|
||
fmt.Printf("Completion Tokens: %d", getResponse.Usage.CompletionTokens)
|
||
fmt.Printf("Created At: %d", getResponse.CreatedAt)
|
||
fmt.Printf("Updated At: %d", getResponse.UpdatedAt)
|
||
if getResponse.Error != nil {
|
||
fmt.Printf("Error Code: %s", getResponse.Error.Code)
|
||
fmt.Printf("Error Message: %s", getResponse.Error.Message)
|
||
}
|
||
|
||
fmt.Println("----- list content generation task -----")
|
||
|
||
// 列出符合特定条件的任务
|
||
listRequest := model.ListContentGenerationTasksRequest{
|
||
PageNum: volcengine.Int(1),
|
||
PageSize: volcengine.Int(10),
|
||
Filter: &model.ListContentGenerationTasksFilter{
|
||
Status: volcengine.String(model.StatusSucceeded),
|
||
//TaskIDs: volcengine.StringSlice([]string{"cgt-example-1", "cgt-example-2"}),
|
||
//Model: volcengine.String(modelEp),
|
||
},
|
||
}
|
||
|
||
listResponse, err := client.ListContentGenerationTasks(ctx, listRequest)
|
||
if err != nil {
|
||
fmt.Printf("failed to list content generation tasks: %v", err)
|
||
}
|
||
|
||
fmt.Printf("ListContentGenerationTasks returned %v results", listResponse.Total)
|
||
|
||
fmt.Println("----- delete content generation task -----")
|
||
|
||
// 通过任务 id 删除任务
|
||
deleteRequest := model.DeleteContentGenerationTaskRequest{ID: taskID}
|
||
|
||
err = client.DeleteContentGenerationTask(ctx, deleteRequest)
|
||
if err != nil {
|
||
fmt.Printf("delete content generation task error: %v", err)
|
||
} else {
|
||
fmt.Println("successfully deleted task id: ", taskID)
|
||
}
|
||
}
|
||
\`\`\`
|
||
|
||
`}></RenderMd></Tabs.TabPane></Tabs>);
|
||
```
|
||
|
||
|
||
<span id="141cf7fa"></span>
|
||
## 生成多个连续视频
|
||
使用前一个生成视频的尾帧,作为后一个视频任务的首帧,循环生成多个连续的视频。
|
||
```Python
|
||
import time
|
||
import os
|
||
# Install SDK: pip install 'volcengine-python-sdk[ark]' .
|
||
from volcenginesdkarkruntime import Ark
|
||
|
||
# 初始化Ark客户端
|
||
client = Ark(
|
||
# The base URL for model invocation .
|
||
base_url="https://ark.cn-beijing.volces.com/api/v3",
|
||
# Get API Key:https://console.volcengine.com/ark/region:ark+cn-beijing/apikey
|
||
api_key=os.getenv('ARK_API_KEY'),
|
||
)
|
||
|
||
def generate_video_with_last_frame(prompt, initial_image_url=None):
|
||
"""
|
||
生成视频并返回视频URL和尾帧URL
|
||
参数:
|
||
prompt: 视频生成的文本提示
|
||
initial_image_url: 初始图像URL (可选)
|
||
返回:
|
||
video_url: 生成的视频URL
|
||
last_frame_url: 视频的最后一帧URL
|
||
"""
|
||
print(f"----- 生成视频: {prompt} -----")
|
||
|
||
# 构建内容列表
|
||
content = [{
|
||
"text": prompt,
|
||
"type": "text"
|
||
}]
|
||
|
||
# 如果提供了初始图像,则添加到内容中
|
||
if initial_image_url:
|
||
content.append({
|
||
"image_url": {
|
||
"url": initial_image_url
|
||
},
|
||
"type": "image_url"
|
||
})
|
||
|
||
# 创建视频生成任务
|
||
create_result = client.content_generation.tasks.create(
|
||
model="doubao-seedance-1-0-pro-250528",
|
||
content=content,
|
||
return_last_frame=True
|
||
)
|
||
|
||
# 轮询查询任务状态
|
||
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("视频生成成功")
|
||
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("无法获取视频URL或尾帧URL")
|
||
return None, None
|
||
except Exception as e:
|
||
print(f"获取视频URL和尾帧URL时出错: {e}")
|
||
return None, None
|
||
elif status == "failed":
|
||
print(f"----- 视频生成失败 -----")
|
||
print(f"错误: {get_result.error}")
|
||
return None, None
|
||
else:
|
||
print(f"当前状态: {status}, 10秒后重试...")
|
||
time.sleep(10)
|
||
|
||
|
||
|
||
if __name__ == "__main__":
|
||
# 定义3个视频的提示词
|
||
prompts = [
|
||
"女孩抱着狐狸,女孩睁开眼,温柔地看向镜头,狐狸友善地抱着,镜头缓缓拉出,女孩的头发被风吹动 --ratio adaptive --dur 5",
|
||
"女孩和狐狸在草地上奔跑,阳光明媚,女孩的笑容灿烂,狐狸欢快地跳跃 --ratio adaptive --dur 5",
|
||
"女孩和狐狸坐在树下休息,女孩轻轻抚摸狐狸的毛发,狐狸温顺地趴在女孩腿上 --ratio adaptive --dur 5"
|
||
]
|
||
|
||
# 存储生成的视频URL
|
||
video_urls = []
|
||
|
||
# 初始图像URL
|
||
initial_image_url = "https://ark-project.tos-cn-beijing.volces.com/doc_image/i2v_foxrgirl.png"
|
||
|
||
# 生成3个短视频
|
||
for i, prompt in enumerate(prompts):
|
||
print(f"生成第{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"第{i+1}个视频URL: {video_url}")
|
||
# 将当前视频的尾帧作为下一个视频的首帧
|
||
initial_image_url = last_frame_url
|
||
else:
|
||
print(f"第{i+1}个视频生成失败,退出程序")
|
||
exit(1)
|
||
|
||
print("所有视频生成完成!")
|
||
print("生成的视频URL列表:")
|
||
for i, url in enumerate(video_urls):
|
||
print(f"视频 {i+1}: {url}")
|
||
```
|
||
|
||
后续您可以自行使用 FFmpeg 等工具,将生成的多个短视频拼接成一个完整长视频。
|
||
|
||
|
||
|
||
<style>
|
||
/* 表格容器:小屏横向滚动,限制最大宽度避免过宽 */
|
||
.table-container {
|
||
overflow-x: auto;
|
||
max-width: 100%; /* 容器占满父级,不超出页面 */
|
||
}
|
||
/* 表格:宽度自适应,内容优先 */
|
||
table {
|
||
width: 100%;
|
||
border-collapse: collapse;
|
||
}
|
||
/* 单元格:垂直顶格,内边距优化,宽度按内容/比例分配 */
|
||
td {
|
||
vertical-align: top;
|
||
padding: 8px;
|
||
}
|
||
/* 图片:自适应单元格,保持比例 */
|
||
img {
|
||
max-width: 100%;
|
||
height: auto;
|
||
}
|
||
/* 响应式:小屏(如手机)下优化显示 */
|
||
@media (max-width: 768px) {
|
||
td {
|
||
width: 100%; /* 小屏时列垂直堆叠 */
|
||
display: block;
|
||
}
|
||
tr {
|
||
display: block;
|
||
margin-bottom: 15px;
|
||
border: 1px solid #ddd;
|
||
}
|
||
}
|
||
</style>
|
||
|
||
|