【问题标题】:Issue with running ffmpeg command using python in AWS Lambda function在 AWS Lambda 函数中使用 python 运行 ffmpeg 命令的问题
【发布时间】:2021-04-13 18:42:29
【问题描述】:

我的用例是使用 ffmpeg 连接文件。我通过指定要连接的文件的 S3 URL(在文本文件 /tmp/files.txt 中)来做到这一点。

以下是命令以及我使用 Python 运行它的方式:

ffmpeg_cmd = "ffmpeg -f concat -safe 0 -protocol_whitelist file,http,https,tcp,tls -i /tmp/files.txt -c copy /tmp/output.mp4"
subprocess.run(ffmpeg_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

当我在我的 Windows 机器上运行相同的 Python 文件时,它运行得非常好。但是当它在 AWS Lambda 函数上运行时,它会失败。请在下面找到我得到的错误:

"errorMessage": "[Errno 2] 没有这样的文件或目录:'ffmpeg -f concat -safe 0 -protocol_whitelist 文件,http,https,tcp,tls -i /tmp/files.txt -c 复制 /tmp/output.mp4'", "errorType": “文件未找到错误”

我做对了吗?我想是的,因为它在我的 Windows PC 上运行良好。

如果有人遇到此问题并已解决,请帮助我解决此问题。

【问题讨论】:

  • 您需要先确保/tmp/files.txt存在于本地Lambda文件系统中。
  • 确实存在。我创建预签名的 S3 URL 并使用这些 URL 更新 files.txt 文件。我打印内容以确保文件存在并具有所需的数据。
  • 正如我在问题中提到的,同样的脚本在 Windows 机器上运行时也能正常工作。
  • 您是如何将 ffmpeg 部署到 Lambda 运行时环境中的?

标签: python amazon-web-services ffmpeg aws-lambda


【解决方案1】:

FFMPEG 未预安装在 Lambda 运行时环境中。它必须明确部署为 Lambda 层或与您的 Lambda 函数捆绑并上传。如果您确实部署了它,那么 ffmpeg 二进制文件可能无法执行或可能不在您的 PATH 上。

这里有一些部署 FFMPEG 的选项:

  1. ffmpeg-aws-lambda-layer
  2. ffmpeg-lambda-layer
  3. install FFMPEG on Lambda

我测试了一个简单的 Lambda Python 函数没有 FFMPEG 二进制文件,并准确地看到了您所看到的错误消息。这证明 ffmpeg 二进制文件未安装在您的 Lambda 环境中或未安装在您的 PATH 中。上传的ffmpeg 二进制文件的实际位置取决于您将其上传到的位置,但如果您将二进制文件作为 Lambda 层的一部分上传,它通常位于 /var/task/ 下,如果作为 Lambda 包的一部分部署,它通常位于 /opt/ 下.与其简单地尝试执行 ffmpeg,不如列出这些位置中的文件以验证您已部署的内容。

【讨论】:

  • 是的,知道这一点,我已经为ffmpeg依赖添加了一个层。我还有另一个用于创建视频剪辑的 Lambda 函数。在那个 Lambda 函数中,我已经在运行 ffmpeg 命令并创建视频剪辑。由于一些奇怪的原因,我无法在这个 Lambda 函数中运行这个 ffmpeg 命令。
  • 假设找不到的是 ffmpeg,我尝试了:“ffmpeg”、“/opt/ffmpeg”、“./ffmpeg”等,但这些都没有帮助。跨度>
  • 添加了有关已部署文件位置的更新文本。您需要验证您用于上传 ffmpeg 的机制,然后检查相关文件夹,并检查 ffmpeg 上的 +x 执行权限。
【解决方案2】:

试试这个:-

ffmpeg_cmd = "/opt/ffmpeglib/ffmpeg -f concat -safe 0 -protocol_whitelist file,http,https,tcp,tls -i /tmp/audio_list.txt -c copy /tmp/output.mp4"

command1 = shlex.split(ffmpeg_cmd)

p1 = subprocess.run(command1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

【讨论】:

    猜你喜欢
    • 2019-05-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2022-06-14
    相关资源
    最近更新 更多