AWS Lambda - FFmpeg 提取帧不写任何内容

问题描述 投票:0回答:1

我有一个带有 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))
}
amazon-web-services aws-lambda ffmpeg
1个回答
0
投票

AWS Lambda 函数只能写入

/tmp/
目录。所有其他目录都是只读的。因此,删除使用
temporaryDirectory()
的代码并确保子进程仅在
/tmp/
内输出。

最好让 Lambda 函数将输入文件下载到

/tmp/
,然后将该文件传递到
ffmpeg
。这样,您可以更好地诊断可能发生的情况。

另请注意,Lambda 环境可能会被重复使用,因此通常最好在退出 Lambda 函数之前删除新创建的文件,否则可用磁盘空间(默认为 512MB)可能会被后续执行填满。

© www.soinside.com 2019 - 2024. All rights reserved.