Cloud Run ジョブでの FFmpeg を使用した GPU アクセラレーションによる動画のコード変換

このチュートリアルでは、Cloud Run ジョブを使用して低優先度のオフライン動画をトランスコードする方法について説明します。

登録申請の準備

使用するコードサンプルを取得するには:

  1. ローカルマシンにサンプル リポジトリのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
    
  2. Cloud Run のサンプルコードが含まれているディレクトリに移動します。

    cd cloud-run-samples/jobs-video-encoding
    

Cloud Storage バケットを作成する

処理する動画を保存し、エンコードの結果を保存するには、次の 2 つの Cloud Storage バケットを作成します。

  1. 処理前に動画を保存するバケットを作成します。

    gcloud storage buckets create gs://preprocessing-PROJECT_ID \
      --location LOCATION
    

    次のように置き換えます。

    • PROJECT_ID: プロジェクト ID。
    • LOCATION: Cloud Storage のロケーション。
  2. このバケットから読み取るアクセス権をサービス アカウントに付与します。

    gcloud storage buckets add-iam-policy-binding gs://preprocessing-PROJECT_ID \
      --member="serviceAccount:video-encoding@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/storage.objectViewer"
    

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

  3. 処理後にトランスコードされた動画を保存するバケットを作成します。

    gcloud storage buckets create gs://transcoded-PROJECT_ID \
      --location LOCATION
    

    次のように置き換えます。

    • PROJECT_ID: プロジェクト ID。
    • LOCATION: Cloud Storage のロケーション。
  4. このバケットに対する読み取りと書き込みを行う権限をサービス アカウントに付与します。

    gcloud storage buckets add-iam-policy-binding gs://transcoded-PROJECT_ID \
      --member="serviceAccount:video-encoding@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/storage.objectAdmin"
    

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

Cloud Run ジョブをデプロイする

サンプル リポジトリの Dockerfile を使用して Cloud Run ジョブを作成し、作成したバケットをマウントします。

  1. サンプル ディレクトリに移動します。

    cd cloud-run-samples/jobs-video-encoding
    

  1. デフォルトの Cloud Run レジストリがまだ存在しない場合は、Artifact Registry を作成します。

    gcloud artifacts repositories create cloud-run-source-deploy \
      --repository-format=docker \
      --location LOCATION
    

    LOCATION は、レジストリのロケーションの名前に置き換えます。

  2. コンテナ イメージをビルドします。

    gcloud builds submit \
      --tag LOCATION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/IMAGE_NAME \
      --machine-type E2-HIGHCPU-32
    

    次のように置き換えます。

    • PROJECT_ID: プロジェクト ID。
    • LOCATION:レジストリのロケーションの名前。
    • IMAGE_NAME: コンテナ イメージの名前(例: ffmpeg-image)。

    Cloud Run は、より大きなマシンタイプを使用してビルド時間を短縮します。

  3. ジョブをデプロイします。

    gcloud beta run jobs create video-encoding-job \
        --image LOCATION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/IMAGE_NAME \
        --region REGION \
        --memory 32Gi \
        --cpu 8 \
        --gpu 1 \
        --gpu-type nvidia-l4 \
        --no-gpu-zonal-redundancy \
        --max-retries 1 \
        --service-account video-encoding@PROJECT_ID.iam.gserviceaccount.com \
        --add-volume=name=input-volume,type=cloud-storage,bucket=preprocessing-PROJECT_ID,readonly=true \
        --add-volume-mount=volume=input-volume,mount-path=/inputs \
        --add-volume=name=output-volume,type=cloud-storage,bucket=transcoded-PROJECT_ID \
        --add-volume-mount=volume=output-volume,mount-path=/outputs
    

    次のように置き換えます。

    • PROJECT_ID: プロジェクト ID。
    • REGION: リージョンの名前。注: これは、GPU 割り当てがあるリージョンと同じリージョンにする必要があります。
    • IMAGE_NAME: コンテナ イメージの名前(例: ffmpeg-image)。

    このプロジェクトでソースから初めてデプロイする場合は、デフォルトの Artifact Registry リポジトリを作成するよう Cloud Run からメッセージが表示されます。

ジョブを実行する

ジョブを実行する手順は次のとおりです。

  1. エンコードするサンプル動画をアップロードします。

    gcloud storage cp gs://cloud-samples-data/video/cat.mp4 gs://preprocessing-PROJECT_ID
    
  2. ジョブを実行します。

    gcloud run jobs execute video-encoding-job  \
        --region REGION \
        --wait \
        --args="cat.mp4,encoded_cat.mp4,-vcodec,h264_nvenc,-cq,21,-movflags,+faststart"
    

    entrypoint.sh ファイルには、入力ファイル、出力ファイル、FFmpeg に送信する引数が必要です。

  3. Cloud Run のログを確認して、動画がトランスコードされていることを確認します。

    gcloud run jobs logs read video-encoding-job --region REGION
    
  4. トランスコードされた動画をダウンロードします。

    gcloud storage cp gs://transcoded-PROJECT_ID/encoded_cat.mp4 .