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 添加到子进程调用,现在音频已修复。

如果你问我,这是一个非常有趣的错误。