AWS Lambda中FFmpeg添加PNG水印返回错误码1求助
我来帮你拆解这个头疼的问题——错误码1确实太模糊了,不过咱们从几个关键方向入手,大概率能找到根源:
1. 先确认FFmpeg命令的正确性
错误码1最常见的原因就是命令本身有问题,先在本地环境测试你的overlay命令,确保逻辑没问题:
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=W-w-10:H-h-10" -c:a copy output.mp4
重点注意:在Lambda里必须用完整绝对路径,比如输入视频要写/tmp/input.mp4,水印文件是/var/task/watermark.png(Lambda代码包解压后默认在/var/task/目录),绝对不能用相对路径。
2. 检查水印文件的可访问性
虽然你把PNG放在代码主目录,但Lambda运行时可能存在路径或权限问题:
- 先在代码里加个日志,打印水印文件的状态,比如执行
ls -l /var/task/watermark.png,看CloudWatch日志里是否能找到这个文件。 - 确认Lambda的执行角色对代码目录的文件有读取权限(一般代码包里的文件默认是可读的,但偶尔会有打包时权限丢失的情况)。
3. 验证FFmpeg是否支持overlay滤镜
即使你的FFmpeg在另一个函数能用,也不代表它支持overlay滤镜——有些精简版FFmpeg编译时会禁用libavfilter模块。你可以在Lambda里执行以下命令,检查是否包含overlay:
/var/task/ffmpeg -filters | grep overlay
如果日志里找不到overlay相关的输出,说明你的FFmpeg二进制缺少滤镜支持,需要重新编译一个包含--enable-libavfilter参数的版本。
4. 捕获FFmpeg的详细错误输出
错误码1毫无参考价值,一定要拿到FFmpeg的标准错误流(stderr)。比如用Python的subprocess模块时,要捕获stderr并打印到CloudWatch:
import subprocess def lambda_handler(event, context): input_path = "/tmp/input.mp4" watermark_path = "/var/task/watermark.png" output_path = "/tmp/output.mp4" ffmpeg_cmd = [ "/var/task/ffmpeg", "-i", input_path, "-i", watermark_path, "-filter_complex", "overlay=W-w-10:H-h-10", "-c:a", "copy", output_path, "-y" # 强制覆盖输出文件,避免文件已存在的错误 ] try: result = subprocess.run(ffmpeg_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) print("FFmpeg标准输出:", result.stdout) print("FFmpeg错误输出:", result.stderr) result.check_returncode() except subprocess.CalledProcessError as e: print(f"FFmpeg执行失败,返回码: {e.returncode}") print(f"详细错误: {e.stderr}") raise e # 后续处理输出文件逻辑...
通过stderr的内容,你就能知道具体是“找不到水印文件”“滤镜不支持”还是“临时目录空间不足”之类的问题。
5. 检查临时目录的空间和权限
Lambda的/tmp目录默认有512MB空间(可以在函数配置里调大到10GB),如果处理后的视频超过这个大小也会报错。另外,可以加个简单测试:在代码里执行touch /tmp/test.txt,看是否能成功写入,确认临时目录的可写权限。
先按这几步排查,重点看FFmpeg的stderr输出,这是解决问题的关键!
内容的提问来源于stack exchange,提问作者Tometoyou

