在AWS Lambda上部署标准FFmpeg工具——自定义层的方案

大纲

  • 1 确定Lambda运行时环境
    • 1.1 Lambda系统、镜像、内核版本
    • 1.2 运行时
      • 1.2.1 Python
      • 1.2.2 Java
  • 2 打包FFmpeg
  • 3 创建Lambda的Layer
  • 4 测试
    • 4.1 创建Lambda函数
    • 4.2 附加FFmpeg层
    • 4.3 添加测试代码
    • 4.4 运行测试
  • 参考文献

FFmpeg被广泛应用于音/视频流处理领域。对于简单的需求,我们可以直接运行FFmpeg二进制程序命令就可以完成。但是对于定制性的功能,则需要熟悉系统的代码设计框架,进行二次开发。文本讨论的是在AWS无服务架构的Lambda上,如何通过自定义层部署FFmpeg二进制程序。

1 确定Lambda运行时环境

Lambda运行时决定了其运行的CPU架构、操作系统和辅助软件。不同语言的运行时环境不同,相同语言的不同版本的运行时不同,所以这步的确认非常重要,否则会造成FFmpeg与Lambda不兼容的问题。下面是从AWS官方摘录了运行时信息,仅供参考。

1.1 Lambda系统、镜像、内核版本

系统 镜像 Linux 内核
Amazon Linux 镜像 – amzn-ami-hvm-2018.03.0.20181129-x86_64-gp2 4.14
Amazon Linux 2 自定义 4.14

1.2 运行时

1.2.1 Python

Python 运行时 标识符 AWS Python的软件工具包 操作系统 架构
Python 3.9 python3.9 boto3-1.20.32 botocore-1.23.32 Amazon Linux 2 x86_64,arm64
Python 3.8 python3.8 boto3-1.20.32 botocore-1.23.32 Amazon Linux 2 x86_64,arm64
Python 3.7 python3.7 boto3-1.20.32 botocore-1.23.32 Amazon Linux x86_64
Python 3.6 python3.6 boto3-1.20.32 botocore-1.23.32 Amazon Linux x86_64

1.2.2 Java

Java 运行时 标识符 JDK 作系统 架构
Java 11 java11 amazon-corretto-11 Amazon Linux 2 x86_64,arm64
Java 8 java8.al2 amazon-corretto-11 Amazon Linux 2 x86_64,arm64
Java 8 java8 amazon-corretto-11 Amazon Linux x86_64

本例使用Python3.9版本,其操作系统是Amazon Linux 2,Linux内核是“4.14”,架构是“x86_64,arm64”。在这两种CPU架构中,我们选择适用面更广的x86_64。如果选择arm64,后续FFmpeg选择,以及Lambda函数运行时也要做出相应调整。

2 打包FFmpeg

在FFmpeg官网的下载页面,可以找到“Linux Static Builds”。这个链接下的编译结果支持Linux内核3.2.0版本以上的系统,我们只要选择相应的架构就行了。
在上一步中,我们选择了x86_64,对应的是amd64的FFmpeg。至于为什么是这样的对应关系,可以参见维基百科的内容。总体来说,就是一个是AMD取得名字,一个是Intel取得名字。

x86-64(又称x64,即英文词64-bit extended,64位拓展的简写)是一个处理器的指令集架构,基于x86架构的64位拓展,向后兼容于16位及32位的x86架构。x64于1999年由AMD设计,AMD首次公开64位集以扩展给x86,称为“AMD64”。其后也为英特尔所采用,现时英特尔称之为“Intel 64”,在之前曾使用过“Clackamas Technology” (CT)、“IA-32e”及“EM64T”。
苹果公司和RPM包管理员以“x86-64”或“x86_64”称呼此64位架构。甲骨文公司及Microsoft称之为“x64”。BSD家族及其他Linux发行版则使用“amd64”,32位版本则称为“i386”(或 i486/586/686),Arch Linux及其派生发行版用x86_64称呼此64位架构。

将对应的包下载下来

wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz.md5
md5sum -c ffmpeg-release-amd64-static.tar.xz.md5
tar xvf ffmpeg-release-amd64-static.tar.xz

打包成AWS Lambda的层可以接受的包格式zip(特别需要注意目录层级关系

mkdir -p ffmpeg/bin
cp ffmpeg-4.3.1-amd64-static/ffmpeg ffmpeg/bin/
cd ffmpeg
zip -r ../ffmpeg.zip .

3 创建Lambda的Layer

由于FFmpeg的包不是很大,我们可以直接通过本地文件上传的方式提交层的内容。
同时要选择好与上步下载的FFmpeg相同架构的“x86_64”。由于从Python3.6到Python3.9都支持x86_64架构,所以这个层可以给这些版本的Python使用。
最后注意下,在License处填写http://www.ffmpeg.org/legal.html,以确保许可。
在AWS Lambda上部署标准FFmpeg工具——自定义层的方案_第1张图片

4 测试

4.1 创建Lambda函数

选择适用于上述创建层的运行时环境(Python3.9)和架构(x86_64)
在AWS Lambda上部署标准FFmpeg工具——自定义层的方案_第2张图片

4.2 附加FFmpeg层

在AWS Lambda上部署标准FFmpeg工具——自定义层的方案_第3张图片
在AWS Lambda上部署标准FFmpeg工具——自定义层的方案_第4张图片

4.3 添加测试代码

下面的代码通过查询FFmpeg版本号,以测试上述部署的可行性。

import subprocess
import shlex

def lambda_handler(event, context):
    if not event:
        return {
            'statusCode': 400,
            'body': json.dumps('event error')
        }
        
    ffmpeg_cmd = "/opt/bin/ffmpeg -version"
    command = shlex.split(ffmpeg_cmd)
    p = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    return {
        'statusCode': 200,
        'body': str(p.stdout, encoding='utf-8')
    }

4.4 运行测试

在AWS Lambda上部署标准FFmpeg工具——自定义层的方案_第5张图片
可以看到上述部署是成功的。

参考文献

  • https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/lambda-runtimes.html
  • https://aws.amazon.com/cn/blogs/media/processing-user-generated-content-using-aws-lambda-and-ffmpeg/
  • https://blog.csdn.net/wujiesunlirong/article/details/126424832

你可能感兴趣的:(aws,aws,ffmpeg,云计算)