const axios = require('axios');
const fs = require('fs');
const FormData = require('form-data');
const API_KEY = 'YOUR_API_KEY';
const BASE_URL = 'https://api.yelinai.com/v1';
// 创建视频任务(文生视频)
async function createVideoTask(prompt, size = '1280x720', seconds = '15') {
const response = await axios.post(`\`$\{BASE_URL}/videos`, {
model: 'sora-2',
prompt,
size,
seconds
}, {
headers: { 'Authorization': `Bearer \`$\{API_KEY}` }
});
return response.data;
}
// 创建视频任务(图生视频)
async function createVideoTaskWithImage(prompt, imagePath, size = '1280x720', seconds = '10') {
const formData = new FormData();
formData.append('model', 'sora-2');
formData.append('prompt', prompt);
formData.append('size', size);
formData.append('seconds', seconds);
formData.append('input_reference', fs.createReadStream(imagePath));
const response = await axios.post(`\`$\{BASE_URL}/videos`, formData, {
headers: {
'Authorization': `Bearer \`$\{API_KEY}`,
...formData.getHeaders()
}
});
return response.data;
}
// 轮询查询状态
async function waitForVideo(videoId, pollInterval = 5000, timeout = 600000) {
const startTime = Date.now();
while (true) {
// 检查超时
if (Date.now() - startTime > timeout) {
throw new Error(`视频生成超时(\`$\{timeout/1000}秒)`);
}
// 查询状态
const response = await axios.get(`\`$\{BASE_URL}/videos/\`$\{videoId}`, {
headers: { 'Authorization': `Bearer \`$\{API_KEY}` }
});
const task = response.data;
const { status, progress = 0 } = task;
console.log(`状态: \`$\{status}, 进度: \`$\{progress}%`);
if (status === 'completed') {
return task;
} else if (status === 'failed') {
const error = task.error || {};
throw new Error(`生成失败: \`$\{error.message || '未知错误'}`);
}
// 等待后重试
await new Promise(resolve => setTimeout(resolve, pollInterval));
}
}
// 下载视频
async function downloadVideo(videoId, savePath = 'video.mp4') {
const response = await axios.get(
`\`$\{BASE_URL}/videos/\`$\{videoId}/content`,
{
headers: { 'Authorization': `Bearer \`$\{API_KEY}` },
responseType: 'stream'
}
);
const writer = fs.createWriteStream(savePath);
response.data.pipe(writer);
return new Promise((resolve, reject) => {
writer.on('finish', () => {
console.log(`视频已保存到: \`$\{savePath}`);
resolve();
});
writer.on('error', reject);
});
}
// 完整流程(文生视频)
async function generateVideoAsync(prompt, size = '1280x720', seconds = '15') {
try {
console.log('1. 创建视频任务...');
const task = await createVideoTask(prompt, size, seconds);
const videoId = task.id;
console.log(` 任务ID: \`$\{videoId}`);
console.log('\n2. 等待视频生成...');
const completedTask = await waitForVideo(videoId);
const duration = completedTask.completed_at - completedTask.created_at;
console.log(` 生成完成!耗时: \`$\{duration}秒`);
console.log('\n3. 下载视频...');
await downloadVideo(videoId);
console.log('\n✅ 完成!');
} catch (error) {
console.error('错误:', error.message);
}
}
// 完整流程(图生视频)
async function generateVideoFromImageAsync(imagePath, prompt, size = '1280x720', seconds = '10') {
try {
if (!fs.existsSync(imagePath)) {
console.error(`错误:图片文件不存在 \`$\{imagePath}`);
return null;
}
console.log(`1. 上传图片并创建任务...(\`$\{imagePath})`);
const task = await createVideoTaskWithImage(prompt, imagePath, size, seconds);
const videoId = task.id;
console.log(` 任务ID: \`$\{videoId}`);
console.log('\n2. 等待视频生成...');
const completedTask = await waitForVideo(videoId);
const duration = completedTask.completed_at - completedTask.created_at;
console.log(` 生成完成!耗时: \`$\{duration}秒`);
console.log('\n3. 下载视频...');
await downloadVideo(videoId, `image_to_video_\`$\{videoId}.mp4`);
console.log('\n✅ 完成!');
return videoId;
} catch (error) {
console.error('错误:', error.message);
return null;
}
}
// 使用示例
// 文生视频
generateVideoAsync(
'一只可爱的猫咪在阳光明媚的花园里玩球',
'1280x720', // 横屏
'15' // 15秒
);
// 图生视频
generateVideoFromImageAsync(
'/path/to/your/image.png',
'让这张图片中的场景动起来,增加自然的动态效果',
'1280x720', // 横屏
'10' // 10秒
);