このページでは、Live Stream API を使用してライブ ストリームからデジタル ビデオ レコーダー(DVR)セッションを作成する方法について説明します。DVR セッションは、ライブ配信中と終了後に表示できます。
DVR セッションとチャンネル クリップの違い
DVR セッションはチャンネル クリップ(VOD クリップ)に似ていますが、次の点で異なります。
- DVR セッション:
- API は、ライブ配信セグメントと同じ場所に DVR マニフェストを保存するため、Cloud Storage に追加でコピーする必要はありません。DVR マニフェストはライブ ストリーム マニフェストに似ていますが、長くなります。保持期間が終了すると、マニフェストはセグメント ファイルとともに削除されます。
- 過去、現在、未来のコンテンツの DVR セッションを作成できます。たとえば、DVR セッションはライブ配信の後に続くことができます。また、DVR セッションをスケジュールして、後で開始および停止することもできます。
- DVR セッションの一般的なユースケースは、ライブ ストリーミング イベントの DVR 機能をサポートすることです。たとえば、視聴者はライブ配信の開始から 1 時間後にライブ配信に参加して、1 時間遅れでコンテンツを視聴できます(または一部をスキップできます)。
- チャンネル クリップ:
- Live Stream API は、クリップ マニフェストと関連するセグメント ファイルをユーザー指定のディレクトリにコピーするため、保持期間が切れても削除されません。クリップを完全に制御できます。
- クリップできるのは過去のコンテンツのみです。ライブクリップと今後のクリップのスケジュール設定はサポートされていません。
- クリップの一般的なユースケースは、ライブ配信をアーカイブして、ライブ配信を VOD ファイルとして無期限に利用できるようにすることです。
チャンネル クリップの詳細については、ライブ ストリームから VOD クリップを作成するをご覧ください。
Google Cloud プロジェクトと認証を設定する
Google Cloud プロジェクトと認証情報を作成していない場合は、始める前にをご覧ください。入力エンドポイントを作成する
入力エンドポイントを作成するには、projects.locations.inputs.create メソッドを使用します。
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_NUMBER: プロジェクト番号。IAM 設定ページの [プロジェクト番号] フィールドにあります。 Google CloudLOCATION: 入力エンドポイントを作成するロケーション。サポートされているリージョンのいずれかを使用します。ロケーションを表示us-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
INPUT_ID: 作成する新しい入力エンドポイントのユーザー定義の識別子(入力ストリームの送信先)。この値は 1~63 文字で、先頭と末尾は[a-z0-9]で、文字の間にダッシュ(-)を含めることができます。たとえば、my-inputです。
リクエストを送信するには、次のいずれかのオプションを開きます。
次のような 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
}
このコマンドは、リクエストの進行状況を追跡するために使用できる長時間実行オペレーション(LRO)を作成します。詳しくは、長時間実行オペレーションの管理をご覧ください。
# 入力エンドポイントの詳細
入力エンドポイントの詳細を取得するには、projects.locations.inputs.get メソッドを使用します。
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_NUMBER: プロジェクト番号。IAM 設定ページの [プロジェクト番号] フィールドにあります。 Google CloudLOCATION: 入力エンドポイントが配置されているロケーション。サポートされているリージョンのいずれかを使用します。ロケーションを表示us-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
INPUT_ID: 入力エンドポイントのユーザー定義の識別子
リクエストを送信するには、次のいずれかのオプションを開きます。
次のような JSON レスポンスが返されます。
{
"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 メソッドを使用します。次のサンプルでは、HLS ライブ ストリームを生成するチャネルを作成します。ライブ ストリームは、単一の高解像度(1280x720)のレンディションで構成されます。
DVR セッションの作成を有効にするには、チャンネル構成に retentionConfig オブジェクトを追加します。
"retentionConfig": {
"retentionWindowDuration": {
"seconds": 86400
}
},
ライブ配信チャンネルで保持が有効になっている場合、ライブ配信セグメントとマニフェストは DVR セッションを作成するために保持されます。retentionWindowDuration オブジェクトには、Cloud Storage にアップロードされた後、ライブ配信出力を保存する時間を指定します。保持期間は、Cloud Storage でセグメントが作成された時点から開始されます。
保持期間は 30 日間に制限されています。保持期間が経過すると、セグメント ファイル、ライブ配信マニフェスト、DVR マニフェストは Cloud Storage から自動的に削除されます。削除されたセグメントを使用して DVR セッションを作成することはできません。削除プロセスは非同期で、完了までに最大 24 時間かかることがあります。
マニフェストのキーを指定して、DVR セッションの作成を有効にします。この鍵は、実際にセッションを作成するときに参照します。HLS マニフェストのみがサポートされます。
"manifests": [
{
...
"key": "manifest_hls"
}
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_NUMBER: プロジェクト番号。IAM 設定ページの [プロジェクト番号] フィールドにあります。 Google CloudLOCATION: チャネルを作成するロケーション。サポートされているリージョンのいずれかを使用します。ロケーションを表示us-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
CHANNEL_ID: 作成するチャネルのユーザー定義の識別子。この値は 1~63 文字で、先頭と末尾は[a-z0-9]で、文字の間にダッシュ(-)を含めることができます。INPUT_ID: 入力エンドポイントのユーザー定義の識別子BUCKET_NAME: ライブ ストリームのマニフェスト ファイルとセグメント ファイルを保持するために作成した Cloud Storage バケットの名前
リクエストを送信するには、次のいずれかのオプションを開きます。
次のような 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
}
このコマンドは、リクエストの進行状況を追跡するために使用できる長時間実行オペレーション(LRO)を作成します。詳しくは、長時間実行オペレーションの管理をご覧ください。
チャネルを開始する
チャネルを開始するには、projects.locations.channels.start メソッドを使用します。
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_NUMBER: プロジェクト番号。IAM 設定ページの [プロジェクト番号] フィールドにあります。 Google CloudLOCATION: チャネルがあるロケーション。サポートされているリージョンのいずれかを使用します。ロケーションを表示us-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-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
}
このコマンドは、リクエストの進行状況を追跡するために使用できる長時間実行オペレーション(LRO)を作成します。詳しくは、長時間実行オペレーションの管理をご覧ください。
入力テスト ストリームを送信する
新しいターミナル ウィンドウを開きます。入力エンドポイントの詳細を取得するセクションの INPUT_STREAM_URI を使用して、次のコマンドを実行します。
ffmpeg -re -f lavfi -i "testsrc=size=1280x720 [out0]; sine=frequency=500 [out1]" \
-acodec aac -vcodec h264 -f flv INPUT_STREAM_URI
DVR セッションを作成する
DVR セッションを作成するには、projects.locations.channels.dvrSessions.create メソッドを使用します。
dvrManifests 配列の manifestKey フィールドを使用して、コンテンツを保存するマニフェストを指定します。このページのチャネル構成の例では、このキーは manifest_hls に設定されています。
ライブ配信の複数の時間セクションを 1 つの DVR セッションに結合するには、dvrWindows 配列に timeInterval オブジェクトを追加します。
"dvrManifests": [
{
"manifestKey": "manifest_hls"
}
],
"dvrWindows": [
{
"timeInterval": {
"startTime": "2022-07-08T23:03:20.000Z",
"endTime": "2022-07-08T23:04:20.000Z"
}
},
{
"timeInterval": {
"startTime": "2022-07-08T23:05:20.000Z",
"endTime": "2022-07-08T23:06:20.000Z"
}
}
]
次の点にご注意ください。
- 各 DVR セッションには、
dvrWindowsに少なくとも 1 つのtimeIntervalを含める必要があります。 dvrManifests.manifestKeyフィールドは、DVR セッションの親チャンネルで定義された HLS マニフェストを参照する必要があります。DVR セッション作成リクエストが成功すると、生成された DVR マニフェストの URI がdvrManifests.outputUriフィールドに返されます。この URI は、チャネルのoutputUriフィールドで指定されたパスにあります。dvrManifests配列は、リクエストごとに 1 つのマニフェストのみをサポートします。同じ DVR ウィンドウに複数のマニフェストを生成する場合は、マニフェストを複数の DVR セッションに分割する必要があります。timeIntervalオブジェクトのセットは重複せず、時系列順に並べる必要があります。startTimeは、すべてのtimeIntervalでendTimeより前にある必要があります。startTimeとendTimeは、ライブ配信のタイムラインを指します。マニフェストで埋め込みタイムコードが有効になっている場合、このタイムラインは入力ストリームで提供される埋め込みタイムコードに基づいており、壁掛け時計とは異なる場合があります。- DVR ウィンドウの合計時間は最大 24 時間です。
dvrWindowsの最後のtimeIntervalのendTimeは空白のままにできます。この場合、DVR セッションの長さ(合計 24 時間)を最大化するようにendTimeが自動的に計算されます。- DVR 時間枠は、将来の期間を含め、任意の期間を対象にできます。ただし、
dvrWindowsを使用して将来の時点まで延長する DVR セッションの数は 1 つに制限されます。 - すべての DVR ウィンドウが過去に限定されている DVR セッションの数に制限はありません。
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_NUMBER: プロジェクト番号。IAM 設定ページの [プロジェクト番号] フィールドにあります。 Google CloudLOCATION: チャネルがあるロケーション。サポートされているリージョンのいずれかを使用します。ロケーションを表示us-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
CHANNEL_ID: チャネルのユーザー定義の識別子。DVR_SESSION_ID: DVR セッションのユーザー定義の識別子INTERVAL_START_TIME: RFC3339 UTC「Zulu」形式のタイムスタンプを使用した、元のライブ配信マニフェストのマークイン Unix エポック時間。(例:2014-10-02T15:01:23Z)。INTERVAL_END_TIME: RFC3339 UTC「Zulu」形式のタイムスタンプを使用した、元のライブ配信マニフェストのマークアウト Unix エポック時間。(例:2014-10-02T15:01:23Z)。
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような 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/dvrSessions/DVR_SESSION_ID",
"verb": "create",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": false
}
このコマンドは、リクエストの進行状況を追跡するために使用できる長時間実行オペレーション(LRO)を作成します。詳しくは、長時間実行オペレーションの管理をご覧ください。
DVR セッションを取得する
DVR セッションを取得するには、projects.locations.channels.dvrSessions.get メソッドを使用します。
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_NUMBER: プロジェクト番号。IAM 設定ページの [プロジェクト番号] フィールドにあります。 Google CloudLOCATION: チャネルがあるロケーション。サポートされているリージョンのいずれかを使用します。ロケーションを表示us-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
CHANNEL_ID: チャネルのユーザー定義の識別子。DVR_SESSION_ID: DVR セッションのユーザー定義の識別子
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような JSON レスポンスが返されます。
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID/dvrSessions/DVR_SESSION_ID",
"createTime": CREATE_TIME,
"startTime": START_TIME,
"updateTime": UPDATE_TIME,
"state": "SUCCEEDED",
"dvrManifests": [
{
"manifestKey": "manifest_hls",
"outputUri": "gs://BUCKET_NAME/dvr/DVR_SESSION_ID/main.m3u8"
}
],
"dvrWindows": [
{
"timeInterval": {
"startTime": "INTERVAL_START_TIME",
"endTime": "INTERVAL_END_TIME"
}
}
]
}
レスポンスには、セッションの状態を示す state フィールドが含まれている必要があります。
{
...
"state": "PENDING" // DVR session is waiting to be processed (for example, it is waiting for the channel to start)
...
}
状態とその説明の一覧については、state のリファレンス ドキュメントをご覧ください。
バケットの内容を確認する
DVR セッションの dvrManifests.outputUri フィールドで指定されているように、Cloud Storage バケットを開きます。次のファイルとディレクトリが含まれていることを確認します。
- チャンネル構成で指定された
manifests.fileNameと同じ名前の DVR セッションのトップレベル マニフェスト(例:main.m3u8)。このマニフェストは、オンライン メディア プレーヤーを使用して再生できます。 - チャネルで指定された
muxStreams.keyごとにサブディレクトリ(mux_video_tsなど)。各サブディレクトリには、DVR セッションのプレイリスト(index-1.m3u8など)が含まれています。
DVR セッションを再生する
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 バケットで、生成されたファイルを探します。ファイルの [公開アクセス] 列で [URL をコピー] をクリックします。
- オンライン ライブ ストリーム プレーヤーの Shaka Player に移動します。
- 上部のナビゲーション バーにある [CUSTOM CONTENT](カスタム コンテンツ)をクリックします。
- [+] ボタンをクリックします。
ファイルの公開 URL を [Manifest URL] ボックスに貼り付けます。

[Name] ボックスに名前を入力します。
[保存] をクリックします。
[Play] をクリックします。
ライブ ストリームとしてテストパターンが再生されます。
ミッドロール挿入点イベント
ライブ配信にミッドロール挿入点イベントを作成した場合、DVR セッションには、ライブ配信に表示される広告セグメントが含まれます。