AWS Lambda中的FFMPEG失败

问题描述 投票:4回答:3

我正在尝试为短视频创建转码功能。该功能托管在AWS Lambda上。问题是AWS lambda似乎缺少了FFMPEG所需要的东西,至少亚马逊认为。

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

我们发现FFMPEG操作至少需要libx264和一个acc库,两者都有自己的依赖关系。要解决这个问题,它将涉及深入到完整的依赖关系链。我们可以看到它在Amazon Linux环境中工作,但环境与lambda环境相似但不完全相同。由于Lambda在容器上运行,因此Amazon Linux中可能存在一些依赖关系但不存在于lambda环境中。在这里,由于FFmpeg是第三方软件,因此深入了解依赖关系链并验证版本兼容性是非常困难的。不幸的是,进一步,这必然会进入AWS支持范围1之外的架构和代码支持。我希望你理解我们的局限。但是,如果FFmpeg支持有任何特定于Lambda平台的问题,请告诉我们,我们将很乐意为您提供帮助。一旦您收到FFmpeg支持的更新建议Lambda end的问题,我们将能够更好地进行调查。

根据AWS的建议,我在开发人员邮件列表上联系了FFMPEG,我的邮件被拒绝了,原因是它比开发人员更适合ffmpeg用户邮件列表。我在一周前发了一封电子邮件给'[email protected]',但还没有得到任何答复。

然后我去构建一个动态链接的ffmpeg版本,确保打包所有库,在每个库上检查ddl,然后创建一个小的lambda函数,循环遍历所有二进制文件并对其中的每一个进行驱动,将其与我从亚马逊获得的输出进行比较在lambda和AWS Linux实例上都存在Linux和相同的依赖项/版本,但是lambda上的ffmpeg仍然失败。

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

这是我收到的错误的一个示例,在整个日志文件中重复:

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

2018-08-14T12:27:10.874Z [aac @ 0x65d2f00]未分配通道元素2.11

2018-08-14T12:27:10.874Z解码流#0时出错:1:处理输入时发现无效数据

2018-08-14T12:27:10.874Z [h264 @ 0x67e86c0]无效的NAL单位大小(108085662> 1649)。

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

2018-08-14T12:27:10.874Z [aac @ 0x65d2f00]未分配通道元素2.0

2018-08-14T12:27:10.874Z解码流#0时出错:1:处理输入时发现无效数据

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

2018-08-14T12:27:10.874Z [h264 @ 0x68189c0]将输入拆分为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也会在日志文件中出现相同的错误。

不知道如何进一步调试。尝试使用'-loglevel debug'启用调试日志,但没有给我任何额外的信息。任何帮助或建议

amazon-web-services ffmpeg aws-lambda h.264 aac
3个回答
1
投票

我今天遇到了完全相同的问题,花了好几个小时。但最后我遇到了这个SO answer并找到了解决方案。

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


0
投票

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

另外,确保为lambda函数分配足够的RAM。静态ffmpeg二进制文件很大,编码需要大量的RAM,尤其是在编码视频时。


0
投票

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

这对我有用:

  1. https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz抓住了ffmpeg的静态构建
  2. 提取并丢弃除ffmpeg二进制本身之外的所有内容。 chmod这个二进制文件允许执行并放入部署文件夹中的bin/ffmpeg(在我的情况下,该文件夹将由zappa压缩和部署)
  3. /tmp中复制了ffmpeg二进制文件。 (如果从/var/task/bin执行ffmpeg,我的操作不允许出错,我对ffmpeg本身的了解有限,但我的假设是ffmpeg会在处理过程中创建临时文件,因为lambda有一个只读文件系统,这只能在里面完成/tmp,在我的情况下我将caf转换为mp4)
  4. 添加/tmp到搜索路径,因此ffmpeg将在路径上可用。 (当使用像pydub那样封装ffmpeg调用的第三方时需要)

这是相关的python代码,因为lambda容器将被重用,/tmp可能已包含复制的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
© www.soinside.com 2019 - 2024. All rights reserved.