AWS Lambda使用FFmpeg处理S3视频报错:文件或目录不存在
问题排查与解决
1. 确认输入视频已成功下载至Lambda的/tmp目录
Lambda仅允许读写/tmp目录,若未将S3中的源视频正确下载到该目录,ffmpeg会因找不到输入文件而无法生成输出文件。检查你的S3下载代码:
import boto3 s3 = boto3.client('s3') bucket = event['Records'][0]['s3']['bucket']['name'] key = event['Records'][0]['s3']['object']['key'] # 确保下载路径正确 s3.download_file(bucket, key, '/tmp/input.mp4')
同时确认Lambda执行角色拥有目标S3桶的GetObject权限。
2. 捕获ffmpeg命令的执行日志
ffmpeg命令执行失败时不会主动抛出Python异常,仅返回非0退出码,需捕获输出日志才能定位问题。修改你的ffmpeg执行代码:
import subprocess # 示例降分辨率命令(保持宽高比,将高度设为720) cmd = [ 'ffmpeg', '-i', '/tmp/input.mp4', '-vf', 'scale=-2:720', '-c:v', 'libx264', '-crf', '23', '-preset', 'fast', '-c:a', 'copy', '/tmp/resizedVideo.mp4' ] # 捕获命令输出与错误信息 result = subprocess.run(cmd, capture_output=True, text=True) print("FFmpeg stdout:", result.stdout) print("FFmpeg stderr:", result.stderr) print("Return code:", result.returncode) # 命令执行失败时主动抛出异常 if result.returncode != 0: raise Exception(f"FFmpeg执行失败: {result.stderr}")
查看CloudWatch日志中的ffmpeg错误输出,常见问题包括输入文件损坏、参数格式错误(如scale参数写法不对)。
3. 检查/tmp目录的空间与权限
Lambda的/tmp目录默认有512MB存储空间,若源视频过大导致处理时空间不足,也会无法生成输出文件。可添加代码查看剩余空间:
import shutil disk_usage = shutil.disk_usage('/tmp') print(f"/tmp剩余空间: {disk_usage.free / 1024 / 1024:.2f} MB")
另外,/tmp目录默认权限为777,可通过以下代码确认:
import os print("/tmp目录权限:", oct(os.stat('/tmp').st_mode)[-3:])
4. 核对输出文件路径的准确性
确保后续操作(如上传至S3)使用的路径与ffmpeg输出路径完全一致,避免大小写、拼写错误(Linux系统路径区分大小写)。
常见错误案例
- 输入文件路径错误:下载时用
/tmp/input.mp4,但ffmpeg命令中写成/tmp/Input.mp4 - ffmpeg参数错误:scale参数格式错误(如写成
720:-2而非scale=-2:720) - 源视频编码不兼容:ffmpeg无法识别输入视频的编码格式
内容的提问来源于stack exchange,提问作者squish
相关产品推荐
相关产品推荐

