本页介绍了如何向输出视频添加隐式字幕和翻译版字幕。
字幕(或简称字幕)是视频中音频的视觉展示。隐式字幕通常采用与音频相同的语言,包括背景声音和讲话人变化。
翻译版字幕通常用于将视频的对话翻译成其他语言。翻译版字幕通常不包括背景音和讲话人变化。
本页使用输入字幕文件一词来指代包含隐藏式字幕或字幕的文本文件。您可以将此文件作为作业的输入提供给系统。
向作业配置添加字幕
如需了解支持的输入字幕文件格式,请参阅支持的输入和输出。我们提供了示例视频文件和示例输入字幕文件供您测试配置。
以下部分中的信息用于向作业配置添加字幕。本页面假定您熟悉基本的 JobConfig。如需详细了解如何创建转码作业,请参阅创建和管理作业。
添加字幕
如需创建一个将字幕嵌入到输出视频文件容器中的工作,请执行以下操作:
将
inputs
数组添加到作业配置的开头。将
Input
对象添加到inputs
数组,以定义关联输入视频的键和 URI。添加另一个
Input
对象,其中包含输入字幕文件的路径。将
editList
数组添加到作业配置。此数组用于将输入添加到输出视频时间轴。将
EditAtom
对象添加到editList
数组。此EditAtom
对象必须引用您在inputs
数组中添加的输入视频和字幕的键。您可以指定startTimeOffset
和endTimeOffset
来剪辑输入视频。通过将
textStream
对象添加到elementaryStreams
数组,将字幕添加到输出容器。仅支持一个嵌入式文本流,并且它会添加到所有输出视频中(因为只有一个输出时间轴)。使用
textStream
配置对象中的mapping
数组来引用EditAtom
对象键。
以下示例配置将 CEA-608 隐式字幕嵌入视频中。
您可以将此配置添加到作业模板中,也可以将其添加到临时作业配置中。
添加字幕
如需创建一个作业来生成可从清单中播放的多语言字幕文件,请执行以下操作:
将
inputs
数组添加到作业配置。将
Input
对象添加到inputs
数组,以定义关联输入视频的键和 URI。添加另一个
Input
对象,用于定义输入字幕文件的 URI。将
editList
数组添加到配置。此数组用于将输入添加到输出视频时间轴。将
EditAtom
对象添加到editList
数组,以通过键引用inputs
数组中的对象。您可以指定startTimeOffset
和endTimeOffset
来剪辑输入视频。通过将
textStream
对象添加到elementaryStreams
数组,将字幕添加到输出容器。对于独立字幕文件,请在
muxStream
数组中指定容器;请参阅以下配置中键为text-vtt-en
和text-vtt-es
的对象。对于嵌入式字幕,您只需要基本流。
以下配置会生成多个 WebVTT 文件,一个用于英语字幕,另一个用于西班牙语字幕。WebVTT 文件中的 DASH 字幕采用 fMP4 容器格式创建。
您可以将此配置添加到作业模板中,也可以将其添加到临时作业配置中。
REST
在使用任何请求数据之前,请先进行以下替换:
PROJECT_ID
:IAM 设置中列出的 Google Cloud 项目 ID。LOCATION
:运行作业的位置。请使用其中一个受支持的区域。显示位置us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
northamerica-northeast1
asia-east1
asia-northeast1
asia-northeast3
asia-south1
asia-southeast1
australia-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_SUBTITLES_FILE1
:Cloud Storage 存储桶中的字幕文件的名称,例如subtitles-en.srt
(英语字幕)。此字段应考虑您在存储分区中创建的任何文件夹(例如input/subtitles-en.srt
)。STORAGE_SUBTITLES_FILE2
:Cloud Storage 存储桶中的另一个字幕文件的名称,例如subtitles-es.srt
(西班牙语字幕)。此字段应考虑您在存储分区中创建的任何文件夹(例如input/subtitles-es.srt
)。STORAGE_OUTPUT_FOLDER
:您要在其中保存已编码视频输出的 Cloud Storage 存储桶中的输出文件夹的名称。
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID", "config": { ... }, "state": "PENDING", "createTime": CREATE_TIME, "ttlAfterCompletionDays": 30 }
gcloud
在使用下面的命令数据之前,请先进行以下替换:
LOCATION
:运行作业的位置。请使用其中一个受支持的区域。显示位置us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
northamerica-northeast1
asia-east1
asia-northeast1
asia-northeast3
asia-south1
asia-southeast1
australia-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_SUBTITLES_FILE1
:Cloud Storage 存储桶中的字幕文件的名称,例如subtitles-en.srt
(英语字幕)。此字段应考虑您在存储分区中创建的任何文件夹(例如input/subtitles-en.srt
)。STORAGE_SUBTITLES_FILE2
:Cloud Storage 存储桶中的另一个字幕文件的名称,例如subtitles-es.srt
(西班牙语字幕)。此字段应考虑您在存储分区中创建的任何文件夹(例如input/subtitles-es.srt
)。STORAGE_OUTPUT_FOLDER
:您要在其中保存已编码视频输出的 Cloud Storage 存储桶中的输出文件夹的名称。
将以下内容保存在名为 request.json
的文件中:
{ "config": { "inputs": [ { "key": "input0", "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_INPUT_VIDEO" }, { "key": "subtitle_input_en", "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_SUBTITLES_FILE1" }, { "key": "subtitle_input_es", "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_SUBTITLES_FILE2" } ], "editList": [ { "key": "atom0", "inputs": [ "input0", "subtitle_input_en", "subtitle_input_es" ] } ], "elementaryStreams": [ { "key": "video-stream0", "videoStream": { "h264": { "heightPixels": 360, "widthPixels": 640, "bitrateBps": 550000, "frameRate": 60 } } }, { "key": "audio-stream0", "audioStream": { "codec": "aac", "bitrateBps": 64000 } }, { "key": "vtt-stream-en", "textStream": { "codec": "webvtt", "languageCode": "en-US", "displayName": "English", "mapping": [ { "atomKey": "atom0", "inputKey": "subtitle_input_en" } ] } }, { "key": "vtt-stream-es", "textStream": { "codec": "webvtt", "languageCode": "es-ES", "displayName": "Spanish", "mapping": [ { "atomKey": "atom0", "inputKey": "subtitle_input_es" } ] } } ], "muxStreams": [ { "key": "sd-hls-fmp4", "container": "fmp4", "elementaryStreams": [ "video-stream0" ] }, { "key": "audio-hls-fmp4", "container": "fmp4", "elementaryStreams": [ "audio-stream0" ] }, { "key": "text-vtt-en", "container": "vtt", "elementaryStreams": [ "vtt-stream-en" ], "segmentSettings": { "segmentDuration": "6s", "individualSegments": true } }, { "key": "text-vtt-es", "container": "vtt", "elementaryStreams": [ "vtt-stream-es" ], "segmentSettings": { "segmentDuration": "6s", "individualSegments": true } } ], "manifests": [ { "fileName": "manifest.m3u8", "type": "HLS", "muxStreams": [ "sd-hls-fmp4", "audio-hls-fmp4", "text-vtt-en", "text-vtt-es" ] } ], "output": { "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_OUTPUT_FOLDER/" } } }
执行以下命令:
Linux、macOS 或 Cloud Shell
gcloud transcoder jobs create --location=LOCATION --file=request.json
Windows (PowerShell)
gcloud transcoder jobs create --location=LOCATION --file=request.json
Windows (cmd.exe)
gcloud transcoder jobs create --location=LOCATION --file=request.json
您应该会收到类似如下所示的响应:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID", "config": { ... }, "state": "PENDING", "createTime": CREATE_TIME, "ttlAfterCompletionDays": 30 }
Go
在试用此示例之前,请按照 Transcoder API 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Go API 参考文档。
如需向 Transcoder API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Java
在试用此示例之前,请按照 Transcoder API 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Java API 参考文档。
如需向 Transcoder API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Node.js
在试用此示例之前,请按照 Transcoder API 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Node.js API 参考文档。
如需向 Transcoder API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Python
在试用此示例之前,请按照 Transcoder API 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Python API 参考文档。
如需向 Transcoder API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
播放视频
如需在 Windows 上查看字幕,请在影视应用中播放视频。请务必选择字幕轨道。
如需在 MacOS 或 Linux 上查看字幕,您可以在 Shaka Player 中播放视频。请务必从字幕菜单中启用字幕。
如需在 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 文件的名称,然后运行以下命令:
gcloud storage buckets update gs://STORAGE_BUCKET_NAME --cors-file=JSON_FILE_NAME.json
- 创建一个包含以下代码的 JSON 文件:
- 在 Cloud Storage 存储分区中,选择一个由转码作业生成的 MP4 文件或清单文件。在该文件的公开访问权限列中,点击复制网址。
- 导航到在线直播播放器 Shaka Player。
- 点击顶部导航栏中的自定义内容。
- 点击 + 按钮。
将文件的公开网址粘贴到清单网址框中。
在名称框中输入一个名称。
点击保存。
点击播放。
选择播放器右下角的省略号按钮并启用字幕。
示例
您可以为测试作业使用以下文件:
输入字幕文件中的文本行之间不得有空行。