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

大纲

  • [1 确定Lambda运行时环境](#1 确定Lambda运行时环境)
    • [1.1 Lambda系统、镜像、内核版本](#1.1 Lambda系统、镜像、内核版本)
    • [1.2 运行时](#1.2 运行时)
      • [1.2.1 Python](#1.2.1 Python)
      • [1.2.2 Java](#1.2.2 Java)
  • [2 打包FFmpeg](#2 打包FFmpeg)
  • [3 创建Lambda的Layer](#3 创建Lambda的Layer)
  • [4 测试](#4 测试)
    • [4.1 创建Lambda函数](#4.1 创建Lambda函数)
    • [4.2 附加FFmpeg层](#4.2 附加FFmpeg层)
    • [4.3 添加测试代码](#4.3 添加测试代码)
    • [4.4 运行测试](#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位架构。

将对应的包下载下来

bash 复制代码
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(特别需要注意目录层级关系

bash 复制代码
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,以确保许可。

4 测试

4.1 创建Lambda函数

选择适用于上述创建层的运行时环境(Python3.9)和架构(x86_64)

4.2 附加FFmpeg层


4.3 添加测试代码

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

python 复制代码
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 运行测试

可以看到上述部署是成功的。

参考文献

相关推荐
Huy-C3 小时前
云计算案例排错(云上1)
云计算
Ynchen. ~4 小时前
告别 OSS 强制下载!阿里云 OSS 绑定自定义域名实现文件在线预览全记录
阿里云·云计算·oss
Huy-C7 小时前
云计算案例排错(云上2)
云计算
bug总结9 小时前
小程序云函数 vs 传统前后端分离(阿里云)原理解析
阿里云·小程序·云计算
gaize121320 小时前
腾讯小龙虾使用指南
云计算·腾讯云·小龙虾
Echo-J1 天前
KVM-VMI项目编译安装全过程,包含所遇问题及解决措施
安全·网络安全·云计算·系统安全
新缸中之脑1 天前
AntSpace:Anthropic的秘密PaaS
云原生·云计算·paas
Yokon_D1 天前
腾讯云+Astrbot个人AI部署,接入QQ机器人
云计算·腾讯云
火山上的企鹅1 天前
QGC二次开发本地媒体浏览实战(二)FFmpeg最小系统实战
qt·ffmpeg·媒体·qgc
TG_yunshuguoji1 天前
腾讯云代理商:快速解锁飞书机器人文档操控术 免审核权限配置指南
云计算·飞书·腾讯云