Transcodificação de vídeo acelerada pela GPU com FFmpeg em tarefas do Cloud Run

Este tutorial descreve como transcodificar vídeos offline de baixa prioridade através de tarefas do Cloud Run.

Prepare a sua candidatura

Para obter o exemplo de código para utilização:

  1. Clone o repositório de exemplo para a sua máquina local:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
    
  2. Altere para o diretório que contém o código de exemplo do Cloud Run:

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

Crie contentores do Cloud Storage

Para armazenar os vídeos para processamento e guardar os resultados da codificação, crie os dois contentores do Cloud Storage seguintes:

  1. Crie um contentor para armazenar vídeos antes do processamento:

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

    Substitua o seguinte:

    • PROJECT_ID: o ID do seu projeto.
    • LOCATION: a localização do Cloud Storage.
  2. Conceda à conta de serviço acesso de leitura a este contentor:

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

    Substitua PROJECT_ID pelo ID do seu projeto.

  3. Crie um contentor para armazenar vídeos transcodificados após o processamento:

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

    Substitua o seguinte:

    • PROJECT_ID: o ID do seu projeto.
    • LOCATION: a localização do Cloud Storage.
  4. Conceda à conta de serviço acesso de leitura e escrita a este contentor:

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

    Substitua PROJECT_ID pelo ID do seu projeto.

Implemente uma tarefa do Cloud Run

Crie uma tarefa do Cloud Run usando o Dockerfile no repositório de exemplo e montando os contentores que criou:

  1. Navegue para o diretório de exemplo:

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

  1. Crie um Artifact Registry se o registo do Cloud Run predefinido ainda não existir:

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

    Substitua LOCATION pelo nome da localização do registo.

  2. Crie a imagem de contentor:

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

    Substitua o seguinte:

    • PROJECT_ID: o ID do seu projeto.
    • LOCATION:nome da localização do registo.
    • IMAGE_NAME: nome da imagem do contentor, por exemplo: ffmpeg-image.

    O Cloud Run usa um tipo de máquina maior para reduzir o tempo de compilação.

  3. Implemente o trabalho:

    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
    

    Substitua o seguinte:

    • PROJECT_ID: o ID do seu projeto.
    • REGION: o nome da região. Nota: tem de ser a mesma região para a qual tem quota de GPU.
    • IMAGE_NAME: nome da imagem do contentor, por exemplo, ffmpeg-image.

    Se esta for a primeira vez que implementa a partir da origem neste projeto, o Cloud Run pede-lhe que crie um repositório do Artifact Registry predefinido.

Execute a tarefa

Para executar a tarefa, siga estes passos:

  1. Carregue um vídeo de exemplo para codificar:

    gcloud storage cp gs://cloud-samples-data/video/cat.mp4 gs://preprocessing-PROJECT_ID
    
  2. Execute a tarefa:

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

    O ficheiro entrypoint.sh requer um ficheiro de entrada, um ficheiro de saída e quaisquer argumentos a enviar para o FFmpeg.

  3. Reveja os registos do Cloud Run para se certificar de que o vídeo foi transcodificado:

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

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