LoginSignup
5
4

More than 1 year has passed since last update.

ffmpeg-aws-lambda-layerでffmpegやffprobeを使う

Last updated at Posted at 2020-10-19

はじめに

動画のフォーマットやサイズ変更、サムネイルの生成に便利な ffmpegの実行環境を AWS Lambda関数とレイヤーをつかって構築する手順を記載します。
ここでは、ffmpeg-aws-lambda-layerを使用します。Lambda関数とは別にffmpegやffprobeを含むAWS Lambda レイヤーを作成することで、これらのコマンドがLambda関数実行環境の /opt 以下に呼び出されます。デプロイパッケージにコマンド実行用のバイナリを含めることなくライブラリのように呼び出すことができます。

Amazon Elastic Transcoderを使えば、動画のフォーマットやサイズ変更が簡単にできますが、費用が高いのでマシンパワーを必要とするような変換でなければLambdaで処理したほうが手軽で良いと思います。
以前書いた記事 (スマートホームカメラ ATOM Cam をセットアップ)で使用してるATOM Camの映像をNAS経由でS3に転送しAmazon Elastic Transcoderで動画フォーマットを変換する処理をつくったところ、あっというまに数千円消費してしまいました。こういう用途にはffmpegを使ったほうが良いようです。

このサンプルでできること

ffmpeg-aws-lambda-layer に用意されているサンプルプロジェクトをデプロイすると、S3に ffmpeg-layer-example-uploadbucket-xxxx と ffmpeg-layer-example-resultbucket-xxxx (xxxxはランダムな文字列、以下同様)というバケットが生成され、Lambda関数との接続やIAM roleの設定が自動的に行われます。
ffmpeg-layer-example-uploadbucket-xxxx に動画ファイルがアップロードされると、自動的にffmpeg-layer-example-resultbucket-xxxx にサムネイル画像が生成さます。

図にするとこのようになります。
ffmpeg-aws-lambda-layer.png

準備するもの

- Unix Make environment
- AWS command line utilities (just for deployment)

今回は以下の環境で動作確認しました。

$ sw_vers 
ProductName:	Mac OS X
ProductVersion:	10.15.7
BuildVersion:	19H2
$ aws --version
aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64
  • AWSアカウント
    • Lambda, S3, CloudFormationを操作できるroleが必要です。Administrator権限があれば問題無し。

参考情報

準備

ffmpeg-aws-lambda-layer を git clone

git clone https://github.com/serverlesspub/ffmpeg-aws-lambda-layer.git

テンポラリ S3 バケットの準備

~/.aws/credentials の default profile に指定した region と同じリージョンにバケットを作成します。

サンプルプロジェクトをdeploy

DEPLOYMENT_BUCKET オプションの値に、テンポラリ S3 バケットのバケット名を指定します。

cd ffmpeg-aws-lambda-layer
make deploy-example DEPLOYMENT_BUCKET=<BUCKET NAME>

make コマンドを実行すると以下のようなログが流れます。

cd example && \
		make deploy DEPLOYMENT_BUCKET=<BUCKET NAME> LAYER_STACK_NAME=ffmpeg-lambda-layer
mkdir -p build
aws cloudformation package --template-file template.yaml --output-template-file output.yaml --s3-bucket net.rev-system.nas
Uploading to d5886731828e201e755325e950d28eab  1742 / 1742.0  (100.00%)
Successfully packaged artifacts and wrote output template to file output.yaml.
Execute the following command to deploy the packaged template
aws cloudformation deploy --template-file /tmp/ffmpeg-aws-lambda-layer/example/output.yaml --stack-name <YOUR STACK NAME>
aws cloudformation deploy --template-file output.yaml --stack-name ffmpeg-layer-example --capabilities CAPABILITY_IAM --parameter-overrides LambdaLayer=arn:aws:lambda:ap-northeast-1:************:layer:ffmpeg:1

Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - ffmpeg-layer-example
aws cloudformation describe-stacks --stack-name ffmpeg-layer-example --query Stacks[].Outputs --output table
--------------------------------------------------------------------------------------------
|                                      DescribeStacks                                      |
+-------------------+----------------+-----------------------------------------------------+
|    Description    |   OutputKey    |                     OutputValue                     |
+-------------------+----------------+-----------------------------------------------------+
|  Upload S3 bucket |  UploadBucket  |  ffmpeg-layer-example-uploadbucket-xxxxxxxxxxx      |
|  Results S3 bucket|  ResultsBucket |  ffmpeg-layer-example-resultsbucket-yyyyyyyyyyyy    |
+-------------------+----------------+-----------------------------------------------------+

ここで、以下のリソースが作成されます。

リソース種類 名称例
Lambda関数 ffmpeg-layer-example-ConvertFileFunction-nnnnnnnnnnnn
Lambdaレイヤー ffmpeg
S3 バケット(アップロード用) ffmpeg-layer-example-uploadbucket-xxxxxxxxxxx
S3 バケット(変換済み) ffmpeg-layer-example-resultsbucket-yyyyyyyyyyyy
CloudFrontスタック ffmpeg-layer-example
IAMロール ffmpeg-layer-example-ConvertFileFunctionRole-zzzzzzzzzzzz

アップロード用バケットには、オブジェクトが作成された際にLambdaに通知されるイベント通知が設定されます。
lambda005-2.png

Lambdaファンクションにレイヤーが追加されます。
lambda006-2.png

サムネイルの生成

S3バケット ffmpeg-layer-example-uploadbucket-xxxxxxxxxxx に適当な動画ファイルをアップロードします。
しばらくすると ffmpeg-layer-example-resultsbucket-yyyyyyyyyyyy にサムネイル画像が出力されます。

アップロードバケットに動画ファイルをアップロードしてみます。
lambda003-2.png

すると10秒ほどでサムネイルが生成されました。
lambda004-2.png

アップロードした動画は、ビデオ撮影・空撮・編集 / HYBRID CREATIVE MOVIE サクラのフリー素材 風景・木・風にそよぐ(1)を使用しました。

生成されたサムネイルはこちらです。20KBの小さな画像生成されました。
mov_hts-samp003.jpg

サムネイルのサイズやその他の出力

動画を別フォーマットにしたり、ffprobeで動画ファイルのメタ情報を出力する場合は、ffmpeg-aws-lambda-layer/example/src/index.js を変更して再度デプロイすることで、メタ情報の出力などいろいろ試せます。

Lambdaレイヤーのみ作成する

アップロード/変換済み用S3バケットやLambda関数はデプロイせず、Lambdaレイヤーのみデプロイする場合は以下のコマンドを実行します。
DEPLOYMENT_BUCKET オプションの値に、テンポラリ S3 バケットのバケット名を指定します。

cd ffmpeg-aws-lambda-layer
make deploy DEPLOYMENT_BUCKET=<BUCKET NAME>

Lambdaレイヤーのみデプロイされるので、任意のLambda関数にこのレイヤーを追加することで使用できるようになります。

作成されたリソースの削除

CloudFormationにあるスタックを削除することで、作成されたリソースが削除されます。S3バケットにオブジェクトが残っていると削除時にエラーとなるので事前に削除が必要です。
lambda007-2.png

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4