Transcodage vidéo accéléré par GPU avec FFmpeg sur les jobs Cloud Run

Ce tutoriel explique comment transcoder des vidéos hors connexion de faible priorité à l'aide de tâches Cloud Run.

Préparer votre demande

Pour récupérer l’exemple de code à utiliser, procédez comme suit :

  1. Clonez le dépôt de l'exemple sur votre ordinateur local :

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
    
  2. Accédez au répertoire contenant l'exemple de code Cloud Run :

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

Créer des buckets Cloud Storage

Pour stocker les vidéos à traiter et enregistrer les résultats de l'encodage, créez les deux buckets Cloud Storage suivants :

  1. Créez un bucket pour stocker les vidéos avant le traitement :

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

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet.
    • LOCATION : emplacement Cloud Storage.
  2. Accordez au compte de service l'accès en lecture à ce 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"
    

    Remplacez PROJECT_ID par l'ID du projet.

  3. Créez un bucket pour stocker les vidéos transcodées après traitement :

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

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet.
    • LOCATION : emplacement Cloud Storage.
  4. Accordez au compte de service l'autorisation de lire et d'écrire dans ce 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"
    

    Remplacez PROJECT_ID par l'ID du projet.

Déployer un job Cloud Run

Créez un job Cloud Run en utilisant le fichier Dockerfile du dépôt d'exemple et en montant les buckets que vous avez créés :

  1. Accédez à l'exemple de répertoire :

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

  1. Créez un Artifact Registry si le registre Cloud Run par défaut n'existe pas encore :

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

    Remplacez LOCATION par le nom de l'emplacement du registre.

  2. Créez l'image du conteneur :

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

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet.
    • LOCATION : nom de l'emplacement du registre.
    • IMAGE_NAME : nom de l'image de conteneur, par exemple ffmpeg-image.

    Cloud Run utilise un type de machine plus grand pour réduire le temps de compilation.

  3. Déployez le 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
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet.
    • REGION : nom de la région. Remarque : Il doit s'agir de la même région pour laquelle vous disposez d'un quota de GPU.
    • IMAGE_NAME : nom de l'image de conteneur, par exemple ffmpeg-image.

    Si c'est la première fois que vous déployez à partir d'une source dans ce projet, Cloud Run vous invite à créer un dépôt Artifact Registry par défaut.

Exécuter le job

Pour exécuter le job, procédez comme suit :

  1. Importez un exemple de vidéo à encoder :

    gcloud storage cp gs://cloud-samples-data/video/cat.mp4 gs://preprocessing-PROJECT_ID
    
  2. Exécutez la tâche :

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

    Le fichier entrypoint.sh nécessite un fichier d'entrée, un fichier de sortie et tous les arguments à envoyer à FFmpeg.

  3. Consultez les journaux Cloud Run pour vous assurer que la vidéo a été transcodée :

    gcloud run jobs logs read video-encoding-job --region REGION
    
  4. Téléchargez la vidéo transcodée :

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