このページでは、出力動画にクローズド キャプションと字幕を追加する方法について説明します。
クローズド キャプション(またはキャプション)は、動画内の音声の視覚表示です。一般的に、クローズド キャプションは音声と同じ言語で、背景のサウンドや話者の変更を含みます。
字幕は通常、動画の会話を別の言語に翻訳します。字幕には通常、背景音や話者の変化は含まれません。
このページの入力字幕ファイルという用語は、クローズド キャプションまたは字幕を含むテキスト ファイルを指します。このファイルをジョブへの入力として指定します。
ジョブ構成にキャプションと字幕を追加する
サポートされている入力字幕ファイルの形式については、サポートされている入出力形式をご覧ください。サンプルの動画ファイルとサンプルの入力字幕ファイルが用意されているため、構成をテストできます。
ジョブ構成にキャプションと字幕を追加するには、以降のセクションの情報を使用します。このページは、基本的な JobConfig に精通していることを前提としています。コード変換ジョブの作成の詳細については、ジョブの作成と管理をご覧ください。
字幕の追加
出力動画ファイル コンテナにキャプションを埋め込むジョブを作成するには、次の操作を行います。
ジョブ構成の先頭に
inputs
配列を追加します。関連付けられた入力動画のキーと URI を定義する
Input
オブジェクトをinputs
配列に追加します。入力字幕ファイルへのパスを含む別の
Input
オブジェクトを追加します。editList
配列をジョブ構成に追加します。この配列は、出力動画タイムラインに入力を追加するために使用されます。EditAtom
オブジェクトをeditList
配列に追加します。このEditAtom
オブジェクトは、inputs
配列に追加した入力動画とキャプションのキーを参照する必要があります。startTimeOffset
とendTimeOffset
を指定して、入力動画をトリミングできます。出力コンテナにキャプションを追加するには、
textStream
オブジェクトをelementaryStreams
配列に追加します。サポートされる埋め込みテキスト ストリームは 1 つのみで、すべての出力動画に追加されます(出力タイムラインが 1 つのみであるため)。mapping
配列をtextStream
構成オブジェクトで使用して、EditAtom
オブジェクト キーを参照します。
次の構成例では、動画に CEA-608 クローズド キャプションを埋め込んでいます。
この構成をジョブ テンプレートに追加するか、アドホック ジョブ構成に含めることができます。
字幕の追加
マニフェストから再生される多言語字幕ファイルを生成するジョブを作成するには、次の操作を行います。
inputs
配列をジョブ構成に追加します。関連付けられた入力動画のキーと URI を定義する
Input
オブジェクトをinputs
配列に追加します。入力字幕ファイルの URI を定義する別の
Input
オブジェクトを追加します。editList
配列を構成に追加します。この配列は、出力動画のタイムラインに入力を追加するために使用されます。inputs
配列内のオブジェクトをキーで参照するEditAtom
オブジェクトをeditList
配列に追加します。startTimeOffset
とendTimeOffset
を指定して、入力動画をトリミングできます。出力コンテナに字幕を追加するには、
textStream
オブジェクトをelementaryStreams
配列に追加します。スタンドアロンの字幕ファイルの場合は、
muxStream
配列でコンテナを指定します。次の構成でtext-vtt-en
とtext-vtt-es
というキーを持つオブジェクトをご覧ください。埋め込み字幕の場合、必要なのはエレメンタリ ストリームのみです。
次の構成では、複数の WebVTT ファイル(英語字幕用とスペイン語字幕用)を生成します。WebVTT ファイルの DASH 字幕は、fMP4 コンテナ形式で作成されます。
この構成をジョブ テンプレートに追加するか、アドホック ジョブ構成に含めることができます。
REST
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_ID
: IAM 設定に載っている Google Cloud プロジェクト ID。LOCATION
: ジョブを実行するロケーション。サポートされているリージョンのいずれかを使用します。3~7 つの店舗を表示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
: ジョブを実行するロケーション。サポートされているリージョンのいずれかを使用します。3~7 つの店舗を表示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 またはマニフェスト ファイルのいずれかを選択します。ファイルの [公開アクセス] 列で [URL をコピー] をクリックします。
- オンライン ライブ ストリーム プレーヤーの Shaka Player に移動します。
- 上部のナビゲーション バーにある [CUSTOM CONTENT](カスタム コンテンツ)をクリックします。
- [+] ボタンをクリックします。
ファイルの公開 URL を [Manifest URL] ボックスに貼り付けます。
[Name] ボックスに名前を入力します。
[保存] をクリックします。
[Play] をクリックします。
プレーヤーの右下にある省略記号ボタンを選択して、字幕を有効にします。
例
テストジョブには次のファイルを使用できます。
入力字幕ファイルのテキスト行の間に空白行を含めることはできません。