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

Neste tutorial, descrevemos como transcodificar vídeos off-line de baixa prioridade usando jobs do Cloud Run.

Prepare sua inscrição

Para recuperar o exemplo de código para uso, siga estas etapas:

  1. Clone o repositório de amostra na sua máquina local:

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

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

Criar buckets do Cloud Storage

Para armazenar os vídeos para processamento e salvar os resultados da codificação, crie os dois buckets do Cloud Storage a seguir:

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

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

    Substitua:

    • PROJECT_ID: o ID do projeto.
    • LOCATION: o local do Cloud Storage.
  2. Conceda à conta de serviço acesso de leitura a esse bucket:

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

    Substitua PROJECT_ID pela ID do seu projeto.

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

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

    Substitua:

    • PROJECT_ID: o ID do projeto.
    • LOCATION: o local do Cloud Storage.
  4. Conceda à conta de serviço acesso de leitura e gravação a esse bucket:

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

    Substitua PROJECT_ID pela ID do seu projeto.

Implantar um job do Cloud Run

Crie um job do Cloud Run usando o Dockerfile no repositório de exemplo e montando os buckets que você criou:

  1. Navegue até o diretório de amostra:

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

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

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

    Substitua LOCATION pelo nome do local do registro.

  2. Crie a imagem do contêiner:

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

    Substitua:

    • PROJECT_ID: o ID do projeto.
    • LOCATION:nome do local do registro.
    • IMAGE_NAME: nome da imagem do contêiner. Por exemplo, ffmpeg-image.

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

  3. Implante o 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. \
        --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:

    • PROJECT_ID: o ID do projeto.
    • REGION: o nome da região. Observação: essa precisa ser a mesma região em que você tem cota de GPU.
    • IMAGE_NAME: nome da imagem do contêiner, por exemplo, ffmpeg-image.

    Se esta for a primeira vez que você implanta de uma origem neste projeto, o Cloud Run vai pedir para você criar um repositório padrão do Artifact Registry.

Execute o job

Para executar o job, siga estas etapas:

  1. Faça upload de um vídeo de exemplo para codificar:

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

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

    O arquivo entrypoint.sh exige um arquivo de entrada, um arquivo de saída e argumentos para enviar ao FFmpeg.

  3. Analise os registros do Cloud Run para garantir que o vídeo foi transcodificado:

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

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