このページでは、ライブ ストリームの Web Video Text Tracks 形式(WebVTT)で字幕を構成する方法について説明します。字幕は、入力ストリームの cea608 または cea708 の字幕から生成されます。
字幕は、HLS と DASH のライブ ストリームでサポートされています。
始める前に
このページでは、HLS ライブ ストリームのクイックスタートまたは MPEG-DASH ライブ ストリームのクイックスタートの始める前にの手順が完了していることを前提としています。
入力エンドポイントを作成する
入力エンドポイントを作成するには、projects.locations.inputs.create
メソッドを使用します。
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_NUMBER
: Google Cloud プロジェクト番号。これは、IAM 設定ページの [プロジェクト番号] フィールドにあります。LOCATION
: 入力エンドポイントを作成するロケーション。サポートされているリージョンのいずれかを使用します。ロケーションを表示us-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
INPUT_ID
: 作成する新しい入力エンドポイントのユーザー定義の識別子(入力ストリームの送信先)。この値は 1~63 文字で、先頭と末尾は[a-z0-9]
で、文字の間にダッシュ(-)を含めることができます。たとえば、my-input
です。
リクエストの本文(JSON):
{ "type": "RTMP_PUSH" }
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような JSON レスポンスが返されます。
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata", "createTime": CREATE_TIME, "target": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID", "verb": "create", "requestedCancellation": false, "apiVersion": "v1" }, "done": false }
返された OPERATION_ID をコピーして、次のセクションで使用します。
結果を確認する
projects.locations.operations.get
メソッドを使用して、入力エンドポイントが作成されているかどうかを確認します。レスポンスに "done: false"
が含まれている場合は、レスポンスに "done: true"
が含まれるまでコマンドを繰り返します。リージョンで最初に入力エンドポイントを作成するには、最大 10 分ほどかかることがあります。
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_NUMBER
: Google Cloud プロジェクト番号。これは、IAM 設定ページの [プロジェクト番号] フィールドにあります。LOCATION
: 入力エンドポイントが配置されているロケーション。サポートされているリージョンのいずれかを使用します。ロケーションを表示us-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
OPERATION_ID
: オペレーションの ID。
リクエストを送信するには、次のいずれかのオプションを開きます。
次のような JSON レスポンスが返されます。
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata", "createTime": CREATE_TIME, "endTime": END_TIME, "target": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID", "verb": "create", "requestedCancellation": false, "apiVersion": "v1" }, "done": true, "response": { "@type": "type.googleapis.com/google.cloud.video.livestream.v1.Input", "name": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID", "createTime": CREATE_TIME, "updateTime": UPDATE_TIME, "type": "RTMP_PUSH", "uri": INPUT_STREAM_URI, # For example, "rtmp://1.2.3.4/live/b8ebdd94-c8d9-4d88-a16e-b963c43a953b", "tier": "HD" } }
uri
フィールドを探して、返された INPUT_STREAM_URI をコピーし、後で入力ストリームを送信するセクションで使用します。
チャネルを作成します。
チャネルを作成するには、projects.locations.channels.create
ソッドを使用します。
チャネル構成では次の点に注意してください。
字幕には 1 つの
ElementaryStream
(TextStream
)を使用します。{ "key": "webvtt-english", "textStream": { "codec": "webvtt", "display_name": "English", "language_code": "en-US", "mapping": [ { "input_cea_channel": "CC1" } ] } }
TextStream
codec
フィールドはwebvtt
に設定されています。TextStream
mapping
フィールドは、入力ストリームをテキスト トラックにマッピングします。この例では、input_cea_channel
は英語字幕の入力チャンネルCC1
にマッピングされています。エレメンタル ストリームを使用して、キー
vtt-english
を含むMuxStream
を作成します。{ "key": "vtt_english", "container": "vtt", "elementaryStreams": [ "webvtt-english" ], "segmentSettings": { "segmentDuration": "2s" } }
この多重化ストリームは、HLS と DASH の両方のマニフェストで参照されます。
{ "fileName": "main.m3u8", "type": "HLS", "muxStreams": [ "mux_video_ts", "vtt_english" ], "maxSegmentCount": 5 }
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_NUMBER
: Google Cloud プロジェクト番号。これは、IAM 設定ページの [プロジェクト番号] フィールドにあります。LOCATION
: チャネルを作成するロケーション。サポートされているリージョンのいずれかを使用します。ロケーションを表示us-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: 作成するチャネルのユーザー定義の識別子。この値は 1~63 文字で、先頭と末尾は[a-z0-9]
で、文字の間にダッシュ(-)を含めることができます。INPUT_ID
: 入力エンドポイントのユーザー定義の識別子BUCKET_NAME
: ライブ ストリームのマニフェスト ファイルとセグメント ファイルを保持するために作成した Cloud Storage バケットの名前
リクエストの本文(JSON):
{ "inputAttachments": [ { "key": "my-input", "input": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID" } ], "output": { "uri": "gs://BUCKET_NAME" }, "elementaryStreams": [ { "key": "es_video", "videoStream": { "h264": { "profile": "high", "widthPixels": 1280, "heightPixels": 720, "bitrateBps": 3000000, "frameRate": 30 } } }, { "key": "es_audio", "audioStream": { "codec": "aac", "channelCount": 2, "bitrateBps": 160000 } }, { "key": "webvtt-english", "textStream": { "codec": "webvtt", "display_name": "English", "language_code": "en-US", "mapping": [ { "input_cea_channel": "CC1" } ] } } ], "muxStreams": [ { "key": "mux_video_fmp4", "container": "fmp4", "elementaryStreams": [ "es_video" ], "segmentSettings": { "segmentDuration": "2s" } }, { "key": "mux_audio_fmp4", "container": "fmp4", "elementaryStreams": [ "es_audio" ], "segmentSettings": { "segmentDuration": "2s" } }, { "key": "mux_video_ts", "container": "ts", "elementaryStreams": [ "es_video", "es_audio" ], "segmentSettings": { "segmentDuration": "2s" } }, { "key": "vtt_english", "container": "vtt", "elementaryStreams": [ "webvtt-english" ], "segmentSettings": { "segmentDuration": "2s" } } ], "manifests": [ { "key": "manifest_dash", "fileName": "main.mpd", "type": "DASH", "muxStreams": [ "mux_video_fmp4", "mux_audio_fmp4", "vtt_english" ], "maxSegmentCount": 5 }, { "key": "manifest_hls", "fileName": "main.m3u8", "type": "HLS", "muxStreams": [ "mux_video_ts", "vtt_english" ], "maxSegmentCount": 5 } ] }
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような JSON レスポンスが返されます。
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata", "createTime": CREATE_TIME, "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID", "verb": "create", "requestedCancellation": false, "apiVersion": "v1" }, "done": false }
チャネルを取得する
新しいオペレーション ID を使用して、チャネル作成オペレーションの結果を確認できます。
チャネルを作成したら、projects.locations.channels.get
メソッドを使用してチャネルの状態をクエリします。
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_NUMBER
: Google Cloud プロジェクト番号。これは、IAM 設定ページの [プロジェクト番号] フィールドにあります。LOCATION
: チャネルがあるロケーション。サポートされているリージョンのいずれかを使用します。ロケーションを表示us-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: チャネルのユーザー定義の識別子。
リクエストを送信するには、次のいずれかのオプションを開きます。
次のような JSON レスポンスが返されます。
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID", "createTime": CREATE_TIME, "updateTime": UPDATE_TIME, "inputAttachments": [ { "key": "INPUT_ID", "input": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID" } ], "activeInput": "INPUT_ID", "output": { "uri": "gs://BUCKET_NAME" }, "elementaryStreams": [ { "key": "es_video", "videoStream": { "h264": { "profile": "high", "widthPixels": 1280, "heightPixels": 720, "bitrateBps": 3000000, "frameRate": 30 } } }, { "key": "es_audio", "audioStream": { "codec": "aac", "channelCount": 2, "bitrateBps": 160000 } }, { "key": "webvtt-english", "textStream": { "codec": "webvtt", "display_name": "English", "language_code": "en-US", "mapping": [ { "input_cea_channel": "CC1" } ] } } ], "muxStreams": [ { "key": "mux_video_fmp4", "container": "fmp4", "elementaryStreams": [ "es_video" ], "segmentSettings": { "segmentDuration": "2s" } }, { "key": "mux_audio_fmp4", "container": "fmp4", "elementaryStreams": [ "es_audio" ], "segmentSettings": { "segmentDuration": "2s" } }, { "key": "mux_video_ts", "container": "ts", "elementaryStreams": [ "es_video", "es_audio" ], "segmentSettings": { "segmentDuration": "2s" } }, { "key": "vtt_english", "container": "vtt", "elementaryStreams": [ "webvtt-english" ], "segmentSettings": { "segmentDuration": "2s" } } ], "manifests": [ { "key": "manifest_dash", "fileName": "main.mpd", "type": "DASH", "muxStreams": [ "mux_video_fmp4", "mux_audio_fmp4", "vtt_english" ], "maxSegmentCount": 5 }, { "key": "manifest_hls", "fileName": "main.m3u8", "type": "HLS", "muxStreams": [ "mux_video_ts", "vtt_english" ], "maxSegmentCount": 5 } ], "streamingState": "STOPPED" }
完全なレスポンスには、次のフィールドが含まれます。
{
...
"streamingState": "STOPPED"
...
}
このレスポンスは、チャネルを開始できるようになったことを示します。
チャネルを開始する
projects.locations.channels.start
メソッドを使用してチャネルを開始します。入力ストリームを受け入れるか、出力ストリームを生成する前に、チャネルを開始する必要があります。
リージョン内で最初のチャネルを開始するには 10 分ほどかかります。
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_NUMBER
: Google Cloud プロジェクト番号。これは、IAM 設定ページの [プロジェクト番号] フィールドにあります。LOCATION
: チャネルがあるロケーション。サポートされているリージョンのいずれかを使用します。ロケーションを表示us-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: チャネルのユーザー定義の識別子。
リクエストを送信するには、次のいずれかのオプションを開きます。
次のような JSON レスポンスが返されます。
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata", "createTime": CREATE_TIME, "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID", "verb": "start", "requestedCancellation": false, "apiVersion": "v1" }, "done": false }
チャネルが開始されたかどうかを確認するには、以前と同様の方法でチャネル情報を取得します。レスポンスには以下が含まれます。
{
...
"streamingState": "AWAITING_INPUT"
...
}
入力ストリームを送信する
チャネルの準備が整ったので、入力エンドポイントに入力ストリームを送信して、ライブ ストリームを生成します。字幕付きの MP4(またはその他の TEST_VOD_FILE)をダウンロードし、ffmpeg
を使用して入力エンドポイントに送信できます。
新しいターミナル ウィンドウを開きます。[結果を確認する] セクションの INPUT_STREAM_URI を使用して、次のコマンドを実行します。
ffmpeg -re -stream_loop -1 -i "TEST_VOD_FILE" \
-c:v copy -c:a aac -strict 2 -f "flv" "INPUT_STREAM_URI"
生成されたライブ ストリームを再生する
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://BUCKET_NAME --cors-file=JSON_FILE_NAME.json
- 次の内容を含む JSON ファイルを作成します。
- Cloud Storage バケットで、生成された
main.m3u8
ファイルを見つけます。ファイルの [公開アクセス] 列で [URL をコピー] をクリックします。 - オンライン ライブ ストリーム プレーヤーの Shaka Player に移動します。
- 上部のナビゲーション バーにある [CUSTOM CONTENT](カスタム コンテンツ)をクリックします。
- [+] ボタンをクリックします。
ファイルの公開 URL を [Manifest URL] ボックスに貼り付けます。
[Name] ボックスに名前を入力します。
[保存] をクリックします。
[Play] をクリックします。
ライブ ストリームが再生されます。Shaka Player UI で字幕を有効にする必要がある場合があります。
クリーンアップ
チャネルを停止する
projects.locations.channels.stop
メソッドを使用してチャネルを停止します。チャネルは削除する前に停止する必要があります。
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_NUMBER
: Google Cloud プロジェクト番号。これは、IAM 設定ページの [プロジェクト番号] フィールドにあります。LOCATION
: チャネルがあるロケーション。サポートされているリージョンのいずれかを使用します。ロケーションを表示us-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: チャネルのユーザー定義の識別子。
リクエストを送信するには、次のいずれかのオプションを開きます。
次のような JSON レスポンスが返されます。
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata", "createTime": CREATE_TIME, "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID", "verb": "stop", "requestedCancellation": false, "apiVersion": "v1" }, "done": false }
入力ストリームを停止する
ffmpeg
を使用して入力ストリームを送信した場合、チャネルを停止すると接続が自動的に切断されます。
チャネルを削除する
projects.locations.channels.delete
メソッドを使用してチャネルを削除します。チャネルで使用されている入力エンドポイントを削除する前に、そのチャネルを削除する必要があります。
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_NUMBER
: Google Cloud プロジェクト番号。これは、IAM 設定ページの [プロジェクト番号] フィールドにあります。LOCATION
: チャネルがあるロケーション。サポートされているリージョンのいずれかを使用します。ロケーションを表示us-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: チャネルのユーザー定義の識別子。
リクエストを送信するには、次のいずれかのオプションを開きます。
次のような JSON レスポンスが返されます。
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata", "createTime": CREATE_TIME, "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID", "verb": "delete", "requestedCancellation": false, "apiVersion": "v1" }, "done": false }
入力エンドポイントを削除する
projects.locations.inputs.delete
メソッドを使用して、入力エンドポイントを削除します。
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_NUMBER
: Google Cloud プロジェクト番号。これは、IAM 設定ページの [プロジェクト番号] フィールドにあります。LOCATION
: 入力エンドポイントが配置されているロケーション。サポートされているリージョンのいずれかを使用します。ロケーションを表示us-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
INPUT_ID
: 入力エンドポイントのユーザー定義の識別子
リクエストを送信するには、次のいずれかのオプションを開きます。
次のような JSON レスポンスが返されます。
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata", "createTime": CREATE_TIME, "target": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID", "verb": "delete", "requestedCancellation": false, "apiVersion": "v1" }, "done": false }
Cloud Storage バケットを削除する
Google Cloud コンソールで、Cloud Storage の [ブラウザ] ページに移動します。
作成したバケットの横にあるチェックボックスをオンにします。
[削除] をクリックします。
表示されるダイアログ ウィンドウで、[削除] をクリックしてバケットとその内容を完全に削除します。