Cloud Run 작업에서 FFmpeg를 사용한 GPU 가속 동영상 트랜스코딩

이 튜토리얼에서는 Cloud Run 작업을 사용하여 우선순위가 낮은 오프라인 동영상을 트랜스코딩하는 방법을 설명합니다.

신청 준비

사용할 코드 샘플을 검색하려면 다음 안내를 따르세요.

  1. 샘플 저장소를 로컬 머신에 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
    
  2. Cloud Run 샘플 코드가 포함된 디렉터리로 변경합니다.

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

Cloud Storage 버킷 만들기

처리할 동영상을 저장하고 인코딩 결과를 저장하려면 다음 두 개의 Cloud Storage 버킷을 만드세요.

  1. 처리하기 전에 동영상을 저장할 버킷을 만듭니다.

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

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID입니다.
    • LOCATION: Cloud Storage 위치입니다.
  2. 이 버킷에서 읽을 수 있는 액세스 권한을 서비스 계정에 부여합니다.

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

    PROJECT_ID를 프로젝트 ID로 바꿉니다.

  3. 처리 후 트랜스코딩된 동영상을 저장할 버킷을 만듭니다.

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

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID입니다.
    • LOCATION: Cloud Storage 위치입니다.
  4. 서비스 계정에 이 버킷에서 읽고 쓸 수 있는 액세스 권한을 부여합니다.

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

    PROJECT_ID를 프로젝트 ID로 바꿉니다.

Cloud Run 작업 배포

샘플 저장소의 Dockerfile을 사용하여 Cloud Run 작업을 만들고 만든 버킷을 마운트합니다.

  1. 샘플 디렉토리로 이동합니다.

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

  1. 기본 Cloud Run 레지스트리가 아직 없으면 Artifact Registry를 만듭니다.

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

    LOCATION을 레지스트리 위치의 이름으로 바꿉니다.

  2. 컨테이너 이미지를 빌드합니다.

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

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID입니다.
    • LOCATION:레지스트리 위치의 이름입니다.
    • IMAGE_NAME: 컨테이너 이미지의 이름입니다(예: ffmpeg-image).

    Cloud Run은 더 큰 머신 유형을 사용하여 빌드 시간을 줄입니다.

  3. 작업을 배포합니다.

    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
    

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID입니다.
    • REGION: 리전의 이름 참고: GPU 할당량이 있는 리전과 동일해야 합니다.
    • IMAGE_NAME: 컨테이너 이미지의 이름입니다(예: ffmpeg-image).

    이 프로젝트에서 소스를 처음 배포하는 경우 Cloud Run에서 기본 Artifact Registry 저장소를 만들라는 메시지가 표시됩니다.

작업 실행

작업을 실행하려면 다음 단계를 따르세요.

  1. 인코딩할 예시 동영상을 업로드합니다.

    gcloud storage cp gs://cloud-samples-data/video/cat.mp4 gs://preprocessing-PROJECT_ID
    
  2. 작업을 실행합니다.

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

    entrypoint.sh 파일에는 입력 파일, 출력 파일, FFmpeg에 전송할 인수가 필요합니다.

  3. Cloud Run 로그를 검토하여 동영상이 트랜스코딩되었는지 확인합니다.

    gcloud run jobs logs read video-encoding-job --region REGION
    
  4. 트랜스코딩된 동영상을 다운로드합니다.

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