【问题标题】:Using pydub on AWS lambda在 AWS lambda 上使用 pydub
【发布时间】:2020-11-04 03:45:48
【问题描述】:

好的,所以我遇到了与这里相同的问题:Using pydub and AWS Lambda 但我认为在这里重新询问会更清楚,因为我已经取得了一些进展(我认为?)。

我按照这里的说明进行操作:https://medium.com/faun/how-to-use-aws-lambda-layers-f4fe6624aff1 像这样:

  1. 我创建了一个 lambda_function.py 文件:
from python.pydub import AudioSegment

print('Loading function')


def lambda_handler(event, context):
    print(event)

    sound = AudioSegment.from_mp3("https://s3-eu-west-1.amazonaws.com/audio.mp3")

    etc...

使用 docker,我用这个脚本创建了依赖项:

#!/bin/bash

export PKG_DIR="python"

rm -rf ${PKG_DIR} && mkdir -p ${PKG_DIR}

docker run --rm -v $(pwd):/foo -w /foo lambci/lambda:build-python3.6 \
    pip install -r requirements.txt --no-deps -t ${PKG_DIR}

以及 requirements.txt 文件:

pydub
ffmpeg

Docker 下载了 4 个文件夹:

ffmpeg
ffmpeg-1.4.dist-info
pydub
pydub-0.24.1.dist-info

我将整个项目以 zip 文件的形式上传到 lambda。

当我运行代码时出现错误:

/var/task/pydub/utils.py:170: RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work

我猜我需要将 ffmpeg 二进制文件上传到 Lambda,但我不确定,如果我这样做了,也不知道该怎么做。

我缺少哪些步骤?

更新:

所以我修改了我的代码并使用 pycharm 运行了代码。尽管 ffmpeg 和 ffprobe 已上传到我的 lambda 函数,并且我已通过编程方式确认它们存在,但它们无法运行。

我的代码现在是这样的:

def lambda_handler(event, context):
    
    l = logging.getLogger("pydub.converter")
    l.setLevel(logging.DEBUG)
    l.addHandler(logging.StreamHandler())

    AudioSegment.converter='/var/task/ffmpeg'
    
    print(event)

    print("00000")
    print (os.getcwd())
    print("00000")
    
    print ("1111")
    path = "/var/task"
    dir_list = os.listdir(path)
    print (dir_list)
    print ("1111")

    print ("11111111111111111")
    out = check_output(['/var/task/ffprobe', 'test.mp3'])
    print (out)
    print ("11111111111111111")

这是 cloudwatch 错误日志:

00000
/var/task
00000
1111
['.DS_Store', 'ffmpeg', 'get_layer_packages.sh', 'lambda_function.py', 'lambda_function.py.orig.py', 'python', 'requirements.txt', 'test.mp3']
1111
11111111111111111

[Errno 8] Exec format error: '/var/task/ffmpeg': OSError
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 32, in lambda_handler
    out = check_output(['/var/task/ffmpeg', 'test.mp3'])
  File "/var/lang/lib/python3.6/subprocess.py", line 356, in check_output
    **kwargs).stdout
  File "/var/lang/lib/python3.6/subprocess.py", line 423, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/var/lang/lib/python3.6/subprocess.py", line 729, in __init__
    restore_signals, start_new_session)
  File "/var/lang/lib/python3.6/subprocess.py", line 1364, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
OSError: [Errno 8] Exec format error: '/var/task/ffmpeg'

有什么想法吗?我使用 chmod +x 使 ffmpeg 和 ffprobe 可执行

这可能是某种 lambda 权限问题吗?

【问题讨论】:

  • 感谢您接受 :))

标签: python lambda ffmpeg pydub


【解决方案1】:

要使用pydub 库和许多其他声音播放库,您必须将ffmpeg.exe 安装到同一目录。您可以从这里下载该可执行文件https://ffmpeg.org/

【讨论】:

  • 好的,我添加了 ffmpeg 可执行文件(ffmpeg-4.3-i686-static 从这里:johnvansickle.com/ffmpeg)并且 ffmpeg 错误消失了。但是,我现在有一个 ffprobe 错误,并且将 ffprobe 添加到我的项目根目录(使用 chmod +x)没有帮助。有什么想法吗?
  • 更新:看来ffprobe和python 3.8有问题?我已经升级到 2.7,现在没有收到 ffmpeg/ffprobe 投诉。但是,我有新问题,发布在这里:stackoverflow.com/questions/62905735/…
  • @MichaelHarrison,因为 FFmpeg 错误消失了,您能接受我的问题并投票吗?
  • @MichaelHarrison 你能接受吗?请点击下方的第二个按钮:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 2020-04-21
相关资源
最近更新 更多