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

news/2024/7/10 20:11:37 标签: aws, 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-gp24.14
Amazon Linux 2自定义4.14

1.2 运行时

1.2.1 Python

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

1.2.2 Java

Java 运行时标识符JDK作系统架构
Java 11java11amazon-corretto-11Amazon Linux 2x86_64,arm64
Java 8java8.al2amazon-corretto-11Amazon Linux 2x86_64,arm64
Java 8java8amazon-corretto-11Amazon Linuxx86_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,以确保许可。
在这里插入图片描述

4 测试

4.1 创建Lambda函数

选择适用于上述创建层的运行时环境(Python3.9)和架构(x86_64)
在这里插入图片描述

4.2 附加FFmpeg层

在这里插入图片描述
在这里插入图片描述

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 运行测试

在这里插入图片描述
可以看到上述部署是成功的。

参考文献

  • 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

http://www.niftyadmin.cn/n/5239289.html

相关文章

项目部署到线上服务器后,报 Redis error: ERR unknown command del 错误

查了很多资料,终于解决了,问题出在redis.conf里,该文件里被添加了新的命令如下: 在这几句命令前加 # 号注释掉,重启即可解决 另附上相关redis的命令: 停止Redis:systemctl stop redis启动Redis…

JSP控制项目启动后默认去访问指定的WebServlet 而不是index.jsp

我的 index.jsp 代码是这样 现在每次启动 访问的都是index.jsp 这也是它的默认配置 我这里写了一个 WebServlet 代码是这样 简单可以理解为 我们定义了WebServlet 访问路径为1cginServlet 其中在request作用域中 定义了一个userName值为 欢迎来到jsp世界 然后 跳转向 page.j…

js 搜索记录

背景: 移动端的搜索记录,不可能通过调取接口来记录瑟,所以通过在某某.js一个文件定义和处理逻辑。 代码: //某某.js var yumingSearch {init: function () {initF7.GloblalF7.onPageInit("yumingSearch", function …

JavaEE之多线程编程(一):基础篇

文章目录 一、关于操作系统一、认识进程 process二、认识线程三、进程和线程的区别(重点!)四、Java的线程和操作系统线程的关系五、第一个多线程编程 一、关于操作系统 【操作系统】 驱动程序: 如:我们知道JDBC的驱动程…

Apollo新版本Beta技术沙龙的参会感受

Apollo新版本Beta技术沙龙的参会感受 Apollo新版本Beta技术沙龙的参会感受摘要 🚗🌐参会流程 🗓️展厅参观/展厅讲解 🏢进入百度Apollo未来驾驶汽车5G云代驾的神奇签到 📝Apollo新版本Beta整体介绍 🚀技术分…

JS加密/解密之HOOK实战

之前的章节有介绍过Javascript的Hook相关的基础知识,相信大部分人也知道了什么是Hook,今天我们来讲一下Hook实战,实际的运用。 0x1.事上练 // 程序员们基本都喜欢简单精辟 直入主题 不喜欢咬文嚼字 我们先直接上代码 var _log console.log…

OpenGL学习(一)绘制一个图形

本文使用Qt进行操作演示。 注意: 坐标原点位于屏幕中心 坐标参数:0.0f - 1.0f 颜色参数:0.0f - 1.0f OpenGL提供了几种用于绘制几何图形的绘制模式。下面是一些常用的绘制模式: 点(GL_POINTS):绘制单个点。 线(GL_LIN…

Vue3的watch函数中,第三个参数配置对象详细分析

在Vue 3的watch函数中,第三个参数是一个配置对象,用于定义如何执行watch函数。下面是几个常用的配置项的讲解,并附上代码示例: 1、immediate immediate:当设置为true时,会在初始渲染时立即执行watch函数。…