Lambda 上的 FFmpeg 转码导致音频不可用(静态)
FFmpeg transcoding on Lambda results in unusable (static) audio
我想在 AWS 中转向无服务器音频转码例程。我一直在尝试设置一个 Lambda 函数来做到这一点;执行静态 FFmpeg 二进制文件并重新上传生成的音频文件。我使用的静态二进制文件是 here.
我在 Python 中使用的 Lambda 函数如下所示:
import boto3
s3client = boto3.client('s3')
s3resource = boto3.client('s3')
import json
import subprocess
from io import BytesIO
import os
os.system("cp -ra ./bin/ffmpeg /tmp/")
os.system("chmod -R 775 /tmp")
def lambda_handler(event, context):
bucketname = event["Records"][0]["s3"]["bucket"]["name"]
filename = event["Records"][0]["s3"]["object"]["key"]
audioData = grabFromS3(bucketname, filename)
with open('/tmp/' + filename, 'wb') as f:
f.write(audioData.read())
os.chdir('/tmp/')
try:
process = subprocess.check_output(['./ffmpeg -i /tmp/joe_and_bill.wav /tmp/joe_and_bill.aac'], shell=True, stderr=subprocess.STDOUT)
pushToS3(bucketname, filename)
return process.decode('utf-8')
except subprocess.CalledProcessError as e:
return e.output.decode('utf-8'), os.listdir()
def grabFromS3(bucket, file):
obj = s3client.get_object(Bucket=bucket, Key=file)
data = BytesIO(obj['Body'].read())
return(data)
def pushToS3(bucket, file):
s3client.upload_file('/tmp/' + file[:-4] + '.aac', bucket, file[:-4] + '.aac')
return
你可以听听这个here的输出。 警告:调低音量,否则耳朵会流血。
可以听到原文件here。
有谁知道可能导致编码错误的原因是什么?这似乎不是文件上传的问题,因为 Lambda fs 上的 md5 与上传文件的 MD5 匹配。
我还尝试在 EC2 中的 Amazon Linux 实例上构建静态二进制文件,然后将其压缩并移植到 Lambda 项目中,但同样的问题仍然存在。
我难住了! :(
好吧,这很有趣。
因此 Python 子进程从一些在后台运行的 Lambda 进程继承了 stdin。我在看 this AWS re:Invent keynote,他在描述他们遇到的一些问题 w.r.t。这个问题。
我将 stdin=subprocess.DEVNULL
添加到子进程调用,现在音频已修复。
如果你问我,这是一个非常有趣的错误。
我想在 AWS 中转向无服务器音频转码例程。我一直在尝试设置一个 Lambda 函数来做到这一点;执行静态 FFmpeg 二进制文件并重新上传生成的音频文件。我使用的静态二进制文件是 here.
我在 Python 中使用的 Lambda 函数如下所示:
import boto3
s3client = boto3.client('s3')
s3resource = boto3.client('s3')
import json
import subprocess
from io import BytesIO
import os
os.system("cp -ra ./bin/ffmpeg /tmp/")
os.system("chmod -R 775 /tmp")
def lambda_handler(event, context):
bucketname = event["Records"][0]["s3"]["bucket"]["name"]
filename = event["Records"][0]["s3"]["object"]["key"]
audioData = grabFromS3(bucketname, filename)
with open('/tmp/' + filename, 'wb') as f:
f.write(audioData.read())
os.chdir('/tmp/')
try:
process = subprocess.check_output(['./ffmpeg -i /tmp/joe_and_bill.wav /tmp/joe_and_bill.aac'], shell=True, stderr=subprocess.STDOUT)
pushToS3(bucketname, filename)
return process.decode('utf-8')
except subprocess.CalledProcessError as e:
return e.output.decode('utf-8'), os.listdir()
def grabFromS3(bucket, file):
obj = s3client.get_object(Bucket=bucket, Key=file)
data = BytesIO(obj['Body'].read())
return(data)
def pushToS3(bucket, file):
s3client.upload_file('/tmp/' + file[:-4] + '.aac', bucket, file[:-4] + '.aac')
return
你可以听听这个here的输出。 警告:调低音量,否则耳朵会流血。
可以听到原文件here。
有谁知道可能导致编码错误的原因是什么?这似乎不是文件上传的问题,因为 Lambda fs 上的 md5 与上传文件的 MD5 匹配。
我还尝试在 EC2 中的 Amazon Linux 实例上构建静态二进制文件,然后将其压缩并移植到 Lambda 项目中,但同样的问题仍然存在。
我难住了! :(
好吧,这很有趣。
因此 Python 子进程从一些在后台运行的 Lambda 进程继承了 stdin。我在看 this AWS re:Invent keynote,他在描述他们遇到的一些问题 w.r.t。这个问题。
我将 stdin=subprocess.DEVNULL
添加到子进程调用,现在音频已修复。
如果你问我,这是一个非常有趣的错误。