python - 在 AWS lambda 上使用 pydub

标签 python lambda ffmpeg pydub

好的,所以我遇到了和这里一样的问题:Using pydub and AWS Lambda但我认为在这里重新询问会更干净,因为我已经取得了一些进展(我认为?)。
我按照这里的说明进行操作:https://medium.com/faun/how-to-use-aws-lambda-layers-f4fe6624aff1像这样:

  • 我创建了一个 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 权限问题吗?

    最佳答案

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

    关于python - 在 AWS lambda 上使用 pydub,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62901400/

    相关文章:

    python - 通过域名将网络流量与授权列表进行比较

    python - 如何在 Pandas 数据框中用 NaN 替换所有非数字条目?

    python - 对于相关分布采样,是否有 scipy _norm_pdf 的快速替代方案?

    laravel - 将 ffmpeg 命令输出存储到 aws s3

    python - 为python安装最新版本的aubio

    python - 如何使这个 lambda 在 Python3 中正常工作?

    c++ - 从 lambda 函数构造的 boost::function_output_iterator 不可赋值

    java - 在添加到集合之前过滤对象的最简洁方法?

    ffmpeg - 我可以通过代码将 h264 和 aac 合并到 ts 流吗?

    video - H264 AVC 编解码器中的各种配置文件和设置