当前位置: 首页 > news >正文

在AWS Lambda上部署EC2编译的FFmpeg工具——自定义层的方案

大纲

  • 1 确定Lambda运行时环境
    • 1.1 Lambda系统、镜像、内核版本
    • 1.2 运行时
      • 1.2.1 Python
      • 1.2.2 Java
  • 2 环境准备
    • 2.1 创建EC2实例
  • 3 编译FFmpeg
    • 3.1 连接EC2
  • 4 编译
  • 5 上传S3存储桶
    • 5.1 创建S3桶
    • 5.2 创建IAM策略
    • 5.3 创建IAM角色
    • 5.4 EC2关联角色
    • 5.5 修改桶策略
    • 5.6 打包并上传
  • 6 创建Lambda的Layer
  • 7 测试
    • 7.1 创建Lambda函数
    • 7.2 附加FFmpeg层
    • 7.3 添加测试代码
    • 7.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 环境准备

2.1 创建EC2实例

选择与Lambda系统匹配的的AMI。架构我们选择比较常见的x86。
在这里插入图片描述
使用最低配置的EC2的实例,并创建密钥对。
在这里插入图片描述

3 编译FFmpeg

3.1 连接EC2

我们直接在Web端连接EC2就行了。
在这里插入图片描述

4 编译

编译时间有点长,需要耐心等待下

sudo yum install -y autoconf automake bzip2 bzip2-devel cmake freetype-devel gcc gcc-c++ git libtool make pkgconfig zlib-devel
mkdir ~/ffmpeg_sourcescd ~/ffmpeg_sources
curl -O -L https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.bz2
tar xjvf nasm-2.15.05.tar.bz2
cd nasm-2.15.05
./autogen.sh
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make
make installcd ~/ffmpeg_sources
git clone --depth 1 https://github.com/mstorsjo/fdk-aac
cd fdk-aac
autoreconf -fiv
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make
make installcd ~/ffmpeg_sources
curl -O -L https://downloads.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz
tar xzvf lame-3.100.tar.gz
cd lame-3.100
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --disable-shared --enable-nasm
make
make installcd ~/ffmpeg_sources
curl -O -L https://archive.mozilla.org/pub/opus/opus-1.3.1.tar.gz
tar xzvf opus-1.3.1.tar.gz
cd opus-1.3.1
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make
make installcd ~/ffmpeg_sources
curl -O -L https://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar xzvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make
make installcd ~/ffmpeg_sources
git clone --depth 1 https://chromium.googlesource.com/webm/libvpx.git
cd libvpx
./configure --prefix="$HOME/ffmpeg_build" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm
make
make installcd ~/ffmpeg_sources
git clone --branch stable --depth 1 https://code.videolan.org/videolan/x264.git
cd x264
PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static
make
make installcd ~/ffmpeg_sources
git clone --branch stable --depth 2 https://bitbucket.org/multicoreware/x265_git
cd ~/ffmpeg_sources/x265_git/build/linux
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED:bool=off ../../source
make
make installcd ~/ffmpeg_sources
curl -O -L https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2
tar xjvf ffmpeg-snapshot.tar.bz2
cd ffmpeg
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \--prefix="$HOME/ffmpeg_build" \--pkg-config-flags="--static" \--extra-cflags="-I$HOME/ffmpeg_build/include" \--extra-ldflags="-L$HOME/ffmpeg_build/lib" \--extra-libs=-lpthread \--extra-libs=-lm \--bindir="$HOME/bin" \--enable-gpl \--enable-libfdk_aac \--enable-libfreetype \--enable-libmp3lame \--enable-libopus \--enable-libvpx \--enable-libx264 \--enable-libx265 \--enable-nonfree
make
make install

5 上传S3存储桶

5.1 创建S3桶

在上述EC2所在的区域中创建一个存储桶。同时记录桶的ARN:arn:aws:s3:::lambda-layers-from-ec2。
在这里插入图片描述

5.2 创建IAM策略

使用下面的代码在IAM中创建一个名为ffmpeg-builder-policy的策略。该策略赋予策略拥有者可以对上述创建的S3桶(arn:aws:s3:::lambda-layers-from-ec2)进行任何操作。(实际这步可以将权限设置的粒度更细,更加严格)

