AWS Lambda调用ffmpeg生成延时摄影输出0字节无法排查错误
解决方案
1. 0字节问题排查与修复
1.1 打印FFMPEG错误日志
你当前未捕获FFMPEG的错误输出,只需在subprocess.run执行后添加日志打印代码即可在CloudWatch中查看具体报错:
p1 = subprocess.run(command1, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 新增日志代码 print(f"FFMPEG退出码:{p1.returncode}") print(f"FFMPEG错误输出:{p1.stderr.decode('utf-8', errors='ignore')}") print(f"输出流长度:{len(p1.stdout)}")
1.2 已知代码错误修复
你当前的代码存在两处直接导致0字节的硬错误:
- FFMPEG输入参数为小写
-i,你写为大写-I,该参数只会输出媒体信息,不会生成转码流 - 同时指定
-c copy(流复制)和-vcodec libx264(转码),参数冲突会导致FFMPEG执行失败 - files.txt链接硬编码,可直接使用代码中生成的预签名URL,适配私有桶场景
修复后的FFMPEG命令参考:
ffmpeg_cmd = f"/opt/bin/ffmpeg -y -r 24 -f concat -safe 0 -protocol_whitelist file,http,tcp,https,tls -i {s3_source_signed_url} -s 1024x576 -vcodec libx264 -movflags +frag_keyframe+empty_moov -"
2. 方案合理性与优化建议
2.1 现有方案评估
通过concat读取HTTPS链接的方案可以运行,但存在两个明显缺陷:
- 依赖S3桶公有读权限,私有桶场景下需要为files.txt内所有图片生成预签名URL,配置繁琐
- 多轮HTTPS请求拉取资源,延迟高、失败概率大,不适合批量图片场景
2.2 更高性能的实现方案
推荐将资源下载到Lambda本地临时目录/tmp(最大配额10GB)后本地转码,完全规避网络问题:
- 触发函数后,解析files.txt获取所有图片文件名
- 批量将图片下载到
/tmp目录 - 生成指向本地路径的files.txt
- 调用FFMPEG读取本地文件转码,输出到
/tmp后上传到目标桶
该方案转码速度提升30%以上,且不需要处理S3访问权限的跨服务问题。
3. 额外配置建议
- 将Lambda执行超时调整到30秒以上,批量图片场景可调整到1-5分钟
- Lambda内存配置不低于1024MB,更高内存对应更高CPU配额,转码速度更快
- 新增文件类型判断逻辑,仅当触发文件为
files.txt时执行转码逻辑,避免误触发
内容的提问来源于stack exchange,提问作者GoOutside
相关产品推荐
相关产品推荐

