在 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 .