ffmpeg文件转换AWS Lambda



我希望在.web文件进入S3存储桶后将其转换为.wav文件。我遵循了本教程,并尝试使用.webm->从我的用例中进行调整。这里描述的wav-ffmpeg命令。

我的AWS Lambda函数通常是有效的,因为当我的.web文件到达源bucket时,它会被转换为.wav并最终到达目标bucket。但是,生成的文件.wav始终为0字节(尽管.web不是,包括适当的音频(。我把代码改编错了吗?我只更改了第一个链接中的ffmpeg_cmd行。

import json
import os
import subprocess
import shlex
import boto3
S3_DESTINATION_BUCKET = "hmtm-out"
SIGNED_URL_TIMEOUT = 60
def lambda_handler(event, context):
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]
s3_destination_filename = s3_source_basename + ".wav"
s3_client = boto3.client('s3')
s3_source_signed_url = s3_client.generate_presigned_url('get_object',
Params={'Bucket': s3_source_bucket, 'Key': s3_source_key},
ExpiresIn=SIGNED_URL_TIMEOUT)

ffmpeg_cmd = "/opt/bin/ffmpeg -i "" + s3_source_signed_url + "" -c:a pcm_f32le " + s3_destination_filename + " -"


command1 = shlex.split(ffmpeg_cmd)
p1 = subprocess.run(command1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
resp = s3_client.put_object(Body=p1.stdout, Bucket=S3_DESTINATION_BUCKET, Key=s3_destination_filename)
return {
'statusCode': 200,
'body': json.dumps('Processing complete successfully')
}

所示的代码使用ffmpeg的输出作为要上传的源数据。为此,ffmpeg需要输出数据。中断的命令

"-i "" + s3_source_signed_url + "" " +   # The input filename to use
"-c:a pcm_f32le " +                        # The encoder to use
s3_destination_filename + " " +            # The output filename to write to
"-"                                        # Output data to stdout

换句话说,您告诉ffmpeg使用两种不同的输出。这不是你想要的。除此之外,如果删除输出文件名,使其仅尝试使用stdout,则它将不知道使用哪种文件格式。

如果您使用以下命令:

ffmpeg_cmd = "/opt/bin/ffmpeg -i "" + s3_source_signed_url + "" -c:a pcm_f32le -f wav -"

它应该做你想做的事。这里已经指示ffmpeg以wav文件的形式输出,并仅将输出发送到stdout。

我尝试了将数据输出到stdout的方法,但它花了超过15分钟的时间,但失败了。

所以我使用EFS,它可以容纳超过512MB的文件。使用亚马逊EFS与Lambda-AWS Lambda

最新更新