簡體   English   中英

在 AWS lambda 上使用 pydub

[英]Using pydub on AWS lambda

好的,所以我和這里有同樣的問題: 使用 pydub 和 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 function,並且我已經以編程方式確認它們存在,但它們無法運行。

我的代碼現在是這樣的:

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 權限問題嗎?

要使用pydub庫和許多其他聲音播放庫,您必須將ffmpeg.exe安裝到同一目錄。 您可以從此處下載該可執行文件https://ffmpeg.org/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM