ライブ ストリームから VOD クリップを作成する

このページでは、Live Stream API を使用してライブ ストリームからビデオ オンデマンド(VOD)クリップを作成する方法について説明します。VOD クリップは、ライブ ストリームから保存された HLS マニフェスト ファイルとセグメント ファイルで構成されています。HLS マニフェストのみがサポートされています。

Google Cloud プロジェクトと認証の設定

Google Cloud プロジェクトと認証情報を作成していない場合は、始める前にをご覧ください。

入力エンドポイントを作成する

入力エンドポイントを作成するには、projects.locations.inputs.create メソッドを使用します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_NUMBER: IAM 設定ページの [プロジェクト番号] フィールドにある Google Cloud プロジェクト番号
  • LOCATION: 入力エンドポイントを作成するロケーション。サポートされているリージョンのいずれかを使用します。
    ロケーションを表示
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-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 Cloud プロジェクト番号
  • LOCATION: 入力エンドポイントが配置されているロケーション。サポートされているリージョンのいずれかを使用します。
    ロケーションを表示
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-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)のレンディションで構成されます。

VOD クリップの作成を有効にするには、チャネル構成に retentionConfig オブジェクトを追加します。

"retentionConfig": {
  "retentionWindowDuration": {
      "seconds": 86400
    }
},

ライブ配信チャンネルで保持が有効になっている場合、セグメント ファイルとマニフェスト ファイルは VOD クリップを作成するために保持されます。retentionWindowDuration オブジェクトには、Cloud Storage にアップロードされた後、ライブ配信の出力を保存する時間を指定します。保持期間は、Cloud Storage でセグメントが作成された時点から始まります。保持期間は 30 日間に制限されています。保持期間が経過すると、セグメントは Cloud Storage から自動的に削除されます。削除されたセグメントを使用して VOD クリップを作成することはできません。削除プロセスは非同期で、完了までに 24 時間ほどかかることがあります。

VOD クリップの作成を有効にするには、マニフェストのキーを指定します。実際にクリップを作成するときに、このキーを参照します。HLS マニフェストのみがサポートされています。

"manifests": [
{
  ...
  "key": "manifest_hls"
}

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_NUMBER: IAM 設定ページの [プロジェクト番号] フィールドにある Google Cloud プロジェクト番号
  • LOCATION: チャネルを作成するロケーション。サポートされているリージョンのいずれかを使用します。
    ロケーションを表示
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-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 Cloud プロジェクト番号
  • LOCATION: チャネルがあるロケーション。サポートされているリージョンのいずれかを使用します。
    ロケーションを表示
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • 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
}

