Transcodifica video accelerata dalla GPU con FFmpeg nei job Cloud Run

Questo tutorial descrive come transcodificare video offline a bassa priorità utilizzando i job Cloud Run.

Preparare la richiesta

Per recuperare l'esempio di codice da utilizzare:

  1. Clona il repository di esempio sulla tua macchina locale:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
    
  2. Passa alla directory che contiene il codice campione di Cloud Run:

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

Creazione di bucket di Cloud Storage

Per archiviare i video da elaborare e salvare i risultati della codifica, crea i seguenti due bucket Cloud Storage:

  1. Crea un bucket per archiviare i video prima dell'elaborazione:

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

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto.
    • LOCATION: la posizione di Cloud Storage.
  2. Concedi al account di servizio l'accesso in lettura a questo 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"
    

    Sostituisci PROJECT_ID con l'ID progetto.

  3. Crea un bucket per archiviare i video transcodificati dopo l'elaborazione:

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

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto.
    • LOCATION: la posizione di Cloud Storage.
  4. Concedi all'account di servizio l'accesso in lettura e scrittura a questo 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"
    

    Sostituisci PROJECT_ID con l'ID progetto.

Esegui il deployment di un job Cloud Run

Crea un job Cloud Run utilizzando il Dockerfile nel repository di esempio e montando i bucket che hai creato:

  1. Passa alla directory di esempio:

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

  1. Crea un Artifact Registry se il registro Cloud Run predefinito non esiste già:

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

    Sostituisci LOCATION con il nome della posizione del registro.

  2. Crea l'immagine container:

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

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto.
    • LOCATION:il nome della posizione del registro.
    • IMAGE_NAME: il nome dell'immagine container, ad esempio ffmpeg-image.

    Cloud Run utilizza un tipo di macchina più grande per ridurre il tempo di compilazione.

  3. Esegui il deployment del job:

    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
    

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto.
    • REGION: il nome della regione Nota: deve essere la stessa regione per cui hai una quota di GPU.
    • IMAGE_NAME: il nome dell'immagine container, ad esempio ffmpeg-image.

    Se è la prima volta che esegui il deployment dal codice sorgente in questo progetto, Cloud Run ti chiede di creare un repository Artifact Registry predefinito.

Esegui il job

Per eseguire il job:

  1. Carica un video di esempio da codificare:

    gcloud storage cp gs://cloud-samples-data/video/cat.mp4 gs://preprocessing-PROJECT_ID
    
  2. Esegui il job:

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

    Il file entrypoint.sh richiede un file di input, un file di output e tutti gli argomenti da inviare a FFmpeg.

  3. Esamina i log di Cloud Run per assicurarti che il video sia stato transcodificato:

    gcloud run jobs logs read video-encoding-job --region REGION
    
  4. Scarica il video transcodificato:

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