本页介绍了如何向输出视频添加隐式字幕和翻译版字幕。
字幕(或简称为字幕)是视频中音频的视觉表现形式。隐式字幕通常采用与音频相同的语言,包括背景声音和讲话人变化。
翻译版字幕通常用于将视频的对话翻译成其他语言。翻译版字幕通常不包括背景音和讲话人变化。
此页面使用“输入字幕文件”一词来指代包含以下内容的文本文件: 字幕。您可以将此文件作为作业的输入提供给系统。
为作业配置添加字幕
如需了解支持的输入字幕文件格式,请参阅支持的输入和输出。示例视频文件以及 示例输入字幕文件供您测试配置。
使用以下部分中的信息为作业添加字幕 配置。本页面假定您熟悉基本的 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
在尝试此示例之前,请按照Go Transcoder API 快速入门:使用 客户端库。 如需了解详情,请参阅 Transcoder API Go API 参考文档。
如需向 Transcoder API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Java
在试用此示例之前,请按照 Transcoder API 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Java API 参考文档。
如需向 Transcoder API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Node.js
在尝试此示例之前,请按照Node.js Transcoder API 快速入门:使用 客户端库。 有关详情,请参阅 Transcoder API Node.js API 参考文档。
如需向 Transcoder API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Python
在试用此示例之前,请按照 Transcoder API 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 Transcoder API Python API 参考文档。
如需向 Transcoder API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
播放视频
要在 Windows 上查看字幕,请在“电影和TV 应用。制造商 请务必选择字幕轨道
要在 MacOS 或 Linux 上观看字幕或翻译字幕,您可以使用 Shaka 播放器。请务必 通过字幕菜单启用字幕。
如需在 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。
- 点击顶部导航栏中的自定义内容。
- 点击 + 按钮。
将文件的公开网址粘贴到清单网址框中。
在名称框中输入一个名称。
点击保存。
点击播放。
选择播放器右下角的省略号按钮并启用字幕。
示例
您可以将以下文件用于测试作业:
输入字幕文件的文本行之间不得包含空白行。