Lambda 上的 FFmpeg 转码导致无法使用(静态)音频

Posted

技术标签:

【中文标题】Lambda 上的 FFmpeg 转码导致无法使用(静态)音频【英文标题】:FFmpeg transcoding on Lambda results in unusable (static) audio 【发布时间】:2019-01-31 03:26:07 【问题描述】:

我想在 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 项目中,但同样的问题仍然存在。

我被难住了! :(

【问题讨论】:

【参考方案1】:

好吧,这很有趣。

因此,Python 子进程从后台运行的一些 Lambda 进程继承了标准输入。我在看this AWS re:Invent keynote,他正在描述他们遇到的一些问题。这个问题。

我在子进程调用中添加了stdin=subprocess.DEVNULL,音频现已修复。

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

【讨论】:

好发现!对于它的价值,如果是我,我可能会让 FFmpeg 直接输出到 S3。它有一个内置的 HTTP 客户端,可以做 PUT。您可能可以使用 Python 中的标准工具预先签署一个 URL,然后将该输出 URL 传递给 FFmpeg。 你太棒了!这是困扰我好几个小时的事情! @derekhh 很高兴为您提供帮助 ^^ 太棒了,我正因为这个原因完全放弃使用 lamdba。非常感谢! 没想到这么简单!!!浪费了 5 个小时,以为它是由 ffmpeg 引起的。谢谢

以上是关于Lambda 上的 FFmpeg 转码导致无法使用(静态)音频的主要内容,如果未能解决你的问题,请参考以下文章

使用ffmpeg转码m3u8并播放

使用 ffmpeg 转码和分段

如何设置ffmpeg使得转码最快

使用ffmpeg实现转码样例(代码实现)

使用GPU硬件加速FFmpeg视频转码

ffmpeg.视频转码