You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 06:45:11