Google Cloud Storage にmp4ファイルがアップロードされたら Cloud Functions でHLS形式に変換する
指定 bucket の google.storage.object.finalize
をトリガにしてmp4ファイルをHLS形式に変換するサンプルです。
このサンプルでは bucket の /mp4
ディレクトリにmp4ファイルが何処からかアップロードされた時に /hls
以下にmp4ファイル単位のディレクトリを作りつつHLS形式ファイル一式を保存しています。
ただし、実運用ではmp4用とHLS用の bucket を分けた方が良いと思います。理由等は後述します。
package.json
yarn.lock
もコミットに含めておくと良さそうです。
https://cloud.google.com/functions/docs/writing/specifying-dependencies-nodejs
Node.js 8 以降のランタイムでは、yarn.lock ファイルが存在する場合は、Cloud Functions では代わりに yarn install コマンドが使用されます。
index.js
次のコマンドでデプロイできます。 YOUR_TRIGGER_BUCKET_NAME
は置換して下さい。
gcloud functions deploy mp4ToHls --region asia-northeast1 --runtime nodejs10 --trigger-resource YOUR_TRIGGER_BUCKET_NAME --trigger-event google.storage.object.finalize
作成されたファイル一式は次のコマンドで手元にDLできます。
gsutil -m cp -R gs://YOUR_TRIGGER_BUCKET_NAME/hls ./dest
macのSafari等で再生確認もできました。アクセス制限を要する場合は署名付きURLを介することになるんだろうと思います。
https://cloud.google.com/storage/docs/gsutil/commands/signurl
欠点
このサンプルでは同一 bucket へHLS形式ファイル一式をアップロードしているので、それらのタイミングでも google.storage.object.finalize
がトリガされてしまいます。ですので、冒頭で述べたように bucket を分けた方が良さそうです。
アップロード先の bucket 名に環境変数を用いれば staging/production 等の切り分けもできそうです。
https://cloud.google.com/functions/docs/env-var
今回使用したサンプルは以下に保存してあります。