所以我按照本教程设置了所有内容,并更改了一些功能来压缩视频,但无论我尝试什么,对于较大的视频(基本上是任何超过50-100MB的视频),输出文件总是会被缩短,并且根据我使用的编码设置,将被减少不同的数量。我尝试使用这里找到的解决方案,在我的ffmpeg命令中添加- nodin标志,但这似乎也没有解决这个问题。
另一个奇怪的事情是,无论我尝试什么,如果我删除'- fmpegts '标志,输出视频将是0B。
我的Lambda函数设置了3008 mb的内存(提交了机票我的限制了,所以我可以使用完整的10240 mb可用),和2048 mb的临时性存储(老实说,我不知道我需要什么超过最低512,但我将尝试修复问题)。当我检查我的cloudwatch日志时,对于非常大的文件,它偶尔会超时,但除此之外,我不会收到任何错误消息,只有标准的开始、结束和计费时间消息。
这是lambda函数的代码。
import json
import os
import subprocess
import shlex
import boto3
S3_DESTINATION_BUCKET = "rw-video-out"
SIGNED_URL_TIMEOUT = 600
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 + "-comp.mp4"
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 = f"/opt/bin/ffmpeg -nostdin -i {s3_source_signed_url} -f mpegts libx264 -preset fast -crf 28 -c:a copy - "
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)
s3 = boto3.resource('s3')
s3.Object(s3_source_bucket,s3_source_key).delete()
return {
'statusCode': 200,
'body': json.dumps('Processing complete successfully')
}
这是我提到的解决方案中的代码,但是当我尝试使用此代码时,我得到output.mp4 not found errors
def lambda_handler(event, context):
print(event)
os.chdir('/tmp')
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 + ".mp4"
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)
print(s3_source_signed_url)
s3_client.download_file(s3_source_bucket,s3_source_key,s3_source_key)
# ffmpeg_cmd = "/opt/bin/ffmpeg -framerate 25 -i "" + s3_source_signed_url + "" output.mp4 "
ffmpeg_cmd = f"/opt/bin/ffmpeg -framerate 25 -i {s3_source_key} output.mp4 "
# command1 = shlex.split(ffmpeg_cmd)
# print(command1)
os.system(ffmpeg_cmd)
# os.system('ls')
# p1 = subprocess.run(command1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
file = 'output.mp4'
resp = s3_client.put_object(Body=open(file,"rb"), Bucket=S3_DESTINATION_BUCKET, Key=s3_destination_filename)
# resp = s3_client.put_object(Body=p1.stdout, Bucket=S3_DESTINATION_BUCKET, Key=s3_destination_filename)
s3 = boto3.resource('s3')
s3.Object(s3_source_bucket,s3_source_key).delete()
return {
'statusCode': 200,
'body': json.dumps('Processing complete successfully')
}
任何帮助都将是非常感激的。
好的,所以看起来我早些时候发布的解决方案实际上确实有效,我的问题是我改变了ffmpeg命令使用s3_source_signed_url,而不是s3_source_key,将其更改回s3_source_key并添加- nodin标志似乎已经解决了我的问题。