使用 Transcoder API 对视频进行转码
本页面介绍如何使用 Transcoder API 和 curl
、Windows PowerShell 或客户端库的默认设置创建基本视频转码作业。
您还可以使用以下任一编程语言直接在 Google Cloud 控制台中执行本快速入门:
准备工作
- 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
- 安装 Google Cloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init
-
创建或选择 Google Cloud 项目。
-
创建 Cloud 项目:
gcloud projects create PROJECT_ID
-
选择您创建的 Cloud 项目:
gcloud config set project PROJECT_ID
-
-
确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。
-
Enable the Transcoder API:
gcloud services enable transcoder.googleapis.com
-
为您的 Google 帐号创建身份验证凭据:
gcloud auth application-default login
-
向您的 Google 帐号授予角色。对以下每个 IAM 角色运行以下命令一次:
roles/transcoder.admin, roles/storage.admin
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
- 将
PROJECT_ID
替换为您的项目 ID。 - 将
EMAIL_ADDRESS
替换为您的电子邮件地址。 - 将
ROLE
替换为每个角色。
- 将
- 安装 Google Cloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init
-
创建或选择 Google Cloud 项目。
-
创建 Cloud 项目:
gcloud projects create PROJECT_ID
-
选择您创建的 Cloud 项目:
gcloud config set project PROJECT_ID
-
-
确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。
-
Enable the Transcoder API:
gcloud services enable transcoder.googleapis.com
-
为您的 Google 帐号创建身份验证凭据:
gcloud auth application-default login
-
向您的 Google 帐号授予角色。对以下每个 IAM 角色运行以下命令一次:
roles/transcoder.admin, roles/storage.admin
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
- 将
PROJECT_ID
替换为您的项目 ID。 - 将
EMAIL_ADDRESS
替换为您的电子邮件地址。 - 将
ROLE
替换为每个角色。
- 将
创建 Cloud Storage 存储桶
- 在 Google Cloud 控制台中,进入 Cloud Storage 存储桶页面。
- 点击创建存储分区。
- 在创建存储分区页面上,输入您的存储分区信息。要转到下一步,请点击继续。
- 点击创建。
- 点击创建文件夹并输入名称,以创建一个用于保存已编码的视频输出的文件夹。
使用 Transcoder API 对视频进行转码
执行以下步骤时,本地机器上必须至少有时长为 5 秒的视频(示例视频)。请参阅支持的输入和输出格式列表。
将视频上传到 Cloud Storage 存储桶
- 在 Google Cloud 控制台中,转到 Cloud Storage 浏览器页面。
转到“Cloud Storage 浏览器”页面 - 点击存储桶的名称将其打开。
- 点击上传文件。
- 选择要从本地机器上传的视频文件。
您的视频现已保存到 Cloud Storage 存储桶。
创建转码作业
默认情况下,Transcoder API 使用 H.264 编码以及 MP4、HLS 和 MPEG-DASH 包装对视频进行转码。对于每个输入视频,它以高清(1280x720 像素)和标清(640x360 像素)提供输出呈现方式。
要创建作业,请使用 projects.locations.jobs.create
方法。 以下代码示例使用预设创建基本转码作业。
REST
在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:IAM 设置中列出的 Google Cloud 项目 ID。
- LOCATION:运行作业的位置。请使用其中一个受支持的区域:
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
asia-east1
asia-south1
asia-southeast1
europe-west1
europe-west2
europe-west4
- STORAGE_BUCKET_NAME:您创建的 Cloud Storage 存储桶的名称。
- STORAGE_INPUT_VIDEO:您要对其进行转码的 Cloud Storage 存储桶中的视频的名称,例如
my-vid.mp4
。此字段应考虑您在存储桶中创建的任何文件夹(例如input/my-vid.mp4
)。 - STORAGE_OUTPUT_FOLDER:您要在其中保存已编码视频输出的 Cloud Storage 文件夹名称。
请求 JSON 正文:
{ "inputUri": "gs://STORAGE_BUCKET_NAME/STORAGE_INPUT_VIDEO", "outputUri": "gs://STORAGE_BUCKET_NAME/STORAGE_OUTPUT_FOLDER/", "templateId": "preset/web-hd" }
如需发送您的请求,请展开以下选项之一:
此特定 REST 示例使用可选的 fields
查询参数来仅在显示响应中的已创建的资源名称。
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID" }
gcloud CLI
- 对
gcloud
命令进行以下替换: - STORAGE_BUCKET_NAME:您创建的 Cloud Storage 存储桶的名称。
- STORAGE_INPUT_VIDEO:您要对其进行转码的 Cloud Storage 存储桶中的视频的名称,例如
my-vid.mp4
。此字段应考虑您在存储桶中创建的任何文件夹(例如input/my-vid.mp4
)。 - LOCATION:运行作业的位置。请使用其中一个受支持的区域:
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
asia-east1
asia-south1
asia-southeast1
europe-west1
europe-west2
europe-west4
- STORAGE_OUTPUT_FOLDER:您要在其中保存已编码视频输出的 Cloud Storage 文件夹名称。
- 运行以下命令:
gcloud transcoder jobs create \ --input-uri="gs://STORAGE_BUCKET_NAME/STORAGE_INPUT_VIDEO" \ --location=LOCATION \ --output-uri="gs://STORAGE_BUCKET_NAME/STORAGE_OUTPUT_FOLDER/"
您应该会看到如下所示的响应:{ "config": { ... }, "createTime": CREATE_TIME, "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID", "state": "PENDING", "ttlAfterCompletionDays": 30 }
C#
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 C# 设置说明进行操作。 如需了解详情,请参阅 Transcoder API C# API 参考文档。
Go
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 Go 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Go API 参考文档。
Java
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 Java 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Java API 参考文档。
Node.js
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Node.js API 参考文档。
PHP
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 PHP 设置说明进行操作。 如需了解详情,请参阅 Transcoder API PHP API 参考文档。
Python
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 Python 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Python API 参考文档。
Ruby
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Ruby API 参考文档。
复制返回的 JOB_ID。您需要该 ID 才能获得作业的状态。
检查转码作业的状态
如需检查作业的状态,请使用 projects.locations.jobs.get
方法。 以下代码显示获取作业详细信息的示例并显示作业状态。
REST
在使用任何请求数据之前,请先进行以下替换:
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
asia-east1
asia-south1
asia-southeast1
europe-west1
europe-west2
europe-west4
根据您发送的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID", "config": { "inputs": [ { "key": "input0", "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_INPUT_VIDEO" } ], "editList": [ { "key": "atom0", "inputs": [ "input0" ], "startTimeOffset": "0s" } ], "elementaryStreams": [ { "videoStream": { "h264": { "widthPixels": 640, "heightPixels": 360, "frameRate": 30, "bitrateBps": 550000, "pixelFormat": "yuv420p", "rateControlMode": "vbr", "crfLevel": 21, "gopDuration": "3s", "vbvSizeBits": 550000, "vbvFullnessBits": 495000, "entropyCoder": "cabac", "bFrameCount": 3, "aqStrength": 1, "profile": "high", "preset": "veryfast" } }, "key": "video-stream0" }, { "videoStream": { "h264": { "widthPixels": 1280, "heightPixels": 720, "frameRate": 30, "bitrateBps": 2500000, "pixelFormat": "yuv420p", "rateControlMode": "vbr", "crfLevel": 21, "gopDuration": "3s", "vbvSizeBits": 2500000, "vbvFullnessBits": 2250000, "entropyCoder": "cabac", "bFrameCount": 3, "aqStrength": 1, "profile": "high", "preset": "veryfast" } }, "key": "video-stream1" }, { "audioStream": { "codec": "aac", "bitrateBps": 64000, "channelCount": 2, "channelLayout": [ "fl", "fr" ], "sampleRateHertz": 48000 }, "key": "audio-stream0" } ], "muxStreams": [ { "key": "sd", "fileName": "sd.mp4", "container": "mp4", "elementaryStreams": [ "video-stream0", "audio-stream0" ] }, { "key": "hd", "fileName": "hd.mp4", "container": "mp4", "elementaryStreams": [ "video-stream1", "audio-stream0" ] }, { "key": "media-sd", "fileName": "media-sd.ts", "container": "ts", "elementaryStreams": [ "video-stream0", "audio-stream0" ] }, { "key": "media-hd", "fileName": "media-hd.ts", "container": "ts", "elementaryStreams": [ "video-stream1", "audio-stream0" ] }, { "key": "video-only-sd", "fileName": "video-only-sd.m4s", "container": "fmp4", "elementaryStreams": [ "video-stream0" ] }, { "key": "video-only-hd", "fileName": "video-only-hd.m4s", "container": "fmp4", "elementaryStreams": [ "video-stream1" ] }, { "key": "audio-only", "fileName": "audio-only.m4s", "container": "fmp4", "elementaryStreams": [ "audio-stream0" ] } ], "manifests": [ { "fileName": "manifest.m3u8", "type": "HLS", "muxStreams": [ "media-sd", "media-hd" ] }, { "fileName": "manifest.mpd", "type": "DASH", "muxStreams": [ "video-only-sd", "video-only-hd", "audio-only" ] } ], "output": { "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_OUTPUT_FOLDER/" } }, "state": "PENDING", "createTime": CREATE_TIME, "ttlAfterCompletionDays": 30 }
gcloud CLI
- 对
gcloud
命令进行以下替换: - JOB_ID:您创建的作业的 ID。
- LOCATION:您的作业的位置。请使用其中一个受支持的区域:
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
asia-east1
asia-south1
asia-southeast1
europe-west1
europe-west2
europe-west4
- 运行以下命令:
gcloud transcoder jobs describe JOB_ID --location=LOCATION
您应该会看到如下所示的响应:{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID", "config": { "inputs": [ { "key": "input0", "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_INPUT_VIDEO" } ], "editList": [ { "key": "atom0", "inputs": [ "input0" ], "startTimeOffset": "0s" } ], "elementaryStreams": [ { "videoStream": { "h264": { "widthPixels": 640, "heightPixels": 360, "frameRate": 30, "bitrateBps": 550000, "pixelFormat": "yuv420p", "rateControlMode": "vbr", "crfLevel": 21, "gopDuration": "3s", "vbvSizeBits": 550000, "vbvFullnessBits": 495000, "entropyCoder": "cabac", "bFrameCount": 3, "aqStrength": 1, "profile": "high", "preset": "veryfast" } }, "key": "video-stream0" }, { "videoStream": { "h264": { "widthPixels": 1280, "heightPixels": 720, "frameRate": 30, "bitrateBps": 2500000, "pixelFormat": "yuv420p", "rateControlMode": "vbr", "crfLevel": 21, "gopDuration": "3s", "vbvSizeBits": 2500000, "vbvFullnessBits": 2250000, "entropyCoder": "cabac", "bFrameCount": 3, "aqStrength": 1, "profile": "high", "preset": "veryfast" } }, "key": "video-stream1" }, { "audioStream": { "codec": "aac", "bitrateBps": 64000, "channelCount": 2, "channelLayout": [ "fl", "fr" ], "sampleRateHertz": 48000 }, "key": "audio-stream0" } ], "muxStreams": [ { "key": "sd", "fileName": "sd.mp4", "container": "mp4", "elementaryStreams": [ "video-stream0", "audio-stream0" ] }, { "key": "hd", "fileName": "hd.mp4", "container": "mp4", "elementaryStreams": [ "video-stream1", "audio-stream0" ] }, { "key": "media-sd", "fileName": "media-sd.ts", "container": "ts", "elementaryStreams": [ "video-stream0", "audio-stream0" ] }, { "key": "media-hd", "fileName": "media-hd.ts", "container": "ts", "elementaryStreams": [ "video-stream1", "audio-stream0" ] }, { "key": "video-only-sd", "fileName": "video-only-sd.m4s", "container": "fmp4", "elementaryStreams": [ "video-stream0" ] }, { "key": "video-only-hd", "fileName": "video-only-hd.m4s", "container": "fmp4", "elementaryStreams": [ "video-stream1" ] }, { "key": "audio-only", "fileName": "audio-only.m4s", "container": "fmp4", "elementaryStreams": [ "audio-stream0" ] } ], "manifests": [ { "fileName": "manifest.m3u8", "type": "HLS", "muxStreams": [ "media-sd", "media-hd" ] }, { "fileName": "manifest.mpd", "type": "DASH", "muxStreams": [ "video-only-sd", "video-only-hd", "audio-only" ] } ], "output": { "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_OUTPUT_FOLDER/" } }, "state": "PENDING", "createTime": CREATE_TIME, "ttlAfterCompletionDays": 30 }
C#
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 C# 设置说明进行操作。 如需了解详情,请参阅 Transcoder API C# API 参考文档。
Go
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 Go 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Go API 参考文档。
Java
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 Java 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Java API 参考文档。
Node.js
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Node.js API 参考文档。
PHP
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 PHP 设置说明进行操作。 如需了解详情,请参阅 Transcoder API PHP API 参考文档。
Python
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 Python 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Python API 参考文档。
Ruby
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Ruby API 参考文档。
如果 state
为 SUCCEEDED
,则表示作业已完成,并且您的视频输出现在可在 Cloud Storage 存储桶的已编码文件列表中找到。
播放视频
如需在 Shaka Player 中播放生成的媒体文件,请完成以下步骤:
- 请将 Cloud Storage 存储桶设为可公开读取。
- 如需在 Cloud Storage 存储桶上启用跨域资源共享 (CORS),请执行以下操作:
- 创建一个包含以下代码的 JSON 文件:
[ { "origin": ["https://shaka-player-demo.appspot.com/"], "responseHeader": ["Content-Type", "Range"], "method": ["GET", "HEAD"], "maxAgeSeconds": 3600 } ]
-
将 JSON_FILE_NAME 替换为您在上一步中创建的 JSON 文件的名称,然后运行以下命令:
gsutil cors set JSON_FILE_NAME.json gs://STORAGE_BUCKET_NAME
- 创建一个包含以下代码的 JSON 文件:
- 在 Cloud Storage 存储桶中,选择一个由转码作业生成的 MP4 文件或清单文件。在该文件的公开访问权限列中,点击复制网址。
- 导航到在线直播播放器 Shaka Player。
- 点击顶部导航栏中的自定义内容。
- 点击 + 按钮。
将文件的公开网址粘贴到清单网址框中。
在名称框中输入一个名称。
点击保存。
点击播放。
清理
为避免因本页中使用的资源导致您的 Google Cloud 帐号产生费用,请按照以下步骤操作。
删除存储桶
在 Google Cloud 控制台中,转到 Cloud Storage 浏览器页面。
选中所创建存储桶旁边的复选框。
点击删除。
在显示的弹出式窗口中,点击删除以永久删除存储桶及其内容。
删除作业
REST
在使用任何请求数据之前,请先进行以下替换:
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
asia-east1
asia-south1
asia-southeast1
europe-west1
europe-west2
europe-west4
根据您发送的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{}
gcloud CLI
- 对
gcloud
命令进行以下替换: - JOB_ID:您创建的作业的 ID。
- LOCATION:您的作业的位置。请使用其中一个受支持的区域:
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
asia-east1
asia-south1
asia-southeast1
europe-west1
europe-west2
europe-west4
- 运行以下命令:
gcloud transcoder jobs delete JOB_ID --location=LOCATION
您应该会看到如下所示的响应:Deleted job [projects/PROJECT_ID/locations/LOCATION/jobs/JOB_ID].
C#
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 C# 设置说明进行操作。 如需了解详情,请参阅 Transcoder API C# API 参考文档。
Go
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 Go 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Go API 参考文档。
Java
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 Java 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Java API 参考文档。
Node.js
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Node.js API 参考文档。
PHP
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 PHP 设置说明进行操作。 如需了解详情,请参阅 Transcoder API PHP API 参考文档。
Python
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 Python 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Python API 参考文档。
Ruby
在尝试此示例之前,请按照使用客户端库的 Transcoder API 快速入门中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Ruby API 参考文档。
撤消凭据
-
可选:撤消您创建的身份验证凭据,并删除本地凭据文件。
gcloud auth application-default revoke
-
可选:从 gcloud CLI 撤消凭据。
gcloud auth revoke
后续步骤
- 阅读 Transcoder API 概览。
- 查看可参考的指南,了解如何使用 Transcoder API。