在AWS Lambda中使用Python与FFprobe获取视频尺寸失败求助
解决AWS Lambda中Python调用FFprobe获取视频尺寸无日志/代码不执行问题
核心排查方向
你的问题大概率出在Lambda环境缺少FFprobe二进制文件或者代码未捕获异常导致静默失败,以下是具体解决步骤:
1. 先确认Lambda环境是否有FFprobe
默认Lambda的Python运行时不带FFmpeg/FFprobe工具,直接调用会触发报错,但如果代码没加异常捕获,会直接终止执行,不会走到打印语句。
解决方法:
- 准备适配Lambda架构(x86_64或arm64)的FFprobe二进制文件:Lambda基于Amazon Linux 2,不能用本地Windows/macOS的二进制,需要下载/编译对应系统版本的文件。
- 两种部署方式:
- 直接打包:把FFprobe和代码放在同一目录,压缩成zip上传到Lambda,代码里用相对路径(比如
./ffprobe)调用。 - 使用Layer:把FFprobe放到Layer的
bin目录,创建Layer后关联到Lambda,调用路径用/opt/bin/ffprobe。
- 直接打包:把FFprobe和代码放在同一目录,压缩成zip上传到Lambda,代码里用相对路径(比如
2. 给代码加异常捕获,暴露错误日志
原来的代码没处理异常,出错后直接静默终止,CloudWatch看不到报错信息。修改代码,捕获所有异常并打印:
import subprocess import os import json def lambda_handler(event, context): # 先验证S3下载的文件是否存在 source_file = '/tmp/source.mp4' if not os.path.exists(source_file): print("错误:/tmp目录下找不到source.mp4文件") return {"statusCode": 400, "body": "文件不存在"} # 指定FFprobe路径(根据部署方式调整) ffprobe_path = '/opt/bin/ffprobe' # 用Layer的情况 # ffprobe_path = './ffprobe' # 直接打包的情况 try: # 调用FFprobe获取视频宽高 result = subprocess.run( [ ffprobe_path, '-v', 'error', '-select_streams', 'v:0', '-show_entries', 'stream=width,height', '-of', 'json', source_file ], capture_output=True, text=True, check=True ) # 解析输出 video_data = json.loads(result.stdout) width = video_data['streams'][0]['width'] height = video_data['streams'][0]['height'] print(f'The dimensions of x are {width}') return {"statusCode": 200, "body": f"宽:{width},高:{height}"} # 捕获FFprobe执行错误 except subprocess.CalledProcessError as e: print(f"FFprobe执行错误:{e.stderr}") return {"statusCode": 500, "body": f"FFprobe失败:{e.stderr}"} # 捕获其他所有异常 except Exception as e: print(f"通用错误:{str(e)}") return {"statusCode": 500, "body": f"错误:{str(e)}"}
3. 额外优化点
- 调高Lambda内存:FFprobe处理视频需要一定内存,默认128MB可能不够,建议调到256MB或更高。
- 延长超时时间:如果视频文件较大,FFprobe处理耗时可能超过默认3秒,在Lambda配置里把超时时间调到10秒以上。
- 验证文件权限:Lambda的
/tmp目录权限是777,一般没问题,但可以在下载后打印os.stat(source_file)确认文件权限正常。
内容的提问来源于stack exchange,提问作者user3324136
相关产品推荐
相关产品推荐

