AWS Lambda运行FFmpeg处理远程视频上传S3出现空文件问题
问题根因与解决方案
核心错误修复
首先修复FFmpeg命令中的语法错误:你代码中写的-c: a copy存在多余空格,正确写法是-c:a copy,这个错误会导致FFmpeg参数解析失败,直接终止运行,无输出内容,就是你得到0字节文件的主要原因。
另外你的命令中重复定义了分辨率参数:-vf中已经包含scale=1080x1920,后面又加了-s 1080x1920,属于冗余配置,可删除其中一个避免冲突。
新增运行时错误校验
你当前代码没有判断FFmpeg的运行状态,直接上传stdout内容,即使FFmpeg执行失败也无法感知,建议增加错误判断和日志打印:
p1 = subprocess.run(split_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 新增FFmpeg执行结果校验 if p1.returncode != 0: # 打印错误日志到CloudWatch,方便排查问题 print(f"FFmpeg执行错误,日志:{p1.stderr.decode('utf-8')}") raise RuntimeError(f"视频处理失败,返回码:{p1.returncode}")
优化输出兼容性
mov格式需要输出流支持随机寻址,而stdout是流式不可寻址的,输出mov到stdout可能会出现异常,可选择以下任意一种方案优化:
- 方案1:将输出格式改为mp4,同时修改生成的key后缀为
.mp4,mp4原生支持流式输出 - 方案2:先将FFmpeg输出写入Lambda的
/tmp目录,再读取文件上传到S3,兼容性更高,修改示例:
# 修改FFmpeg命令输出路径 command=''' /opt/bin/ffmpeg -i %s \ -vf "crop=w=in_h*9/16:h=in_h,scale=1080x1920" \ -vcodec libx264 \ -crf 23 \ -preset veryfast \ -c:a copy \ /tmp/output.mov \ -y ''' % (download_url) # 执行后读取文件上传 with open('/tmp/output.mov', 'rb') as f: response = s3.put_object(Body=f.read(), Bucket='edited-clips', Key=key)
确认Lambda基础配置
- 内存配置建议不低于1024MB,视频编解码属于高资源消耗操作,内存不足会被系统强制终止进程
- 超时时间调整到至少30秒,可根据视频大小适当延长,避免处理未完成就被Lambda终止
- 确认Lambda执行角色具备
edited-clips桶的s3:PutObject权限,否则上传会失败 - S3对象键建议去掉开头的斜杠,将
key = '/edits/%s.mov'改为key = 'edits/%s.mov',避免出现多余的前缀斜杠
内容的提问来源于stack exchange,提问作者enjoysturtles
相关产品推荐
相关产品推荐