このコマンドは、リクエストの進行状況を追跡するために使用できる長時間実行オペレーション(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

VOD クリップを作成する

VOD クリップを作成するには、projects.locations.channels.clips.create メソッドを使用します。

outputUri フィールドを使用して、Cloud Storage にクリップとクリップ マニフェスト ファイルを保存する場所を指定します。ライブ配信マニフェスト用に作成したバケットと同じバケットを使用することも、別のバケットを使用することもできます。バケット名にディレクトリ名を追加することもできます(例: my-bucket/vod-clip)。

clipManifests 配列の manifestKey フィールドを使用して、クリップを保存するマニフェストを指定します。このページのチャネル構成の例では、このキーは manifest_hls に設定されています。

slices 配列に timeSlice オブジェクトを追加すると、ライブ配信の複数のタイムセクションを 1 つのクリップにまとめることができます。

"outputUri": "gs://my-bucket",
"clipManifests":[
  {
    "manifestKey": "manifest_hls"
  }
],
"slices":[
  {
    "timeSlice": {
      "markinTime": "2022-07-08T23:03:20.000Z",
      "markoutTime": "2022-07-08T23:04:20.000Z"
    }
  },
  {
    "timeSlice": {
      "markinTime": "2022-07-08T23:05:20.000Z",
      "markoutTime": "2022-07-08T23:06:20.000Z"
    }
  }
]

次の点にご注意ください。

  • 各クリップには、slicestimeSlice が少なくとも 1 つ含まれている必要があります。
  • clipManifests.manifestKey フィールドは、クリップの親チャンネルで定義された HLS マニフェストを参照する必要があります。クリップジョブの作成リクエストが成功すると、生成されたクリップ マニフェストの URI が clipManifests.outputUri フィールドに返されます。この URI は、クリップの outputUri フィールドで指定されたパスにあります。
  • clipManifests 配列は、リクエストごとに 1 つのマニフェストのみをサポートします。同じクリップジョブに対して複数のマニフェストを生成する場合は、マニフェストを複数のクリップジョブ リクエストに分割する必要があります。
  • クリップ スライスは均質である必要があります。すべての要素は timeSlice 型である必要があります。
  • timeSlice オブジェクトのセットは重複せず、時系列順に並べられている必要があります。markinTime は、すべての timeSlicemarkoutTime より前である必要があります。
  • クリップの最新の markinTime がチャンネルの開始時間または保持期間の開始時間よりも前の場合、マークイン時間は 2 つの時間のうち遅い方に設定されます。
  • クリップの最新の markoutTime がチャンネルの停止時間より後の場合は、チャンネルの停止時間に設定されます。クリップの最新の markoutTime が現在のシステムの壁時計時間より後の場合、API がクリッピング タスクを実際に開始した時刻に設定されます。
  • クリップの最大時間は 24 時間です。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_NUMBER: IAM 設定ページの [プロジェクト番号] フィールドにある Google Cloud プロジェクト番号
  • LOCATION: チャネルがあるロケーション。サポートされているリージョンのいずれかを使用します。
    ロケーションを表示
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: チャネルのユーザー定義の識別子。
  • CLIP_ID: VOD クリップのユーザー定義の識別子。
  • MARK_IN_TIME: RFC3339 UTC「Zulu」形式のタイムスタンプを使用した、元のライブ配信マニフェストのマークイン Unix エポック時間。(例: 2014-10-02T15:01:23Z)。
  • MARK_OUT_TIME: 元のライブ配信マニフェストのマークアウトの Unix エポック時間。RFC3339 UTC「Zulu」形式のタイムスタンプを使用します(例: 2014-10-02T15:01:23Z)。
  • BUCKET_NAME: VOD クリップのマニフェスト ファイルとセグメント ファイルを保持するために作成した Cloud Storage バケットの名前。ライブ ストリームのマニフェスト用に作成したバケットと同じバケットを使用するか、別のバケットを使用できます。また、バケット名にディレクトリ名を追加することもできます(my-bucket/vod-clip など)。

リクエストを送信するには、次のいずれかのオプションを開きます。

次のような 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/clips/CLIP_ID",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

このコマンドは、リクエストの進行状況を追跡するために使用できる長時間実行オペレーション(LRO)を作成します。詳しくは、長時間実行オペレーションの管理をご覧ください。

VOD クリップを取得する

VOD クリップを取得するには、projects.locations.channels.clips.get メソッドを使用します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_NUMBER: IAM 設定ページの [プロジェクト番号] フィールドにある Google Cloud プロジェクト番号
  • LOCATION: チャネルがあるロケーション。サポートされているリージョンのいずれかを使用します。
    ロケーションを表示
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: チャネルのユーザー定義の識別子。
  • CLIP_ID: VOD クリップのユーザー定義の識別子。

リクエストを送信するには、次のいずれかのオプションを開きます。

次のような JSON レスポンスが返されます。

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID/clips/CLIP_ID",
  "createTime": CREATE_TIME,
  "startTime": START_TIME,
  "updateTime": UPDATE_TIME,
  "state": "SUCCEEDED",
  "outputUri": "gs://BUCKET_NAME",
  "slices": [
    {
      "timeSlice": {
        "markinTime": "MARK_IN_TIME",
        "markoutTime": "MARK_OUT_TIME"
      }
    }
  ],
  "features": {},
  "clipManifests": [
    {
      "manifestKey": "manifest_hls",
      "outputUri": "gs://BUCKET_NAME/main.m3u8"
    }
  ]
}

