大綱
- 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