使用ffmpeg生成视频后返回路径至index.js时显示undefined
问题:FFmpeg生成视频后返回路径显示undefined
我尝试用FFmpeg生成视频,将生成后的视频路径返回给index.js,但控制台打印的路径始终是undefined。
index.js 代码
app.get('/content/:myfact', async (req, res) => { let myfactdata = req.params.myfact; let myfact = myfactdata.replace("_", " "); const video = await generateVideo(myfact); console.log(video) });
contentVideo.js 代码
const generateImage = require('./contentimage.js'); const { spawn } = require('child_process'); const generateVideo = async (myfact) => { await generateImage(myfact); const child = spawn('ffmpeg', [ '-i', 'pictures/download/image.png', 'pictures/download/video.mp4' ]); child.on('close', function (code, signal) { const video = 'pictures/download/video.mp4' return video }); } module.exports = generateVideo
解决方案
问题核心是generateVideo的异步逻辑处理错误:
spawn是异步执行的,你在child.on('close')回调里的return,不会成为generateVideo函数的返回值- 原函数没有返回任何Promise,导致
index.js里的await无法获取异步操作的结果,最终得到undefined
修改contentVideo.js,将spawn的异步逻辑包装为Promise,让函数返回这个Promise:
const generateImage = require('./contentimage.js'); const { spawn } = require('child_process'); const generateVideo = async (myfact) => { await generateImage(myfact); return new Promise((resolve, reject) => { const child = spawn('ffmpeg', [ '-i', 'pictures/download/image.png', 'pictures/download/video.mp4' ]); child.on('close', (code, signal) => { if (code === 0) { resolve('pictures/download/video.mp4'); } else { reject(new Error(`FFmpeg执行失败,退出码:${code},信号:${signal}`)); } }); child.on('error', (err) => { reject(new Error(`启动FFmpeg失败:${err.message}`)); }); }); } module.exports = generateVideo
修改说明
- 将FFmpeg调用逻辑包裹在Promise中,用
resolve返回成功后的视频路径,reject抛出执行错误 - 增加错误处理:通过退出码判断FFmpeg是否执行成功,同时监听启动失败的
error事件 - 函数直接返回Promise,确保
index.js里的await能正确获取到视频路径
内容的提问来源于stack exchange,提问作者Satyam Kumar
相关产品推荐
相关产品推荐