生成されたマニフェストは、clipManifests.outputUri フィールドで指定された URI にあります。マニフェストのファイル名は、親チャネルの manifests.fileName フィールド値と同じです。

レスポンスには以下が含まれます。

{
  ...
  "state": "SUCCEEDED"
  ...
}

projects.locations.channels.clips.get メソッドを使用すると、チャンネルごとに最新の 1,000 件のクリップジョブ レコードのみが使用できます。上限を超えたクリップジョブ レコードは削除されます。生成されたクリップ ファイルは outputUri で指定する必要があります。Live Stream API はこれらのファイルを Cloud Storage から削除しません。

バケットの内容を確認する

クリップの outputUri フィールドで指定されているように、Cloud Storage バケットを開きます。次のファイルとディレクトリが含まれていることを確認します。

  • チャンネル構成で指定された manifests.fileName と同じ名前のクリップのトップレベル マニフェスト(main.m3u8 など)。このマニフェストは、オンライン メディア プレーヤーを使用して再生できます。
  • チャネルで指定された muxStreams.key ごとにディレクトリ(例: mux_video_ts
    • クリップの再生リスト(例: index-1.m3u8
    • YYYYMMDDTHHMMSSZ の形式(20220708T203309Z/ など)で名前が付けられたディレクトリ。このディレクトリには VOD クリップのセグメントが格納されます。
      • VOD クリップを構成する複数のセグメント segment-number.ts ファイル

VOD クリップを再生する

Shaka Player で生成されたメディア ファイルを再生するには、次の手順に従います。

  1. 作成した Cloud Storage バケットを一般公開します
  2. Cloud Storage バケットでクロスオリジン リソース シェアリング(CORS)を有効にするには、次のようにします。
    1. 次の内容を含む JSON ファイルを作成します。
      [
        {
          "origin": ["https://shaka-player-demo.appspot.com/"],
          "responseHeader": ["Content-Type", "Range"],
          "method": ["GET", "HEAD"],
          "maxAgeSeconds": 3600
        }
      ]
    2. JSON_FILE_NAME を前の手順で作成した JSON ファイルの名前に置き換えてから、次のコマンドを実行します。
      gcloud storage buckets update gs://BUCKET_NAME --cors-file=JSON_FILE_NAME.json
  3. Cloud Storage バケットで、生成されたファイルを探します。ファイルの [公開アクセス] 列で [URL をコピー] をクリックします。
  4. オンライン ライブ ストリーム プレーヤーの Shaka Player に移動します。
  5. 上部のナビゲーション バーにある [CUSTOM CONTENT](カスタム コンテンツ)をクリックします。
  6. [+] ボタンをクリックします。
  7. ファイルの公開 URL を [Manifest URL] ボックスに貼り付けます。

  8. [Name] ボックスに名前を入力します。

  9. [Save] をクリックします。

  10. [Play] をクリックします。

ライブ ストリームとしてテストパターンが再生されます。

テストパターン動画

ミッドロール挿入点イベントとスレート イベント

ライブ配信にミッドロール挿入点イベントを作成した場合、VOD クリップには広告は含まれません。API は、広告ブレークポイントが次のタグに置き換えられた再生リストを生成します。

#EXT-X-CUE-OUT: AD_BREAK_DURATION
#EXT-X-CUE-IN

VOD クリップの先頭または末尾に表示されるスレートは自動的に削除されます。ストリーム内に表示されるスレートは、ライブ配信コンテンツに囲まれて生成された VOD クリップに保持されます。