AWS Lambda制作视频缩略图

Jes*_*sus 22 ffmpeg amazon-web-services node.js aws-lambda

我想从上传到S3的视频制作缩略图,我知道如何使用Node.js和ffmpeg.

根据这个论坛帖子,我可以添加库:

ImageMagick是默认情况下当前提供的唯一外部库,但您可以在创建Lambda函数时提供的zip文件中包含任何其他依赖项.请注意,如果这是本机库或可执行文件,则需要确保它在Amazon Linux上运行.

但是如何在aws lambda上放置静态ffmpeg二进制文件?

我怎样才能从Node.js调用这个带有AWS Lambda的静态二进制文件(ffmpeg)?

我是亚马逊AWS和Linux的新手

谁能帮我?

Rus*_*ney 37

Naveen概述的过程是正确的,但它掩盖了一个非常痛苦的细节 - 包括zip中的ffmpeg二进制文件并在lambda函数中访问它.

我刚刚经历过这个,它是这样的:

  1. 在你的zipped lambda函数包中包含ffmpeg静态二进制文件(我有一个gulp任务,可以在/dist每次构建时将其复制到其中)
  2. 当你的函数被调用时,将二进制文件移动到一个/tmp/目录,然后chmod让它自己访问(2017年2月更新:据报道这已不再需要了,re:@loretoparisi@allen答案).
  3. 更新您的PATH以包含ffmpeg可执行文件(我使用了fluent-ffmpeg,它允许您设置两个env变量来更轻松地处理它.

如果需要更多细节,请告诉我,我可以更新这个答案.

副本和chmod(第2步)显然不是理想的....很想知道是否有人找到了更好的方法来处理这个问题,或者这是否适用于这种架构风格.

(第二次更新,在第一次更新之前写它b/c它更相关):

不再需要copy + chmod步骤,正如@Allen指出的那样 - 我正在/ var/task /中直接在Lambda函数中执行ffmpeg,此时没有任何问题.chmod 755在将它们上传到Lambda之前,请确保使用任何二进制文件(同样@Allen指出).

我不再使用流利的ffmpeg来完成这项工作.相反,我正在更新PATH以包含process.env['LAMBDA_TASK_ROOT']和执行简单的bash脚本.

在Lambda函数的顶部:

process.env['PATH'] = process.env['PATH'] + "/" + process.env['LAMBDA_TASK_ROOT']
Run Code Online (Sandbox Code Playgroud)

对于使用ffmpeg:lambda-pngs-to-mp4的示例.

对于一系列有用的lambda组件:lambduh.

以下更新留给后人,但不再需要:

更新详细信息:

我在这里下载了静态ffmpeg二进制文件.亚马逊建议启动EC2并构建一个二进制文件供您在那里使用,因为该环境将与Lambda运行的条件相同.可能是一个好主意,但更多的工作,这个静态下载对我有用.

我只将ffmpeg二进制文件拖到项目的待存档/dist文件夹中.

当你将zip上传到lambda时,它就存在于/var/task/.无论出于何种原因,我遇到了尝试在该位置使用二进制文件的访问问题,以及尝试编辑该文件的权限的更多问题.快速解决方法是将二进制文件移动到其上/tmp/并对其进行chmod权限处理.

在Node中,您可以通过a运行shell child_process.我做的是这样的:

require('child_process').exec(
  'cp /var/task/ffmpeg /tmp/.; chmod 755 /tmp/ffmpeg;',
  function (error, stdout, stderr) {
    if (error) {
      //handle error
    } else {
      console.log("stdout: " + stdout)
      console.log("stderr: " + stderr)
      //handle success
    }
  }
)
Run Code Online (Sandbox Code Playgroud)

这个应该在lambda函数中给你一个可执行的ffmpeg二进制文件 - 但你仍然需要确保它在你的$ PATH上.

我放弃了fluent-ffmpeg并使用node来启动ffmpeg命令,而只是从节点中启动一个bash脚本,所以对我来说,我必须/tmp/在lambda函数的顶部添加我的路径:

process.env.PATH = process.env.PATH + ':/tmp/'

如果使用fluent-ffmpeg,则可以通过以下方式设置ffmpeg的路径:

process.env['FFMPEG_PATH'] = '/tmp/ffmpeg';

有点相关/无耻的自我插件:我正在研究一组模块,以Lambduh的名义更容易用可组合模块构建Lambda函数.可以节省一些时间将这些东西放在一起.一个简单的例子:使用lambduh-execute处理这个场景就像这样简单:

promises.push(execute({
  shell: "cp /var/task/ffmpeg /tmp/.; chmod 755 /tmp/ffmpeg",
})
Run Code Online (Sandbox Code Playgroud)

promises承诺的数组在哪里运行.


BKH*_*BKH 6

我创建了一个GitHub repo来完成这个(以及同时调整视频大小).Russ Matney的回答非常有助于使FFmpeg文件可执行.