Транскодирование FFmpeg в Lambda приводит к непригодному (статическому) звуку - PullRequest
0 голосов
/ 24 августа 2018

Я бы хотел перейти к использованию без сервера для процедур перекодирования звука в AWS. Я пытался настроить функцию Lambda, чтобы сделать это; выполнить статический двоичный файл FFmpeg и повторно загрузить полученный аудиофайл. Статический двоичный файл, который я использую: здесь .

Лямбда-функция, которую я использую в Python, выглядит следующим образом:

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

Вы можете прослушать вывод этого здесь . ПРЕДУПРЕЖДЕНИЕ : уменьшите громкость, иначе уши начнут кровоточить.

Исходный файл можно услышать здесь .

Кто-нибудь знает, что может быть причиной ошибок кодирования? Кажется, это не проблема с загрузкой файла, поскольку md5 на лямбда-fs совпадает с MD5 загруженного файла.

Я также пытался создать статический двоичный файл на экземпляре Amazon Linux в EC2, а затем сжать его и перенести в проект Lambda, но проблема остается.

Я в тупике! (

1 Ответ

0 голосов
/ 24 августа 2018

Хорошо, это забавно.

Так что получается, что подпроцесс Python наследует stdin от некоторых процессов Lambda, происходящих в фоновом режиме.Я смотрел этот AWS re: Invent keynote , и он описывал некоторые проблемы, с которыми они сталкивались в связи с этой проблемой.

Я добавил stdin=subprocess.DEVNULL к вызову подпроцесса, и звук теперь исправлен.

Очень интересная ошибка, если вы спросите меня.

...