node.js - AWS Lambda 制作视频缩略图

标签 node.js amazon-web-services ffmpeg aws-lambda

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

根据this forum post我可以添加库:

ImageMagick is the only external library that is currently provided by default, but you can include any additional dependencies in the zip file you provide when you create a Lambda function. Note that if this is a native library or executable, you will need to ensure that it runs on Amazon Linux.

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

我如何使用 AWS Lambda 从 Node.js 调用这个静态二进制文件 (ffmpeg)?

我是亚马逊 AWS 和 Linux 的新手

谁能帮帮我?

最佳答案

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

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

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

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

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

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

正如@Allen 指出的那样,不再需要复制 + chmod 步骤——我正在直接从/var/task/在 Lambda 函数中执行 ffmpeg,此时没有任何问题。在将它们上传到 Lambda 之前,请务必 chmod 755 任何二进制文件(也正如 @Allen 指出的那样)。

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

在您的 Lambda 函数的顶部:

process.env['PATH'] = process.env['PATH'] + "/" + process.env['LAMBDA_TASK_ROOT']

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

对于大量有用的 lambda 组件:lambduh .

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

更新更多细节:

我下载了静态 ffmpeg 二进制文件 here . Amazon 建议启动 EC2 并在其中构建一个二进制文件供您使用,因为该环境将与 Lambda 运行的条件相同。可能是个好主意,但需要做更多工作,而且这个静态下载对我有用。

我只将 ffmpeg 二进制文件提取到我的项目的待归档 /dist 文件夹中。

当您将 zip 上传到 lambda 时,它位于 /var/task/。无论出于何种原因,我在尝试使用该位置的二进制文件时遇到了访问问题,以及尝试在该位置编辑文件权限的更多问题。一个快速的解决方法是将二进制文件移动到 /tmp/chmod 权限那里。

在 Node 中,您可以通过 child_process 运行 shell。我所做的看起来像这样:

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
    }
  }
)

这应该会在你的 lambda 函数中为你提供一个可执行的 ffmpeg 二进制文件——但你仍然需要确保它在你的 $PATH 上。

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

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

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

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

有点相关/无耻的自插入:我正在开发一组模块,以使使用可组合模块构建 Lambda 函数更容易,名称为 Lambduh。 .将这些东西放在一起可能会节省一些时间。一个简单的例子:用 lambduh-execute 处理这个场景就这么简单:

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

其中 promises 是要运行的 promise 数组。

关于node.js - AWS Lambda 制作视频缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27708573/

相关文章:

javascript - Node.js 中的异步操作是否仅在执行服务器应用程序时才需要?

ruby-on-rails - Node.js 和 Rails 应用程序托管,具有共享 MongoDB 数据库和定价

sql - 如何在 AWS Athena 中编写多个 SQL 语句,如 CREATE 表(使用 CLI 命令 - aws athena start-query-execution --query-string {value} )?

java - 我的 EMR 集群在哪里

audio - 如何使用 ffmpeg 叠加/缩混两个音频文件

ffmpeg - 有没有办法让多个视频源循环与 ffmpeg 一起旋转?

ffmpeg - 如何在 JPEG 中编码 HEVC 平铺?

javascript - NeDB 未加载或存储到文件

node.js - 我可以使用服务器端生成的 token 将文件上传到客户端的谷歌驱动器(angularjs)

python - S3.Client.upload_file() 和 S3.Client.upload_fileobj() 有什么区别?