【发布时间】:2021-04-10 17:21:21
【问题描述】:
我希望 .webm 文件在到达我的 S3 存储桶后转换为 .wav 文件。我遵循this 教程并尝试使用here 描述的.webm -> .wav ffmpeg 命令根据我的用例对其进行调整。
我的 AWS Lambda 函数通常有效,因为当我的 .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')
}
【问题讨论】:
-
不确定哪些语句实际上在等待子进程/命令,但您是否确保
subprocess.run在返回 p1 之前等待命令完成?如果不是这种情况,您在尝试转换为该文件后立即上传一个空文件,但上传是在转换开始之前完成的。
标签: amazon-web-services amazon-s3 ffmpeg aws-lambda