视频生成模型具备出色的语义理解能力,可根据用户输入的文本、图片等内容,快速生成优质的视频片段。通过这篇教程,您可学习到如何调用视频生成 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 |\ | |\ |![Image](https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/c66d7faff6104320a981b36149dc713f~tplv-goo7wpa0wc-image.image =1920x) |\ | |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 等工具,将生成的多个短视频拼接成一个完整长视频。