我希望.webm文件在到达.wav桶后被转换为.wav文件。我学习了这教程,并试图使用.webm -> .wav ffmpeg命令描述这里从我的用例中调整它。
我的AWS函数通常可以工作,因为当我的.webm文件命中源桶时,它被转换为.wav,并在目标桶中结束。但是,生成的文件.wav总是0字节(尽管.webm不是,包括适当的音频)。我把代码改错了吗?我只更改了第一个链接中的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')
}发布于 2021-04-10 17:53:38
所提供的代码使用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。
发布于 2021-12-16 05:11:02
我尝试了将数据输出到stdout的方法,但花费了超过15分钟,但失败了。
因此,我使用的EFS可以容纳超过512 MB的文件。与Lambda - AWS Lambda一起使用Amazon
https://stackoverflow.com/questions/67037257
复制相似问题