我有一个带有 ffmpeg 层的 lambda。
我想使用的命令基本上是
ffmpeg -i video.mp4 -qscale:v 2 -vf fps=8 '%04d.jpg'
因此它有一个输入文件,并在同一文件夹中每秒创建 8 帧
这段代码似乎除了写入文件之外做了所有的事情,我错过了什么?
import ...
SIGNED_URL_TIMEOUT = 60
FPS_SAMPLES = 8
def lambda_handler(event, context):
# Set up logging.
logger = logging.getLogger(__name__)
s3_client = boto3.client('s3')
s3_source_bucket = event['Records'][0]['s3']['bucket']['name']
s3_source_key = event['Records'][0]['s3']['object']['key']
s3_source_basename = os.path.splitext(os.path.basename(s3_source_key))[0]
logger.info( "bucket: %s, key: %s, basename: %s",s3_source_bucket, s3_source_key, s3_source_basename)
s3_source_signed_url = s3_client.generate_presigned_url('get_object',
Params={'Bucket': s3_source_bucket, 'Key': s3_source_key},
ExpiresIn=SIGNED_URL_TIMEOUT)
with tempfile.TemporaryDirectory() as tmpdir:
os.chdir(tmpdir) # change the current folder to that one (current one is in os.getcwd())
cwd = os.getcwd()
ffmpeg_cmd = "/opt/bin/ffmpeg -i \"" + s3_source_signed_url + "\" -qscale:v 2 -vf fps="+str(FPS_SAMPLES)+" "+ cwd + "/'%04d.jpg'"
print("COMMAND: "+ffmpeg_cmd)
command1 = shlex.split(ffmpeg_cmd)
p1 = subprocess.run(command1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# List all files and directories in the current directory
contents = os.listdir(cwd)
# Print the contents
print(f"Contents of {cwd}:")
for item in contents:
print(item) # <--- NOthing here...
return {
'statusCode': 200,
'body': json.dumps("bucket: %s, key: %s, basename: %s" % (s3_source_bucket, s3_source_key, s3_source_basename))
}
AWS Lambda 函数只能写入
/tmp/
目录。所有其他目录都是只读的。因此,删除使用 temporaryDirectory()
的代码并确保子进程仅在 /tmp/
内输出。
最好让 Lambda 函数将输入文件下载到
/tmp/
,然后将该文件传递到 ffmpeg
。这样,您可以更好地诊断可能发生的情况。
另请注意,Lambda 环境可能会被重复使用,因此通常最好在退出 Lambda 函数之前删除新创建的文件,否则可用磁盘空间(默认为 512MB)可能会被后续执行填满。