视频生成模型具备出色的语义理解能力,可根据用户输入的文本、图片等内容,快速生成优质的视频片段。通过这篇教程,您可学习到如何调用视频生成 API 生成视频。
# 快速开始
您可以通过下面代码快速体验文生视频能力。
:::tip
* 视频生成为异步接口,您需要先创建视频生成任务,再通过视频生成任务的 ID 去查询视频生成结果。
* 视频生成过程耗时较长,查询结果时请您耐心等待。
:::
```mixin-react
return (
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;
}
}
}
}
\`\`\`
`}>
);
```
模型回复预览:
```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)
```
##
# 支持模型
| | | | | | | | | | \
|**模型名称** |**版本** |\
| |
|**模型 ID(Model ID)** |\
| | | |**模型能力** |\
| | | | |**输出视频格式** |\
| | | | | |**RPM 限流** |\
| | | | | | |\
| | | | | | |**并发数限制** |**免费额度** |\
| | | | | | | |(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) |
# API 参数说明
视频生成的 API 接口详细介绍请参见 [视频生成 API](https://www.volcengine.com/docs/82379/1520758)。
# 模型文本命令比较
在文本提示词后追加--[parameters],控制视频输出的规格,包括宽高比、帧率、分辨率等。使用不同的模型,可能对应支持不同的参数与取值,详见下表。
| | | | | | \
| |doubao-seedance-1-0-pro |\
| | |doubao-seedance-1-0-pro-fast |\
| | | |doubao-seedance-1-0-lite-t2v |\
| | | | |doubao-seedance-1-0-lite-i2v |\
| | | | | |
|---|---|---|---|---|
| | | | | | \
|模型能力 |图生视频-首尾帧 |\
| |图生视频-首帧 |\
| |文生视频 |图生视频-首帧 |\
| | |文生视频 |文生视频 |图生视频-参考图 |\
| | | | |图生视频-首尾帧 |\
| | | | |图生视频-首帧 |
| | || || \
|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 |\
|是否包含水印 |✅ | | |\
| | | |✅ | |
# 前提条件
* [获取 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)。
# 使用限制
## 保存时间
任务数据(如任务状态、视频URL等)仅保留24小时,超时后会被自动清除。请您务必及时保存生成的视频。
## 限流说明
### 模型限流
* RPM 限流:账号下同模型(区分模型版本)每分钟允许创建的任务数量上限。若超过该限制,创建视频生成任务时会报错。
* 并发数限制:账号下同模型(区分模型版本)同一时刻在处理中的任务数量上限。超过此限制的任务将进入队列等待处理。
* 不同模型的限制值不同,详见[视频生成能力](/docs/82379/1330310#2705b333)。
## 使用说明及建议
* 用简洁准确的自然语言写出你想要的效果。
* 如果有较为明确的效果预期,建议先用生图模型生成符合预期的图片,再用图生视频进行视频片段的生成
* 文生视频会有较大的结果随机性,可以用于激发创作灵感
* 图生视频时请尽量上传高清高质量的图片,上传图片的质量对图生视频影响较大。
* 当生成的视频不符合预期时,建议修改提示词,将抽象描述换成具象描述,并注意删除不重要的部分,将重要内容前置。
* 更多提示词的使用技巧请参见 [Seedance 提示词指南](https://www.volcengine.com/docs/82379/1587797)。
## 图片裁剪规则
**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_目标`(即原始图片“太宽”或“横宽”),则以高度为基准裁剪。
* 如果相等,则无需裁剪,直接使用全图。
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 |\
| | | |\
| | | |\
| | | |\
| | | |
|^^| | | \
| |16:9 | |\
| | | |\
| | | |\
| | | |\
| | | |
|^^| | | \
| |4:3 | |\
| | | |\
| | | |\
| | | |
|^^| | | \
| |1:1 | |\
| | | |\
| | | |\
| | | |
|^^| | | \
| |3:4 | |\
| | | |\
| | | |\
| | | |
|^^| | | \
| |9:16 | |\
| | | |\
| | | |\
| | | |
# 使用示例
## 设置生成视频格式
通过在文本提示词后追加`--[parameters]`的方式,可控制视频输出的规格,包括宽高比、帧率、分辨率等。
```Shell
// 指定生成视频的宽高比为16:9,时长为 5 秒,帧率为 24 fps,分辨率为720p,包含水印,不固定摄像头
一位身穿绿色亮片礼服的女性站在粉红色背景前,周围飘落着五彩斑斓的彩纸 --rt 16:9 --dur 5 --fps 24 --rs 720p --wm true --cf false
```
## 文生视频
```mixin-react
return (
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();
}
}
\`\`\`
`}>
);
```
## 图生视频-基于首帧
```mixin-react
return (
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();
}
}
\`\`\`
`}>
);
```
## 图生视频-基于首尾帧
```mixin-react
return (
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();
}
}
\`\`\`
`}>
);
```
## 图生视频-基于参考图
```mixin-react
return (
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();
}
}
\`\`\`
`}>
);
```
## 生成多个连续视频
使用前一个生成视频的尾帧,作为后一个视频任务的首帧,循环生成多个连续的视频。
```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 等工具,将生成的多个短视频拼接成一个完整长视频。