ffmpeg + S3, Lambdaを使って特定のS3パケットに動画フアイルを置いたら自動的にサムネイルを作る

参考記事

S3 + ffmpeg

“http://xp-cloud.jp/blog/2018/05/18/3345/”

AWS Lambda を Amazon S3 に使用する

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-s3.html

Node.js の AWS Lambda 関数ハンドラ

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/nodejs-prog-model-handler.html

基本的に必要な物:

ffmpeg, AWS S3バケット, AWS Lambda

FFmpeg 
https://www.ffmpeg.org/

 

index.jsを下のコードを見て書いてください。

 


'use strict';
const fs = require('fs');
var path = require('path');
const aws = require('aws-sdk');
var s3 = new aws.S3();
var util = require('util');
let execSync = require('child_process').execSync;
var i = 1;
const getObject = function(bucket, key, resolve, preserve) {
  let params = {
    Bucket: bucket,
    Key: key
  };
  s3.getObject(params, function(error, data) {

    try {
      if (error) {
        preserve(error);
      } else {
        resolve(data);
      }
    } catch(e) {
      preserve(e);
    }
  });
};

const putObject = function(body, bucket, key, resolve, preserve) {
  let params = {
    Body: body,
    Bucket: bucket,
    Key: key
  };

  s3.putObject(params, function(error, data) {
    try {
      if (error) {
        preserve(error);
      } else {
        resolve(data);
      }
    } catch(e) {
      preserve(e);
    }
  });
};

exports.handler = (event, context, callback) => {
 var srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
 var name =  path.basename(srcKey, path.extname(srcKey));

    try {
          getObject(‘バケット名’, ‘パス'+ name +'.mp4', function(srcData) {
          
          fs.writeFileSync('/tmp/srcData.mp4', srcData.Body);

          process.env.PATH += ':/var/task/bin';

          execSync('ffmpeg -i /tmp/srcData.mp4 -filter:v fps=fps=1:round=down /tmp/%d.jpg');

          var files = fs.readdirSync('/tmp');

          for (var i = 1; i <= files.length - 1; i++) {
            var fileStream = fs.createReadStream('/tmp/'+ i +'.jpg');
            putObject(fileStream, 'バケット名', 'パス'+ name + i +'.jpg', function(data) {
              callback(null, 'OK');
            });
          }
      }
  );
  } catch(e) {
    callback(JSON.stringify(e));
  }
};

 

最初はffmpegとindex.jsを次のように配置します。

├index.js

└bin

  └ffmpeg

 

binとindex.jsを圧縮します。その後ZipをS3にUploadします。

(パスやファイル名に日本語は含めないでください。)

 

 

S3に後で動画を入れるフォルダとでサムネイルを入れるフォルダを別々に用意します。

uploadした後にzipのURLをメモしてください。後で使います。

 

 

次はLambda側でfunctionを作ります。Lambda側で関数の作成を押して関数名とランタイムを決めてください。

私の場合はランタイ項目をNode.js.8.10でやりました。それと実行ロールを決めて下さい。

必ずS3に関するロールをIAM側で設定してください。

 

 

コードエントリタイプを、上のようにしてください。その後に先メモしたS3側ZipのURLを書きます。

基本設定のところも3分に設定します。

最後はS3側、Event制御設定をするだけです.

 

 

S3のプロパティの中にあるEVENTを探します。

簡単な説明をするとプレフィックス側で設定したURLにEventをかける仕組みです。

例えば特定のFolderに動画を置いたら、サムネを自動に作るとかを行うイベントハンドラーです。

設定がおわたら、先ほど作って置いた動画を入れるフォルダに動画を置いてください。

成功したら先ほど作ったサムネイルを入れるフォルダの中に

サムネイルが作られます。