AWS Lambda 上で FFmpeg でエンコードしようとしてはまりました。
Lambda上で不可解な動きが起きると、調査が非常に困難ですね。
環境
- AWS Lambda (Python3.6)
- FFmpeg4.1
問題と調査、対策
Windows環境、Linux環境、どちらでも正常に動作するエンコードスクリプトなのですが、Lambdaで実行するとAACのデコードで失敗してしまいます。
コーデックかFFmpegのバージョンの問題かといろいろ探ったのですが、バージョンを3系にしても、AACのコーデックを変えても問題が出てしまいました。
いろいろ試した結果、Pythonからsubprocessを使ってLambda上でFFmpegを実行するときは、標準入力をDEVNULLでつぶさないと、親プロセスのハンドルを引き継いでしまい、問題が起こるということの様です。
対策としては、こんな感じでsubprocess.run
実行時のstdin
に設定するだけです。
import subprocess
cmd = ['ffmpeg', '-i', 'input.mp4', '-t', '30', '-b:a', '128k', 'output.mp4']
subprocess.run(cmd, stdin=subprocess.DEVNULL)
類似ケースがありました
Stack Overflow の投稿にまさに今回のケースがありました。
この投稿にも紹介されている動画、[AWS re:Invent 2017: Building a Serverless Pipeline to Transcode a Two-Hour Video in (SRV314)]
(https://www.youtube.com/watch?v=lleCVR2Mupw)の16分くらいのところで説明されていました。