Transcodificación de vídeo acelerada por GPU con FFmpeg en trabajos de Cloud Run

En este tutorial se describe cómo transcodificar vídeos sin conexión de baja prioridad mediante trabajos de Cloud Run.

Preparar la solicitud

Para obtener el código de muestra que vas a usar, sigue estos pasos:

  1. Clona el repositorio de ejemplo en tu máquina local:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
    
  2. Cambia al directorio que contiene el código de ejemplo de Cloud Run:

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

Crear segmentos de Cloud Storage

Para almacenar los vídeos que se van a procesar y guardar los resultados de la codificación, crea los dos segmentos de Cloud Storage siguientes:

  1. Crea un segmento para almacenar los vídeos antes de procesarlos:

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

    Haz los cambios siguientes:

    • PROJECT_ID: tu ID de proyecto.
    • LOCATION: la ubicación de Cloud Storage.
  2. Concede a la cuenta de servicio acceso de lectura a este segmento:

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

    Sustituye PROJECT_ID por el ID del proyecto.

  3. Crea un segmento para almacenar los vídeos transcodificados después del procesamiento:

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

    Haz los cambios siguientes:

    • PROJECT_ID: tu ID de proyecto.
    • LOCATION: la ubicación de Cloud Storage.
  4. Concede a la cuenta de servicio acceso de lectura y escritura a este segmento:

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

    Sustituye PROJECT_ID por el ID del proyecto.

Desplegar un trabajo de Cloud Run

Crea un trabajo de Cloud Run con el Dockerfile del repositorio de ejemplo y monta los segmentos que has creado:

  1. Accede al directorio de muestra:

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

  1. Crea un registro de Artifact Registry si el registro predeterminado de Cloud Run aún no existe:

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

    Sustituye LOCATION por el nombre de la ubicación del registro.

  2. Crea la imagen del contenedor:

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

    Haz los cambios siguientes:

    • PROJECT_ID: tu ID de proyecto.
    • LOCATION:nombre de la ubicación del registro.
    • IMAGE_NAME: nombre de la imagen del contenedor. Por ejemplo, ffmpeg-image.

    Cloud Run usa un tipo de máquina más grande para reducir el tiempo de compilación.

  3. Despliega el trabajo:

    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
    

    Haz los cambios siguientes:

    • PROJECT_ID: tu ID de proyecto.
    • REGION: el nombre de la región. Nota: Debe ser la misma región para la que tienes cuota de GPU.
    • IMAGE_NAME: nombre de la imagen del contenedor (por ejemplo, ffmpeg-image).

    Si es la primera vez que implementas desde una fuente en este proyecto, Cloud Run te pedirá que crees un repositorio de Artifact Registry predeterminado.

Ejecutar la tarea

Para ejecutar el trabajo, siga estos pasos:

  1. Sube un vídeo de ejemplo para codificarlo:

    gcloud storage cp gs://cloud-samples-data/video/cat.mp4 gs://preprocessing-PROJECT_ID
    
  2. Ejecuta el trabajo:

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

    El archivo entrypoint.sh requiere un archivo de entrada, un archivo de salida y los argumentos que se envíen a FFmpeg.

  3. Revisa los registros de Cloud Run para asegurarte de que el vídeo se ha transcodificado:

    gcloud run jobs logs read video-encoding-job --region REGION
    
  4. Descarga el vídeo transcodificado:

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