我正在尝试在AWS Lambda上运行一个使用ffmpeg的Node.js脚本。为此,我需要在机器上安装ffmpeg。
我查看了文档,但是没有找到如何连接到运行Lambda的机器的方法。
我查看了文档,但是没有找到如何连接到运行Lambda的机器的方法。
在Python中,我用以下方法解决了这个问题:
tar -zxvf ffmpeg-release-amd64-static.tar.xz
解压缩。ffmpeg
(和可选的ffprobe
)文件。cd
进入此文件夹并使用zip -r -X "../archive.zip" *
进行压缩。像这样设置FFmpeg的正确文件路径:
FFMPEG_STATIC = "/var/task/ffmpeg"
import subprocess
subprocess.call([FFMPEG_STATIC, '-i', input_file, output_file])
要在AWS Lambda中尽快使用ffmpeg,只需使用预构建的lambda层即可,该层可以在以下位置找到:https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:145266761615:applications~ffmpeg-lambda-layer
只需部署此层,然后将其附加到您的函数上。 要调用ffmpeg,只需在lambda函数中使用“/opt/bin/ffmpeg”路径。
该层在Git中进行维护: https://github.com/serverlesspub/ffmpeg-aws-lambda-layer
aws-lambda
的预编译版本ffmpeg
,链接在这里:https://johnvansickle.com/ffmpeg/。(我选择了x86_64
版本。)ffmpeg
和可能需要的ffprobe
设置正确的+x
权限。which ffmpeg
返回 null(表示它找不到我的可执行文件)。 - rodrigo-silveira我想在我的Lambda函数中使用FFmpeg,但是当我将其作为Lambda Layer包含或将其包含在源代码包中时,Lambda函数的允许最大大小已经超过了。
使用Docker和Lambda可能是绕过大小限制的好方法,但我的工作流需要重构,所以我决定通过压缩静态amd64 ffmpeg二进制文件并将其放入我的Lambda函数可以访问的存储桶中来实现解决方案。
该函数将从S3中获取zip文件,并将其解压缩到Lambda的/tmp
目录中,然后可以通过subprocess.check_output()
进行调用。
我将
ffmpeg
二进制文件压缩在bin/ffmpeg
中以供该软件包使用。 你不需要压缩它,只需将二进制文件放在S3上即可。Lambda (/tmp)的存储空间可以在512MB和10,240 MB之间配置。
import logging
from io import BytesIO
from pathlib import Path
from tempfile import TemporaryDirectory
from zipfile import ZipFile
import boto3
from botocore.exceptions import ClientError
from zappa.asynchronous import task
logger = logging.getLogger(__name__)
S3_CLIENT = boto3.client("s3")
def prepare_ffmpeg(bucket: str, key: str) -> Path:
ffmpeg_binary_path = Path("/tmp/ffmpeg")
with BytesIO() as bytesbuffer:
logger.info(f"Downloading package s3://{bucket}/{key} ...")
try:
S3_CLIENT.download_fileobj(bucket, key, bytesbuffer)
except ClientError as e:
logger.exception(e)
logger.error(f"Downloading package s3://{bucket}/{key} ... ERROR")
else:
logger.info(f"Downloading package s3://{bucket}/{key} ... COMPLETE")
logger.info(f"Unzipping 'bin/ffmpeg' from {key} to {ffmpeg_binary_path} ...")
bytesbuffer.seek(0)
z = ZipFile(bytesbuffer)
with ffmpeg_binary_path.open("wb") as fileout:
ffmpeg_content = z.read("bin/ffmpeg")
fileout.write(ffmpeg_content)
ffmpeg_binary_path.chmod(0o777)
logger.info(f"Unzipping 'bin/ffmpeg' from {key} to {ffmpeg_binary_path} ... COMPLETE")
assert ffmpeg_binary_path.exists()
return ffmpeg_binary_path
# Use an official Node.js runtime as a parent image
FROM amazon/aws-lambda-nodejs
# ENV DEBUG="puppeteer:*"
# Copy the FFmpeg binary to /usr/bin
COPY ffmpeg /usr/bin
# Copy package.json and package-lock.json (if available)
COPY package*.json ./
# Install dependencies
RUN npm install
# Copy the rest of your application code
COPY index.js ./
COPY *.service.js ./
# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "index.handler" ]