大纲

  • 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-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 环境准备

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

作者

Jie Wu

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

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

    大纲 1 确定Lambda运行时环境 1.1 Lambda系统.镜像.内核版本 1.2 运行时 1.2.1 Python 1.2.2 Java 2 打包FFmpeg 3 创建Lambda的Layer ...

  2. 在AWS Lambda上部署标准FFmpeg工具——Docker方案

    大纲 1 确定Lambda运行时环境 1.1 Lambda系统.镜像.内核版本 1.2 运行时 1.2.1 Python 1.2.2 Java 2 启动EC2 3 编写调用FFmpeg的代码 4 生成 ...

  3. 在AWS Lambda上运行脚本语言:PHP、Ruby和Go(外文翻译)

    本文来自Mobingi官方技术专栏,欢迎关注 本文翻译自Scripting Languages for AWS Lambda: Running PHP, Ruby, and Go 备注:Go已经在20 ...

  4. aws lambda_在AWS Lambda上运行“ Hello World”

    aws lambda Let's run the "Hello World" example on AWS Lambda. I would recommend reading ab ...

  5. AWS云上部署Hadoop

    目录 一.实验目的 二.实验操作 1.创建EC2实例​编辑 2.使用putty连接实例​编辑 3.新增 Hadoop 用户.安装 Java 环境(master.slave01.slave02都需进行相 ...

  6. aws fargate_我如何在AWS Fargate上部署#100DaysOfCloud Twitter Bot

    aws fargate After passing my last certification, I asked myself how much time I spent studying cloud ...

  7. OnlyOffice验证(二)在Centos7上部署OnlyOffice编译结果

    在Centos7上部署OnlyOffice编译结果   此处将尝试将OnlyOffice验证(一)DocumentServer编译验证的结果部署到Centos7上.并且使用其它服务器现有的Rabbit ...

  8. aws lambda_在AWS Lambda上进行无服务器我的线性回归api

    aws lambda About a year ago, I had a fun idea for a small side project. I wanted to build an API to ...

  9. 在windows 10 上用ninja编译gn构建工具时编译器遇到C4819

    问题发现经过 平台:Windows10 LTSC,VS2017,python3.9 F:\program\git> git clone https://bitbucket.org/chromiu ...

最新文章

  1. Java学习总结:15
  2. 金税接口调用实例 java_Java 常见面试题
  3. Python2 编码问题分析
  4. 关于分布式系统的数据一致性问题(一)
  5. C# 如果何从线程中操作控件
  6. UVa OJ 120
  7. 触漫机器人_触触+机器人=???
  8. 编程语言排行分析,从2009到2019。
  9. 双向重定向指令 tee
  10. pythonz字体颜色以及终端不显示颜色的解决办法
  11. python请编写程序、生成随机密码_python习题:登录注册小程序(用户名密码存在文件中)、生成随机密码小程序...
  12. 『OpenCV3』Harris角点特征_API调用及python手动实现
  13. freemark+html+jbig生成pdf文件
  14. Linux系统在Xshell6布置定时任务
  15. uniapp app端登录
  16. ShareSDK分享 和新浪登陆冲突解决方法
  17. 计算机 系统 声音问题 有回声
  18. 对不起,这5类人都不适合自学编程
  19. MATLAB实现红眼消除(数字图像处理)
  20. HEVC亮度分量帧内预测模式代码详解

热门文章

  1. matlab 梳妆函数,梳状函数.PPT
  2. 在线免费一键将头像转换卡通形象
  3. 程序员如何进行用户界面设计
  4. 彩色图像怎样转灰度图像
  5. Android和蓝牙GPS结合的方法
  6. 浙江大学计算机考研真题及答案,浙江大学计算机考研真题-20210531140358.docx-原创力文档...
  7. 2022年07月数据库排行榜
  8. glove.840B.300d glove词向量词嵌入文件国内服务器下载
  9. 【codeforces 707C】Pythagorean Triples
  10. 微信小程序绘制自定义海报,可带二维码,头像,文字等