GPU-beschleunigte Videotranscodierung mit FFmpeg in Cloud Run-Jobs

In dieser Anleitung wird beschrieben, wie Sie Offlinevideos mit niedriger Priorität mithilfe von Cloud Run-Jobs transcodieren.

Antrag vorbereiten

So rufen Sie das gewünschte Codebeispiel ab:

  1. Klonen Sie das Beispiel-Repository auf Ihren lokalen Computer:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
    
  2. Wechseln Sie in das Verzeichnis, das den Cloud Run-Beispielcode enthält:

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

Cloud Storage-Buckets erstellen

Erstellen Sie die folgenden zwei Cloud Storage-Buckets, um die Videos für die Verarbeitung zu speichern und die Ergebnisse der Codierung zu speichern:

  1. Erstellen Sie einen Bucket, um Videos vor der Verarbeitung zu speichern:

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

    Ersetzen Sie Folgendes:

    • PROJECT_ID: Ihre Projekt-ID.
    • LOCATION: Der Cloud Storage-Speicherort.
  2. Gewähren Sie dem Dienstkonto Zugriff zum Lesen aus diesem Bucket:

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

    Ersetzen Sie PROJECT_ID durch Ihre Projekt-ID.

  3. Erstellen Sie einen Bucket, um transcodierte Videos nach der Verarbeitung zu speichern:

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

    Ersetzen Sie Folgendes:

    • PROJECT_ID: Ihre Projekt-ID.
    • LOCATION: Der Cloud Storage-Speicherort.
  4. Gewähren Sie dem Dienstkonto Zugriff zum Lesen von und Schreiben in diesen Bucket:

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

    Ersetzen Sie PROJECT_ID durch Ihre Projekt-ID.

Cloud Run-Job bereitstellen

Erstellen Sie einen Cloud Run-Job mit dem Dockerfile im Beispiel-Repository und hängen Sie die erstellten Buckets ein:

  1. Navigieren Sie zum Beispielverzeichnis:

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

  1. Erstellen Sie eine Artifact Registry, falls die Standard-Cloud Run-Registry noch nicht vorhanden ist:

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

    Ersetzen Sie LOCATION durch den Namen des Standorts der Registrierung.

  2. Erstellen Sie das Container-Image:

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

    Ersetzen Sie Folgendes:

    • PROJECT_ID: Ihre Projekt-ID.
    • LOCATION:Name des Standorts der Registrierung.
    • IMAGE_NAME: Name für das Container-Image, z. B. ffmpeg-image.

    Cloud Run verwendet einen größeren Maschinentyp, um die Build-Zeit zu verkürzen.

  3. Stellen Sie den Job bereit:

    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
    

    Ersetzen Sie Folgendes:

    • PROJECT_ID: Ihre Projekt-ID.
    • REGION: Name der Region Hinweis: Dies muss dieselbe Region sein, für die Sie ein GPU-Kontingent haben.
    • IMAGE_NAME: Name für das Container-Image, z. B. ffmpeg-image.

    Wenn Sie zum ersten Mal aus dem Quellcode in diesem Projekt bereitstellen, werden Sie von Cloud Run aufgefordert, ein Standard-Artifact Registry-Repository zu erstellen.

Job ausführen

So führen Sie den Job aus:

  1. Laden Sie ein Beispielvideo hoch, das codiert werden soll:

    gcloud storage cp gs://cloud-samples-data/video/cat.mp4 gs://preprocessing-PROJECT_ID
    
  2. Führen Sie den Job aus:

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

    Für die Datei entrypoint.sh sind eine Eingabedatei, eine Ausgabedatei und alle Argumente erforderlich, die an FFmpeg gesendet werden sollen.

  3. Prüfen Sie die Cloud Run-Logs, um zu sehen, ob das Video transcodiert wurde:

    gcloud run jobs logs read video-encoding-job --region REGION
    
  4. Transcodiertes Video herunterladen:

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