AWS Lambda Node.js环境下用FFMPEG编辑视频无法叠加文字问题
问题根因
你当前遇到的回调不触发问题,核心是ffmpeg执行是异步过程,你没有等待任务完成,Lambda运行时在当前await s3Object的逻辑结束后就直接销毁了执行环境,ffmpeg进程被提前杀死,自然不会触发end或error回调。
另外文字叠加失败大概率是你用的ffmpeg编译版本未包含drawtext滤镜、或是缺少字体文件导致。
修复方案
1. 把ffmpeg执行逻辑包装为Promise,等待执行完成
修改你的代码如下,确保Lambda会等ffmpeg处理完再结束执行:
const { writeFileSync } = require('fs'); const ffmpegM = require('fluent-ffmpeg'); // 如果你用的是Lambda层部署ffmpeg,建议直接显式指定路径,比环境变量更可靠 ffmpegM.setFfmpegPath("/opt/ffmpeglib/ffmpeg"); var params = { Bucket: "Bucket name", Key: "Sample.mp4", }; try { const data = await s3.getObject(params).promise(); console.log("S3文件读取完成"); writeFileSync(`/tmp/Sample.mp4`, data.Body); console.log("文件写入tmp目录完成"); // 包装ffmpeg为Promise,等待执行完成 await new Promise((resolve, reject) => { ffmpegM("/tmp/Sample.mp4") // 叠加文字的配置,注意fontfile要指向你自己打包的字体文件路径 .videoFilter("drawtext=text='示例文字':fontfile=/opt/fonts/simhei.ttf:fontsize=30:fontcolor=white:x=20:y=20") .output(`/tmp/Samples.mp4`) .on("error", (error) => { console.log("转码出错", error); reject(error); }) .on("end", () => { console.log("转码成功"); resolve(); }) .run(); }); // 这里写转码完成后把/tmp/Samples.mp4上传回S3的逻辑 } catch (err) { console.log("流程出错", err); }
2. 检查ffmpeg环境配置
- 确认你的ffmpeg可执行文件有执行权限,部署到Lambda层时权限要设为755
- 执行ffmpeg命令
ffmpeg -filters检查输出中是否包含drawtext滤镜,没有的话需要更换支持drawtext的ffmpeg编译版本 - Lambda默认环境无自带字体,需要把你要用的字体文件和ffmpeg一起打包到Lambda层,调用drawtext时显式指定
fontfile参数指向字体文件路径
3. 其他Lambda配置检查
- 把Lambda的超时时间调整到足够长,根据你的视频大小一般建议至少设置30秒以上
- 确认你处理的视频大小不超过Lambda /tmp目录512MB的存储上限
内容的提问来源于stack exchange,提问作者j sharma
相关产品推荐
相关产品推荐

