代码之家  ›  专栏  ›  技术社区  ›  Zaid Amir

AWS Lambda中的FFMPEG失败

  •  4
  • Zaid Amir  · 技术社区  · 7 年前

    我之前联系过亚马逊,这是他们对这个问题的回应:

    我们发现FFMPEG操作至少需要libx264和 解决这个问题需要深入到 依赖链。我们可以看到它在Amazon Linux中工作 lambda环境。可能存在一些依赖关系。 集装箱。在这里,由于FFmpeg是第三方软件,因此可以深入了解 进入依赖链并验证版本兼容性 很难做到。不幸的是,这将进一步 不在AWS支持范围内的架构和代码支持 1 . 我 有任何关于Lambda平台的问题,请让我们 知道了我们会很乐意协助的。我们将能更好地 从Lambda端提出一个问题。

    根据AWS的建议,我联系了开发人员邮件列表中的FFMPEG,但我的邮件被拒绝了,原因是它比开发人员更适合FFMPEG用户邮件列表。一周前我发了一封邮件到“ffmpeg-user@ffmpeg.org”,但还没有收到任何回复。

    然后,我建立了一个动态链接的FFMPEG版本,确保打包所有的库,检查每一个DDL,然后生成一个小的lambda函数,在所有二进制文件上循环,并将它们中的每一个都进行了比较,与从Amazon Linux获得的输出相比,LAMBDA和AWS Linux实例上都存在相同的依赖/版本。但是ffmpeg在lambda上仍然失败。

    您可以在此处找到详细的日志文件: https://www.datafilehost.com/d/6e5e21bb

    2018-08-14T12:27:10.874Z[h264@0x65c2fc0]隐藏2628 DC,2628 AC,P帧2628mV错误

    分配

    2018-08-14T12:27:10.874Z解码流时出错#0:1:无效

    2018-08-14T12:27:10.874Z[h264@0x67e86c0]无效NAL单元大小

    2018-08-14T12:27:10.874Z[h264@0x67e86c0]拆分输入时出错 进入NAL单位。

    分配

    2018-08-14T12:27:10.874Z解码流时出错#0:1:无效

    2018-08-14T12:27:10.874Z[h264@0x68189c0]无效NAL单元大小 (71106974>1085)。

    进入NAL单位。

    2018-08-14T12:27:10.874Z[aac@0x65d2f00]脉冲刀具不允许进入

    此日志是在尝试对此文件执行HLS转码时生成的: https://www.datafilehost.com/d/999a4492

    请注意,该问题不仅与该文件有关,也与HLS、其常规和发生在所有视频和任何试图搜索流的ffmpeg命令有关,甚至尝试使用最简单的形式从视频中提取单个帧,例如: ffmpeg -ss 00:00:02 -I file.mp4 -vframes 1 -y output.jpg 也会因日志文件中的相同错误而失败。

    3 回复  |  直到 7 年前
        1
  •  1
  •   derekhh    7 年前

    我今天碰到了同样的问题,花了好几个小时。但最后我发现了 SO answer 找到了解决办法。

    基本上,您需要确保没有将STDIN传递给FFmpeg进程。这在re:Invent talk中提到过 on this slide .

        2
  •  0
  •   faxi    7 年前

    如果您在使用ffmpeg时遇到问题,请改用avconv。avconv是ffmpeg的一个分支,可以用同样的方式调用。当我试图在lambda环境中解码aac音频流时,我遇到了与ffmpeg相同的问题,但是John Van sickel的avconv的静态构建对我起到了预期的作用。

        3
  •  0
  •   ambientlight    7 年前

    你试过使用静态编译的ffmpeg吗?

    以下是对我有用的:

    1. https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz
    2. 除了 ffmpeg 二进制本身。chmod此二进制文件以允许执行并放入 bin/ffmpeg
    3. 将ffmpeg二进制文件复制到 /tmp . (如果从中执行ffmpeg,我得到操作不允许错误 /var/task/bin /tmp公司
    4. 补充 /tmp公司 ffmpeg 将在路径处可用。(在使用某些第三方时需要,这些第三方会将内部的ffmpeg调用 pydub )

    以下是相关的python代码,因为lambda容器将被重用, 可能已经包含复制的ffmpeg。

    from os import environ, path
    from shutil import copy2
    
    # check if we have ffmpeg inside /tmp, if we do, no need to copy
    # otherwise copy ffmpeg from /var/task/bin to /tmp
    if environ.get('AWS_EXECUTION_ENV', '').startswith('AWS_Lambda_') and not path.isfile('/tmp/ffmpeg'):
        copy2(path.join(PROJECT_ROOT, 'bin/ffmpeg'), '/tmp/ffmpeg')
    
    # add /tmp to search paths if it's not there
    # so ffmpeg executed from pydub will be found
    custom_deps_bin_path = '/tmp/'
    if environ.get('AWS_EXECUTION_ENV', '').startswith('AWS_Lambda_') and custom_deps_bin_path not in environ['PATH']:
        environ['PATH'] += ":" + custom_deps_bin_path
    

    此外,几乎没有相关的第三方:

    1. binoculars/aws-lambda-ffmpeg
    2. ubergarm/zappa-ffmpeg