热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在Lambda上进行FFmpeg转码会导致无法使用的(静态)音频》经验,为你挑选了1个好方法。

我想转向无服务器以在AWS中进行音频转码例程。我一直在尝试设置Lambda函数来做到这一点;执行静态FFmpeg二进制文件,然后重新上传结果音频文件。我正在使用的静态二进制文件在这里。

我在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

您可以在这里收听此输出。警告:调低音量,否则耳朵会流血。

原始文件可以在这里听到。

有谁知道导致编码错误的原因是什么?文件上传似乎没有问题,因为Lambda fs上的md5与上传文件的MD5匹配。

我还尝试在EC2中的Amazon Linux实例上构建静态二进制文件,然后将其压缩并移植到Lambda项目中,但是仍然存在相同的问题。

我很沮丧!:(



1> jmkmay..:

好吧,这是一个有趣的过程。

因此事实证明,Python子进程从后台进行的某些Lambda进程继承了stdin。我正在看这个AWS re:Invent主题演讲,他正在描述他们遇到的一些问题。

我已添加stdin=subprocess.DEVNULL到子流程调用,并且音频现已修复。

如果您问我一个非常有趣的错误。


推荐阅读
author-avatar
税绍彬_396
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有