Node.js对接即梦AI实现“千军万马”视频
本文介绍了如何使用Node.js对接火山引擎即梦AI的API生成"千军万马"主题视频。首先需在火山引擎控制台开通即梦AI服务并获取API密钥,然后通过Node.js环境初始化项目,安装axios和火山签名SDK。核心代码展示了如何配置请求参数、生成签名并提交视频生成任务,包括必填参数如prompt(提示词)、frames(帧数)等。最后通过任务ID查询生成结果,获取视频URL。
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,此字段的取值为提交任务接口的返回 |
运行后的结果:
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 |
任务执行状态
|
更多推荐
所有评论(0)