{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": "s3:*","Resource": ["arn:aws:s3:::lambda-layers-from-ec2","arn:aws:s3:::lambda-layers-from-ec2/*"]}]
}

5.3 创建IAM角色

在IAM中创建名为ffmpeg-builder-role的角色,并关联到上一步创建的策略。
在这里插入图片描述
在这里插入图片描述

5.4 EC2关联角色

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

5.5 修改桶策略

下面的策略设置,让桶可以被上述创建的角色访问。
在这里插入图片描述

{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": {"AWS": "arn:aws:iam::【AccountID】:role/lambda-ffmpeg-role"},"Action": "s3:*","Resource": ["arn:aws:s3:::lambda-layers-from-ec2","arn:aws:s3:::lambda-layers-from-ec2/*"]}]
}

5.6 打包并上传

在EC2中执行下面指令,将编译完的FFmpeg上传到之前创建的S3桶中。

zip -j ffmpeg.zip ~/bin/ffmpeg
aws s3 cp ffmpeg.zip --region us-east-1 s3://lambda-layers-from-ec2/

6 创建Lambda的Layer

我们使用上一步上传到S3桶中的地址提交层的内容。
在这里插入图片描述

同时要选择好与上步构建的FFmpeg相同架构的“x86_64”。由于从Python3.6到Python3.9都支持x86_64架构,所以这个层可以给这些版本的Python使用。
最后注意下,在License处填写http://www.ffmpeg.org/legal.html,以确保许可。
在这里插入图片描述

7 测试

7.1 创建Lambda函数

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

7.2 附加FFmpeg层

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

7.3 添加测试代码

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

import subprocess
import shlexdef lambda_handler(event, context):if not event:return {'statusCode': 400,'body': json.dumps('event error')}ffmpeg_cmd = "/opt/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')}

7.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://trac.ffmpeg.org/wiki/CompilationGuide/Centos
  • https://blog.csdn.net/wujiesunlirong/article/details/126424832

相关文章:

  • 最新水果软件FL Studio21.2.0永久激活注册码
  • ubuntu 20.04 server 安装 zabbix
  • Redis集群:Sentinel哨兵模式(图文详解)
  • 02 硬件知识入门(电容)
  • 3分钟在CentOS 7上离线安装Docker
  • Flink之复杂事件处理CEP
  • VSC改造MD编辑器及图床方案分享
  • [UGUI]实现从一个道具栏拖拽一个UI道具到另一个道具栏
  • vue 全局封装文件下载及导入
  • Hadoop学习笔记(HDP)-Part.13 安装Ranger
  • 【开源】基于Vue+SpringBoot的数据可视化的智慧河南大屏
  • less 笔记
  • 线程池,及7大参数,4大拒绝策略详解
  • 实施工程师运维工程师面试题
  • QT 中 QProgressDialog 进度条窗口 备查
  • Django 博客开发教程 16 - 统计文章阅读量
  • express如何解决request entity too large问题
  • If…else
  • js学习笔记
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • PHP的类修饰符与访问修饰符
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • vue总结
  • ------- 计算机网络基础
  • 双管齐下,VMware的容器新战略
  • const的用法,特别是用在函数前面与后面的区别
  • Java数据解析之JSON
  • ​Java并发新构件之Exchanger
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #微信小程序:微信小程序常见的配置传值
  • (1)虚拟机的安装与使用,linux系统安装
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (pojstep1.3.1)1017(构造法模拟)
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (力扣)循环队列的实现与详解(C语言)
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (一)RocketMQ初步认识
  • (转)Sql Server 保留几位小数的两种做法
  • ***监测系统的构建(chkrootkit )
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET6 命令行启动及发布单个Exe文件
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • @ConfigurationProperties注解对数据的自动封装
  • @EnableConfigurationProperties注解使用
  • []指针
  • [AIGC] Redis基础命令集详细介绍
  • [Android 数据通信] android cmwap接入点
  • [Android]Tool-Systrace
  • [cogs2652]秘术「天文密葬法」
  • [CSDN首发]鱿鱼游戏的具体玩法详细介绍
  • [git] windows系统安装git教程和配置
  • [INSTALL_FAILED_TEST_ONLY],Android开发出现应用未安装