Node.js对接即梦AI实现“千军万马”视频
AI视频预览
下面的视频是即梦AI生成,提示词为“千军万马”,分辨率为“720P”,本文章将介绍如何使用nodejs对接即梦AI的API生成该视频。
准备工作
登录火山引擎的智能视觉控制台开通即梦AI的API服务
智能视觉https://console.volcengine.com/ai/overview
按照下面步骤开通AP服务和密钥获取
实名认证后,选择左边菜单的即梦AI,选择“即梦AI-视频生成3.0 720P”,点击开通服务。可根据不同的需求选择对应的服务。
这里用于代码演示,选择免费试用即可,API的调用限制为50s一次
开启服务后创建密钥,用于请求云服务API的凭证,新建密钥后下载为txt文件,后面代码需要访问控制-火山引擎https://console.volcengine.com/iam/keymanage
开通服务后可查看对应的开发文档进行开发,
即梦AI-视频生成3.0 720P-接口文档--即梦AI-火山引擎https://www.volcengine.com/docs/85621/1792710
代码环境初始化
本文章使用nodejs对接即梦AI的API,故使用nodejs环境进行开发。新建一个空白文件夹,文件名为英文名称(不包含中文),进入文件夹,使用下面命令进行项目初始化。如果文件夹名称包含中文,则将命令的 “-y” 去掉。
npm init -y
下载axios工具库,该工具库可以进行http请求:
npm install axios
下载根据密钥获取火山引擎签名的node SDK 工具库
npm install -S @volcengine/openapi
初始化项目后可创建index.js进行代码编写。
获取签名
const axios = require("axios");
const { Signer } = require("@volcengine/openapi");const accessKeyId = "*********************************";
const secretKey ="**************************************************";const openApiRequestData = {region: "cn-north-1",method: "POST",params: {Action: "CVSync2AsyncSubmitTask", //固定值Version: "2022-08-31", //固定值},headers: {Region: "cn-north-1", Service: "cv", // 服务标识"Content-Type": "application/json",},body: JSON.stringify({req_key: "jimeng_t2v_v30",prompt: "千军万马",seed: -1,frames: 121,aspect_ratio: "16:9",}),
};
代码解释
依赖导入
- 使用
axios
进行HTTP请求 - 从
@volcengine/openapi
导入Signer
用于请求签名
认证信息
accessKeyId
和secretKey
是火山引擎API的访问凭证- 实际应用中应通过环境变量或安全存储获取,避免硬编码
请求参数配置
region
指定服务区域为华北1(cn-north-1)method
定义HTTP方法为POSTparams
包含API的接口名和版本号headers
设置必要请求头,包括服务标识和内容类型body
包含实际任务参数,转换为JSON字符串格式
参数 | 类型 | 可选/必选 | 说明 |
req_key | string | 必选 | 服务标识 取固定值:jimeng_t2v_v30 |
prompt | string | 必选 | 用于生成视频的提示词 ,中英文均可输入。建议在400字以内,不超过800字,prompt过长有概率出现效果异常或不生效 |
seed | int | 可选 | 随机种子,作为确定扩散初始状态的基础,默认-1(随机)。若随机种子为相同正整数且其他参数均一致,则生成视频极大概率效果一致 默认值:-1 |
frames | int | 可选 | 生成的总帧数(帧数 = 24 * n + 1,其中n为秒数,支持5s、10s) 可选取值:[121, 241] 默认值:121 |
aspect_ratio | string | 可选 | 生成视频的长宽比 可选取值:["16:9", "4:3", "1:1", "3:4", "9:16", "21:9"] 默认值:"16:9" |
// 签名
const signer = new Signer(openApiRequestData, "cv");
signer.addAuthorization({ accessKeyId, secretKey });console.log(openApiRequestData.headers);
代码解释:
- 创建
Signer
实例时传入请求数据和业务标识 addAuthorization
方法自动计算签名并添加到请求头- 签名过程会覆盖原始headers中的Authorization字段
- 最终输出包含完整认证信息的请求头
上面代码运行后的结果:
{Region: 'cn-north-1',Service: 'cv','Content-Type': 'application/json','X-Date': '20250908T074921Z','X-Content-Sha256': '86f8dc6c79dab074a37e0690416157fcb6683c27352749ee19be33803d0e8', Authorization: 'HMAC-SHA256 Credential=AKLTNjk4ODljOGY2YmMxNDE2ZDlNDRhNmQwMliNTUzMjY/20250908/cn-north-1/cv/request, SignedHeaders=region;service;x-content-sha256;x-date, Signature=a99240453083c68dca2fbc58cd299e67959bd2eee4cac283a672ba29d3883a'
}
提交任务
请求地址为:
https://visual.volcengineapi.com?Action=CVSync2AsyncSubmitTask&Version=2022-08-31
url的参数说明如下:
参数 | 类型 | 可选/必选 | 说明 |
Action | string | 必选 | 接口名,取值:CVSync2AsyncSubmitTask |
Version | string | 必选 | 版本号,取值:2022-08-31 |
代码示例
const submitUrl = "https://visual.volcengineapi.com";axios.post(submitUrl, openApiRequestData.body, {headers: openApiRequestData.headers, //添加签名params: openApiRequestData.params, // 自动附加Action/Version到URL}).then((res) => console.log("Success:", res.data)).catch((err) => {console.error("Status:", err.response?.status);console.error("Error:", err.response?.data);});
关键参数说明
submitUrl
:指定API请求的目标地址openApiRequestData.body
:包含POST请求的主体数据openApiRequestData.headers
:设置HTTP请求头信息openApiRequestData.params
:用于URL参数自动拼接
上面代码运行后的结果:
Success: {code: 10000,data: { task_id: '2830050130308220853' }, //任务ID,用于查询结果message: 'Success',request_id: '202509081556224E83C7B3AA67CE2F810A',status: 10000,time_elapsed: '48.281867ms'
}
查询任务
请求地址为:
https://visual.volcengineapi.com?Action=CVSync2AsyncGetResult&Version=2022-08-31
url的参数说明如下:
参数 | 类型 | 可选/必选 | 说明 |
Action | string | 必选 | 接口名,固定值:CVSync2AsyncGetResult |
Version | string | 必选 | 版本号,固定值:2022-08-31 |
代码示例:
查询任务的代码和提交任务的代码类似,差别在于openApiRequestData 里params的接口名和body里面需要加上提交任务时获取的任务id。
const axios = require("axios");
const { Signer } = require("@volcengine/openapi");const accessKeyId = "************************";
const secretKey ="**********************************************";const openApiRequestData = {region: "cn-north-1",method: "POST",params: {Action: "CVSync2AsyncGetResult", //查询任务的接口名Version: "2022-08-31",},headers: {Region: "cn-north-1",Service: "cv", // 服务标识"Content-Type": "application/json",},body: JSON.stringify({req_key: "jimeng_t2v_v30",task_id: "2830050130308220853", //提交任务获取的id}),
};// 签名
const signer = new Signer(openApiRequestData, "cv");
signer.addAuthorization({ accessKeyId, secretKey });console.log(openApiRequestData.headers);// 提交任务
const submitUrl = "https://visual.volcengineapi.com";axios.post(submitUrl, openApiRequestData.body, {headers: openApiRequestData.headers,params: openApiRequestData.params, }).then((res) => console.log("Success:", res.data)).catch((err) => {console.error("Status:", err.response?.status);console.error("Error:", err.response?.data);});
body参数说明:
参数 | 类型 | 可选/必选 | 说明 |
req_key | string | 必选 | 服务标识 取固定值:jimeng_t2v_v30 |
task_id | string | 必选 | 任务ID,此字段的取值为提交任务接口的返回 |
运行后的结果:
其中video_url为生成的视频地址:https://v9-vvecloud.yangyi08.com/9a3020e1e4d8336e26d2fc175b6be2de/68be9c78/video/tos/cn/tos-cn-v-242bcc/ocorCFDy1KAdtIA3GeEIpwBUjA4gD7ApvofsPF/?a=7073&ch=0&cr=0&dr=0&er=0&lr=default&cd=0%7C0%7C0%7C0&br=3723&bt=3723&cs=0&ds=3&ft=xztlUQhhe6BMyq-o_nkJD12Nzj&mime_type=video_mp4&qs=13&rc=Mzptd3c5cmc7NTgzNGczM0BpMzptd3c5cmc7NTgzNGczM0BvbDNuMmRzbHNhLS1kXi9zYSNvbDNuMmRzbHNhLS1kXi9zcw%3D%3D&btag=80000e00008000&dy_q=1757318755&l=20250908160555A820AE8159D39C32CB2C
Success: {code: 10000,data: {status: 'done',video_url: 'https://v9-vvecloud.yangyi08.com/9a3020e1e4d8336e26d2fc175b6be2de/68be9c78/video/tos/cn/tos-cn-v-242bcc/ocorCFDy1KAdtIA3GeEIpwBUjA4gD7ApvofsPF/?a=7073&ch=0&cr=0&dr=0&er=0&lr=default&cd=0%7C0%7C0%7C0&br=3723&bt=3723&cs=0&ds=3&ft=xztlUQhhe6BMyq-o_nkJD12Nzj&mime_type=video_mp4&qs=13&rc=Mzptd3c5cmc7NTgzNGczM0BpMzptd3c5cmc7NTgzNGczM0BvbDNuMmRzbHNhLS1kXi9zYSNvbDNuMmRzbHNhLS1kXi9zcw%3D%3D&btag=80000e00008000&dy_q=1757318755&l=20250908160555A820AE8159D39C32CB2C' },message: 'Success',request_id: '20250908160555A820AE8159D39C32CB2C',status: 10000,time_elapsed: '182.13611ms'
}
运行结果的参数说明:
参数名 | 类型 | |
video_url | string | 生成的视频URL |
status | string | 任务执行状态
|