

# IVS 録画 \$1 リアルタイムストリーミング
<a name="rt-recording"></a>

IVS Real-Time Streaming には 2 つの録画オプションがあります。
+ 個々の参加者の録画では、各パブリッシャーのメディアは別々のファイルに記録されます。
+ 対照的に、composite recording は、すべてのパブリッシャーのメディアを 1 つのビューに結合し、1 つのファイルに録画します。

個々の参加者の録画には Amazon IVS の追加料金はかかりませんが、composite recording には、エンコードされたビデオの時間単位の料金が発生します。どちらの録画オプションにも、標準の S3 ストレージとリクエストコストが発生します。詳細については、「[Amazon IVS の料金](https://aws.amazon.com/ivs/pricing/)」を参照してください。

よりカスタマイズ可能なソリューションについては、オープンソースの [IVSStageSaver](https://github.com/aws-samples/amazon-ivs-stage-recorder) プロジェクトを独自のセルフホスト録画サービスの基盤として使用することを検討してください。

## 個々の参加者の録画
<a name="ind-par-rec"></a>

このオプションは、1 つのパブリッシャーを持つライブストリームや、特にモデレーション目的で、各パブリッシャーの個別の録画が必要な場合に最適です。詳細については、「[個々の参加者の録画](rt-individual-participant-recording.md)」を参照してください。

![\[個々の参加者の録画を使用して、各パブリッシャーのメディアを個別のファイルに録画します。\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/images/Individual_Participant_Recording.png)


## Composite Recording
<a name="comp-rec"></a>

このオプションは、複数のパブリッシャーのメディアを 1 つのビューに結合し、1 つのファイルに記録するため、ビデオオンデマンドエクスペリエンスに最適です。詳細については、「[Composite Recording](rt-composite-recording.md)」を参照してください。

![\[サーバーサイドコンポジションを使用して S3 バケットにステージを録画します。\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/images/Composite_Recording.png)


## サムネイル
<a name="thumbnails"></a>

IVS リアルタイムストリーミングのサムネイル録画は、個々の参加者の録画と Composite Recording (複数の参加者) の両方に設定できます。サムネイル記録を有効または無効にしてサムネイルが生成される間隔を調整するには:
+ 個々の参加者の録画の場合、 `thumbnailConfiguration` プロパティを使用します。
+ Composite Recording の場合、`thumbnailConfigurations` プロパティを使用します。

サムネイルの間隔は 1～86400 秒 (24 時間) です。デフォルトでは、サムネイルの録画は無効になっています。詳細については、「[Amazon IVS Real-Time Streaming API リファレンス](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/Welcome.html)」を参照してください。

サムネイル設定には `storage` フィールドが含まれています。これは、`SEQUENTIAL` および `LATEST` に設定できます。`storage` フィールドは、サムネイルの S3 ストレージ動作を決定します。
+ `SEQUENTIAL` では、すべてのサムネイルが連続して保存されます。これがデフォルトです。
+ `LATEST` では、最新のサムネイルのみが保存され、前のサムネイルが上書きされます。

`SEQUENTIAL` と `LATEST` の両方を指定すると、サムネイルは 2 つの個別の S3 パス (シーケンシャルアーカイブ用と最新のサムネイル用) に書き込まれます。

# IVS 個々の参加者の録画 \$1 リアルタイムストリーミング
<a name="rt-individual-participant-recording"></a>

このドキュメントでは、IVS Real-Time Streaming で個々の参加者の録画を使用する方法について説明します。

標準の S3 ストレージとリクエストのコストが適用されます。サムネイルでは追加の IVS 料金は発生しません。詳細については、「[Amazon IVS の料金](https://aws.amazon.com/ivs/pricing/)」を参照してください。

## 序章
<a name="ind-part-rec-introduction"></a>

個々の参加者の録画により、IVS Real-Time Streaming のお客様は IVS ステージパブリッシャーを個別に S3 バケットに録画できます。ステージで個々の参加者の録画が有効になっている場合、パブリッシャーコンテンツは、ステージへの公開が開始されると録画されます。

**注:** すべてのステージ参加者を 1 つのビデオに混在させる必要がある場合は、composite recording 機能が適しています。IVS リアルタイムストリーミングコンテンツの録画の概要については、「[録画](rt-recording.md)」を参照してください。

![\[個々の参加者の録画を使用して、各パブリッシャーのメディアを個別のファイルに録画します。\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/images/Individual_Participant_Recording.png)


## ワークフロー
<a name="ind-part-rec-workflow"></a>

![\[個々の参加者の録画を使用して、各パブリッシャーのメディアを個別のファイルに記録するためのワークフロー。\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/images/Workflow_Participant_Recording.png)


### 1. S3 バケットの作成
<a name="ind-part-rec-create-s3-bucket"></a>

VOD を書き込むには S3 バケットが必要です。詳細については、[バケットの作成方法](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html)に関する S3 ドキュメントを参照してください。個々の参加者の録画には、IVS ステージと同じ AWS リージョンに S3 バケットを作成する必要があります。

**重要**: 既存の S3 バケットを使用する場合:
+ [**オブジェクト所有権**] の設定は [**バケット所有者に強制する**] か、[**バケット所有者を優先する**] にする必要があります。
+ **[デフォルトの暗号化]** 設定は、**[Amazon S3 マネージドキーを用いたサーバー側の暗号化 (SSE-S3)]** である必要があります。

詳細については、[オブジェクトの所有権の制御](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)と[暗号化によるデータの保護](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingEncryption.html)に関する S3 ドキュメントを参照してください。

### 2. StorageConfiguration オブジェクトを作成する
<a name="ind-part-rec-create-storageconfig-object"></a>

バケットを作成したら、IVS Real-Time Streaming API を呼び出して [StorageConfiguration オブジェクトを作成](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_CreateStorageConfiguration.html)します。ストレージ設定が正常に作成されると、IVS は提供された S3 バケットに書き込むアクセス許可を持ちます。この StorageConfiguration オブジェクトは、複数のステージで再利用できます。

### 3. 属性を使用してステージ参加者トークンを作成します。
<a name="ind-part-rec-create-stage-with-part-tokens"></a>

次に、個々の参加者の録画を有効にして (AutoParticipantRecordingConfiguration オブジェクトを設定して)、各パブリッシャーの参加者トークンと [IVS ステージを作成](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_CreateStage.html)する必要があります。

以下のリクエストは、2 つの参加者トークンと個々の参加者記録が有効になっているステージを作成します。

```
POST /CreateStage HTTP/1.1
Content-type: application/json

{
   "autoParticipantRecordingConfiguration": { 
      "mediaTypes": ["AUDIO_VIDEO"],
      "storageConfigurationArn": "arn:aws:ivs:us-west-2:123456789012:storage-configuration/AbCdef1G2hij",
      "thumbnailConfiguration": {
         "recordingMode": "INTERVAL",
         "storage": ["LATEST", "SEQUENTIAL"],
         "targetIntervalSeconds": 60
      }
   },
   "name": "TestStage",
   "participantTokenConfigurations": [ 
      { 
         "capabilities": ["PUBLISH", "SUBSCRIBE"],
         "duration": 20160,
         "userId": "1"
      },
      { 
         "capabilities": ["PUBLISH", "SUBSCRIBE"],
         "duration": 20160,
         "userId": "2"
      }
   ]
}
```

### 4. ステージにアクティブパブリッシャーとして参加させる
<a name="ind-part-rec-join-stage-as-active-pub"></a>

参加者トークンをパブリッシャーに配布し、ステージに参加させ、[パブリッシュ](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/getting-started-pub-sub.html)を開始します。

ステージに参加し、[IVS Real-Time Streaming Broadcast SDK ](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/broadcast.html)のいずれかを使用してステージへの公開を開始すると、参加者録画プロセスが自動的に開始され、録画が開始されたことを示す [EventBridge イベント](eventbridge.md)が送信されます。(イベントは IVS 参加者の録画状態の変更 - 録画開始。) 同時に、参加者録画プロセスは、設定された S3 バケットへの VOD およびメタデータファイルの書き込みを開始します。注: 非常に短い期間 (5 秒未満) で接続された参加者は、録画される保証はありません。

各録画の S3 プレフィックスを取得するには、次の 2 つの方法があります。
+ EventBridge イベントを再生します。

  ```
  {
     "version": "0",
     "id": "12345678-1a23-4567-a1bc-1a2b34567890",
     "detail-type": "IVS Participant Recording State Change",
     "source": "aws.ivs",
     "account": "123456789012",
     "time": "2024-03-13T22:19:04Z",
     "region": "us-east-1",
     "resources": ["arn:aws:ivs:us-west-2:123456789012:stage/AbCdef1G2hij"],
     "detail": {
        "session_id": "st-ZyXwvu1T2s",
        "event_name": "Recording Start",
        "participant_id": "xYz1c2d3e4f",
        "recording_s3_bucket_name": "ivs-recordings",
        "recording_s3_key_prefix": "<stage_id>/<session_id>/<participant_id>/2024-01-01T12-00-55Z"
     }
  }
  ```
+ [GetParticipant](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_GetParticipant.html) API オペレーションの使用 — レスポンスには、参加者が録画されている S3 バケットとプレフィックスが含まれます。リクエストは次のとおりです。

  ```
  POST /GetParticipant HTTP/1.1
  Content-type: application/json
  {
     "participantID": "xYz1c2d3e4f",
     "sessionId": "st-ZyXwvu1T2s",
     "stageArn": "arn:aws:ivs:us-west-2:123456789012:stage/AbCdef1G2hij"
  }
  ```

  そして、次のレスポンスがあります。

  ```
  Content-type: application/json
  {
     "participant": {
        ...
        "recordingS3BucketName": "ivs-recordings",
        "recordingS3Prefix": "<stage_id>/<session_id>/<participant_id>",
        "recordingState": "ACTIVE",
        ...
     }
  }
  ```

### 5. VOD を再生する
<a name="ind-part-rec-play-back-vod"></a>

録画が確定したら、[IVS プレイヤー](https://debug.ivsdemos.com/?p=ivs)を使用して録画を視聴できます。VOD 再生用に CloudFront ディストリビューションを設定する手順については、[プライベートバケットからの録画コンテンツの再生](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/rt-composite-recording.html#comp-rec-playback)を参照してください。

## 音声のみの録音
<a name="ind-part-rec-audio-only-recordings"></a>

個々の参加者の録画/録音を設定する場合、S3 バケットに書き込むよう選択できるのはオーディオ HLS セグメントのみです。この機能を使用するには、ステージの作成時に `AUDIO_ONLY mediaType` を選択します。

```
POST /CreateStage HTTP/1.1
Content-type: application/json

{
   "autoParticipantRecordingConfiguration": { 
      "storageConfigurationArn": "arn:aws:ivs:us-west-2:123456789012:storage-configuration/AbCdef1G2hij",
      "mediaTypes": ["AUDIO_ONLY"],
      "thumbnailConfiguration": {
         "recordingMode": "DISABLED"
      }
   },
   "name": "TestStage",
   "participantTokenConfigurations": [ 
      { 
         "capabilities": ["PUBLISH", "SUBSCRIBE"],
         "duration": 20160,
         "userId": "1"
      },
      { 
         "capabilities": ["PUBLISH", "SUBSCRIBE"],
         "duration": 20160,
         "userId": "2"
      }
   ]
}
```

## サムネイルのみの録画
<a name="ind-part-rec-recording-thumbnail-only"></a>

個々の参加者の録画を設定する場合、S3 バケットに書き込むよう選択できるのはサムネイルのみです。この機能を使用するには、ステージの作成時に `mediaType` を `NONE` に設定します。これで HLS セグメントが生成されなくなります。サムネイルは引き続き作成され、S3 バケットに書き込まれます。

```
POST /CreateStage HTTP/1.1
Content-type: application/json
{
   "autoParticipantRecordingConfiguration": { 
      "storageConfigurationArn": "arn:aws:ivs:us-west-2:123456789012:storage-configuration/AbCdef1G2hij",
      "mediaTypes": ["NONE"],
      "thumbnailConfiguration": {
         "recordingMode": "INTERVAL",
         "storage": ["LATEST", "SEQUENTIAL"],
         "targetIntervalSeconds": 60
      }
   },
   "name": "TestStage",
   "participantTokenConfigurations": [ 
      { 
         "capabilities": ["PUBLISH", "SUBSCRIBE"],
         "duration": 20160,
         "userId": "1"
      },
      { 
         "capabilities": ["PUBLISH", "SUBSCRIBE"],
         "duration": 20160,
         "userId": "2"
      }
   ]
}
```

## 録画の内容
<a name="ind-part-rec-recording-contents"></a>

個々の参加者の録画がアクティブになると、ステージの作成時に提供された S3 バケットに HLS ビデオセグメント、メタデータファイル、サムネイルの書き込みが開始します。このコンテンツは、後処理またはオンデマンド動画再生として利用できます。

録画が確定すると、IVS 参加者の録画状態が変更される (録画終了イベントが EventBridge を介して送信される) ことに注意してください。録画したストリームの再生または処理は、必ず Recording End イベントの送信後に行うことをお勧めします。詳細については、「[IVS Real-Time Streaming で Amazon EventBridge を使用する](eventbridge.md)」を参照してください。

以下は、ライブの IVS セッションの録画のディレクトリ構造およびコンテンツの例です。

```
s3://mybucket/stageId/stageSessionId/participantId/timestamp
   events
      recording-started.json
      recording-ended.json
   media
      hls
	 multivariant.m3u8
         high
            playlist.m3u8
            1.mp4
      thumbnails
         high
            1.jpg
            2.jpg
      latest_thumbnail
         high
            thumb.jpg
```

`events`フォルダには、録画イベントに対応するメタデータファイルが含まれています。JSON メタデータファイルは、録画が開始された時、正常に終了した時、失敗して終了した時に生成されます。
+ `events/recording-started.json`
+ `events/recording-ended.json`
+ `events/recording-failed.json`

該当する `events` フォルダには、`recording-started.json`、および `recording-ended.json` または `recording-failed.json` のどちらかが含まれます。これらには、録画されたセッションとその出力形式に関連するメタデータが含まれます。JSON の詳細を以下に示します。

`media` フォルダには、サポートされているメディアコンテンツが含まれています。`hls` サブフォルダには、録画セッション中に生成されたすべてのメディアファイルとマニフェストファイルが含まれており、IVS プレイヤーで再生できます。設定されている場合、 `thumbnails` と `latest_thumbnail` のサブフォルダには、録画セッション中に生成された JPEG サムネイルメディアファイルが含まれます。

## フラグメント化された個々の参加者の記録をマージする
<a name="ind-part-rec-merge-frag"></a>

記録設定の `recordingReconnectWindowSeconds` プロパティを使用すると、ステージパブリッシャーがステージから切断してから再接続した場合に IVS が前のセッションと同じ S3 プレフィックスに記録を試みる際、時間枠 (秒単位) を指定できます。つまり、パブリッシャーが切断してから指定された時間内で再接続した場合、複数の記録は 1 つの記録として見なされてマージされます。

サムネイル記録が `SEQUENTIAL` モードで有効になっている場合、サムネイルも同じ `recordingS3Prefix` の下でマージされます。記録がマージされると、サムネイルカウンターは前の記録用に書き込まれた前のサムネイル値から再開始されます。

**Amazon EventBridge の IVS 記録状態変更イベント:** IVS が新しいストリームが開始されないことを確認するために待機するため、Recording End イベントおよび recording-ended JSON メタデータファイルは最低 `recordingReconnectWindowSeconds` 遅延されます。

マージストリーム機能の設定手順については、「*Amazon IVS Real-Time Streaming の開始方法*」の「[ステップ 2: ステージを作成する](getting-started-create-stage.md)」を参照してください。

### 対象
<a name="ind-part-rec-merge-frag-eligibility"></a>

同じ S3 プレフィックスを使用して複数の記録をマージするには、すべての記録が特定の条件を満たす必要があります。
+ ステージの AutoParticipantRecordingConfiguration の `recordingReconnectWindowSeconds` プロパティにおける値は 0 より大きく設定されます。
+ VOD アーティファクトの書き込みに使用される `StorageConfigurationArn` は各記録において同様です。
+ 参加者がステージを離れてから再参加するまでの秒単位の時間差は `recordingReconnectWindowSeconds` 以下です。

`recordingReconnectWindowSeconds` のデフォルト値は 0 であり、マージが無効になることに注意してください。

## 複数の参加者の記録を同期させる
<a name="ind-part-rec-sync-multiple"></a>

個々の参加者の録画には、HLS プレイリストの `EXT-X-PROGRAM-DATE-TIME` タグが含まれます。これにより、後処理中に複数の参加者の記録を同期するための正確な UTC タイムスタンプをミリ秒の精度で提供します。

複数の参加者を個別に録画し、同期されたコンポジション (サイドバイサイドレイアウトやピクチャーインピクチャーレイアウトなど) を作成する場合は、参加者がさまざまなタイミングでステージに参加したり、ネットワークの中断によって不連続になったりした場合でも、これらのタイムスタンプを使用して録画を正確に調整できます。

各参加者の HLS プレイリストには、以下を示す `EXT-X-PROGRAM-DATE-TIME` タグが含まれています。
+ 録画の開始 (最初のセグメント）。
+ ステッチングが発生したときなど、録画中の不連続ポイント。

これらのタイムスタンプは、ミリ秒単位の精度を持ち、同じタイムリファレンスを使用してすべての参加者間で同期されます。

### HLS プレイリストの例
<a name="ind-part-rec-sync-multiple-hls-playlist"></a>

```
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:12
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MAP:URI="init-0.mp4"
#EXT-X-PROGRAM-DATE-TIME:2024-01-01T12:00:00.000Z
#EXTINF:3.30091,
0.mp4
#EXTINF:5.63794,
1.mp4
#EXTINF:2.74290,
2.mp4
#EXT-X-DISCONTINUITY
#EXT-X-MAP:URI="init-1.mp4"
#EXT-X-PROGRAM-DATE-TIME:2024-01-01T12:00:52.772Z
#EXTINF:2.54412,
3.mp4
#EXTINF:5.63649,
4.mp4
```

`EXT-X-PROGRAM-DATE-TIME` タグは、最初のセグメントと各不連続ポイントの正確な UTC 時間を提供し、他の参加者の録画との正確な同期を可能にします。

### 同期ワークフロー
<a name="ind-part-rec-sync-multiple-workflow"></a>

複数の参加者の録画を同期させるには、各参加者の HLS プレイリストから `EXT-X-PROGRAM-DATE-TIME` タイムスタンプを抽出し、それを使用してタイムオフセットを計算します。これらのオフセットは、FFmpeg などのビデオ処理ツールを使用して後処理コンポジション中に適用できます。録画に途切れが発生している場合でも、その時点のタイムスタンプが正確な同期を保つためのタイミング基準を提供します。これにより、録画全体を通じて正確な同期が維持されます。

注: 後処理なしでリアルタイムに同期された出力を得たい場合は、参加者ごとの個別録画ではなくサーバーサイドコンポジションの利用を検討してください。

## JSON メタデータファイル
<a name="ind-part-rec-json-metadata-files"></a>

このメタデータは JSON 形式です。これには、以下の情報が含まれています。


| フィールド | Type | 必須 | 説明 | 
| --- | --- | --- | --- | 
| `stage_arn` | 文字列 | はい | 録画のソースとして使用されているステージの ARN。 | 
| `session_id` | string | はい | 参加者が録画されるステージの `session_id` を表す文字列。 | 
| `participant_id` | string | はい | 録画された参加者の識別子を表す文字列。 | 
| `recording_started_at` | string | 条件付き | 録画開始時の RFC 3339 UTC タイムスタンプ。`recording_status` が `RECORDING_START_FAILED` の場合、これは使用できません。また、`recording_ended_at` については、以下の注を参照してください。 | 
| `recording_ended_at` | string | 条件付き | 録画終了時の RFC 3339 UTC タイムスタンプ。これは、`recording_status` が `"RECORDING_ENDED"` または `"RECORDING_ENDED_WITH_FAILURE"` のときにのみ利用できます。 **注:** `recording_started_at` および `recording_ended_at` は、これらのイベントが生成されたときのタイムスタンプであり、HLS ビデオセグメントのタイムスタンプと完全に一致しない場合があります。録画時間を正確に決定するには、`duration_ms`フィールドを使用してください。 | 
| `recording_status` | 文字列 | はい | 録画ステータス。有効な値は、`"RECORDING_STARTED"`、`"RECORDING_ENDED"`、`"RECORDING_START_FAILED"`、`"RECORDING_ENDED_WITH_FAILURE"` です。 | 
| `recording_status_message` | string | 条件付き | ステータスの詳細情報。これは、`recording_status` が `"RECORDING_ENDED"` または `"RECORDING_ENDED_WITH_FAILURE"` のときにのみ利用できます。 | 
| `media` | オブジェクト | はい | この録画に使用できるメディアコンテンツの列挙型オブジェクトを含むオブジェクト。有効な値: `"hls"`。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | オブジェクト | はい | Apple HLS 形式の出力を記述する列挙型フィールド。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 整数 | 条件付き | 録画された HLS コンテンツの継続時間 (ミリ秒単位)。これは、`recording_status` が `"RECORDING_ENDED"` または `"RECORDING_ENDED_WITH_FAILURE"` のときにのみ利用できます。録画完了前に障害が発生した場合は、0 になります。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 文字列 | はい | HLS コンテンツが格納されている S3 プレフィックスからの相対パス。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 文字列 | はい | HLS マスタープレイリストファイルの名前。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | オブジェクト | はい | メタデータオブジェクトのレンディション (HLS バリアント) の配列。レンディションは必ず 1 つ以上。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 文字列 | はい | このレンディションの HLS コンテンツが格納されている S3 プレフィックスからの相対パス。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 文字列 | はい | このレンディションのメディアプレイリストファイルの名前。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | オブジェクト | 条件付き | サムネイル出力を記述する列挙型フィールド。これを使用できるのは、サムネイル設定の `storage` フィールドに `SEQUENTIAL` が含まれる場合のみです。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | string | はい | シーケンシャルサムネイルコンテンツが格納されている S3 プレフィックスからの相対パス。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | オブジェクト | はい | メタデータオブジェクトのレンディション (サムネイルバリアント) の配列。レンディションは必ず 1 つ以上。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 文字列 | はい | このレンディションのサムネイルコンテンツが格納されている S3 プレフィックスからの相対パス。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | オブジェクト | 条件付き | サムネイル出力を記述する列挙型フィールド。これを使用できるのは、サムネイル設定の `storage` フィールドに `LATEST` が含まれる場合のみです。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | string | はい | `latest_thumbnail` が格納されている S3 プレフィックスからの相対パス。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | オブジェクト | はい | メタデータオブジェクトのレンディション (サムネイルバリアント) の配列。レンディションは必ず 1 つ以上。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 文字列 | はい | このレンディションの最新のサムネイルが格納されている S3 プレフィックスからの相対パス。 | 
| `version` | string | はい | メタデータスキーマのバージョン。 | 

### 例: recording-started.json
<a name="ind-part-rec-json-ex-rec-start"></a>

```
{
   "version": "v1",
   "stage_arn": "arn:aws:ivs:us-west-2:aws_account_id:stage/AbCdef1G2hij",
   "session_id": "st-ZyXwvu1T2s",
   "participant_id": "xYz1c2d3e4f",
   "recording_started_at": "2024-03-13T13:17:17Z",
   "recording_status": "RECORDING_STARTED",
   "media": {
      "hls": {
         "path": "media/hls",
         "playlist": "multivariant.m3u8",
         "renditions": [
            {
               "path": "high",
               "playlist": "playlist.m3u8"
            }
         ]
      },
      "thumbnails": {
         "path": "media/thumbnails",
         "renditions": [
            {
               "path": "high"
            }
         ]
      },
      "latest_thumbnail": {
         "path": "media/latest_thumbnail",
         "renditions": [
            {
               "path": "high"
            }
         ]
      }
   }
}
```

### 例: recording-ended.json
<a name="ind-part-rec-json-ex-rec-end"></a>

```
{
   "version": "v1",
   "stage_arn": "arn:aws:ivs:us-west-2:aws_account_id:stage/AbCdef1G2hij",
   "session_id": "st-ZyXwvu1T2s",
   "participant_id": "xYz1c2d3e4f",
   "recording_started_at": "2024-03-13T19:44:19Z",
   "recording_ended_at": "2024-03-13T19:55:04Z",
   "recording_status": "RECORDING_ENDED",
   "media": {
      "hls": {
         "duration_ms": 645237,
         "path": "media/hls",
         "playlist": "multivariant.m3u8",
         "renditions": [
            {
               "path": "high",
               "playlist": "playlist.m3u8"
            }
         ]
      },
      "thumbnails": {
         "path": "media/thumbnails",
         "renditions": [
            {
               "path": "high"
            }
         ]
      },
      "latest_thumbnail": {
         "path": "media/latest_thumbnail",
         "renditions": [
            {
               "path": "high"
            }
         ]
      }
   }
}
```

### 例: recording-failed.json
<a name="ind-part-rec-json-ex-rec-failed"></a>

```
{
   "version": "v1",
   "stage_arn": "arn:aws:ivs:us-west-2:aws_account_id:stage/AbCdef1G2hij",
   "session_id": "st-ZyXwvu1T2s",
   "participant_id": "xYz1c2d3e4f",
   "recording_started_at": "2024-03-13T19:44:19Z",
   "recording_ended_at": "2024-03-13T19:55:04Z",
   "recording_status": "RECORDING_ENDED_WITH_FAILURE",
   "media": {
      "hls": {
         "duration_ms": 645237,
         "path": "media/hls",
         "playlist": "multivariant.m3u8",
         "renditions": [
            {
               "path": "high",
               "playlist": "playlist.m3u8"
            }
         ]
      },
      "thumbnails": {
         "path": "media/thumbnails",
         "renditions": [
            {
               "path": "high"
            }
         ]
      },
      "latest_thumbnail": {
         "path": "media/latest_thumbnail",
         "renditions": [
            {
               "path": "high"
            }
         ]
      }
   }
}
```

## 記録を MP4 に変換する
<a name="ind-part-rec-convert-rec-mp4"></a>

個々の参加者の記録は、プレイリストとフラグメント化された MP4 (fMP4) セグメントで構成される HLS 形式で保存されます。HLS 記録を単一の MP4 ファイルに変換するには、FFmpeg をインストールして次のコマンドを実行します。

```
ffmpeg -i /path/to/playlist.m3u8 -i /path/to/playlist.m3u8 -map 0:v -map 1:a -c copy output.mp4
```

# IVS Composite Recording \$1 リアルタイムストリーミング
<a name="rt-composite-recording"></a>

このドキュメントでは、[サーバーサイドコンポジション](server-side-composition.md)で Composite Recording 機能を使用する方法について説明します。Composite Recording では、IVS サーバーを使用してすべてのステージパブリッシャーを 1 つのビューに効果的に結合して IVS ステージの HLS 録画を生成し、結果のビデオを S3 バケットに保存できます。

標準の S3 ストレージとリクエストのコストが適用されます。サムネイルでは追加の IVS 料金は発生しません。詳細については、「[Amazon IVS の料金](https://aws.amazon.com/ivs/pricing/)」を参照してください。

## 前提条件
<a name="comp-rec-prerequisites"></a>

Composite Recording を使用するには、アクティブなパブリッシャーを含むステージと、録画先として使用する S3 バケットが必要です。以下では、EventBridge イベントを使用してコンポジションを S3 バケットに録画するワークフローの 1 つについて説明します。また、独自のアプリケーションロジックに基づいてコンポジションを開始および停止することもできます。

1. パブリッシャーごとに [IVS ステージ](getting-started-create-stage.md)と参加者トークンを作成します。

1. [EncoderConfiguration](https://docs.aws.amazon.com/ivs/latest/RealTimeAPIReference/API_CreateEncoderConfiguration.html) (録画したビデオのレンダリング方法を表すオブジェクト) を作成します。

1. [S3 バケット](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html)と [StorageConfiguration](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_CreateStorageConfiguration.html) (録画内容を保存する場所) を作成します。

   **重要**: 既存の S3 バケットを使用する場合、**オブジェクト所有権**設定は [**バケット所有者に強制する**] か、[**、バケット所有者を優先する**] である必要があります。詳細については、[オブジェクトの所有権の制御](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)に関する S3 ドキュメントを参照してください。

1. [ステージに参加して公開します](getting-started-pub-sub.md)。

1. 参加者が公開した [EventBridge イベント](eventbridge.md)を受信したら、S3 DestinationConfiguration オブジェクトを送信先として [StartComposition](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_StartComposition.html) を呼び出します。

1. 数秒後、HLS セグメントが S3 バケットに保持されていることがわかります。

![\[サーバーサイドコンポジションを使用して S3 バケットにステージを録画します。\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/images/Composite_Recording_Workflow.png)


**注:** コンポジションは、パブリッシャーである参加者がステージ上で何も操作しない状態が 60 秒間続くと自動的にシャットダウンします。その時点でコンポジションは終了し、`STOPPED` 状態に移行します。`STOPPED` 状態に移行して数分後、コンポジションは自動的に削除されます。詳細については、「*サーバーサイドコンポジション*」の「[コンポジションのライフサイクル](ssc-overview.md#ssc-composition-endpoint)」を参照してください。

## Composite Recording の例: S3 バケットの送信先での StartComposition
<a name="comp-rec-example"></a>

以下の例では、S3 をコンポジションの唯一の送信先として指定する [StartComposition](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_StartComposition.html) オペレーションへの一般的な呼び出しを示しています。コンポジションが `ACTIVE` 状態に移行すると、`storageConfiguration` オブジェクトで指定された S3 バケットへのビデオセグメントとメタデータの書き込みが開始されます。異なるレイアウトのコンポジションを作成するには、「[サーバーサイドコンポジション](ssc-overview.md#ssc-api-layouts)」の「レイアウト」と「[IVS Real-Time Streaming API リファレンス](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_LayoutConfiguration.html)」を参照してください。

### リクエスト
<a name="comp-rec-example-request"></a>

```
POST /StartComposition HTTP/1.1
Content-type: application/json

{
   "destinations": [
      {
         "s3": {
            "encoderConfigurationArns": [
              "arn:aws:ivs:ap-northeast-1:927810967299:encoder-configuration/PAAwglkRtjge"
            ],
            "storageConfigurationArn": "arn:aws:ivs:ap-northeast-1:927810967299:storage-configuration/ZBcEbgbE24Cq",
	    "thumbnailConfigurations": [
	       {
		  "storage": ["LATEST", "SEQUENTIAL"],
		  "targetIntervalSeconds": 30
               }
	    ]
	 }
      }
   ],
   "idempotencyToken": "db1i782f1g9",
   "stageArn": "arn:aws:ivs:ap-northeast-1:927810967299:stage/WyGkzNFGwiwr"
}
```

### レスポンス
<a name="comp-rec-example-response"></a>

```
{
    "composition": {
        "arn": "arn:aws:ivs:ap-northeast-1:927810967299:composition/s2AdaGUbvQgp",
        "destinations": [
            {
                "configuration": {
                    "name": "",
                    "s3": {
                        "encoderConfigurationArns": [
                            "arn:aws:ivs:ap-northeast-1:927810967299:encoder-configuration/PAAwglkRtjge"
                        ],
                        "recordingConfiguration": {
                            "format": "HLS"
                        },
                        "storageConfigurationArn": "arn:aws:ivs:ap-northeast-1:927810967299:storage-configuration/ZBcEbgbE24Cq",
	                "thumbnailConfigurations": [
	                   {
		              "storage": ["LATEST", "SEQUENTIAL"],
		              "targetIntervalSeconds": 30
                           }
	                ]
                    }
                },
                "detail": {
                    "s3": {
                        "recordingPrefix": "MNALAcH9j2EJ/s2AdaGUbvQgp/2pBRKrNgX1ff/composite"
                    }
                },
                "id": "2pBRKrNgX1ff",
                "state": "STARTING"
            }
        ],
        "layout": null,
        "stageArn": "arn:aws:ivs:ap-northeast-1:927810967299:stage/WyGkzNFGwiwr",
        "startTime": "2023-11-01T06:25:37Z",
        "state": "STARTING",
        "tags": {}
    }
}
```

StartComposition レスポンスにある `recordingPrefix` フィールドを使用して、録画の内容を保存する場所を決定できます。

## 録画の内容
<a name="comp-rec-contents"></a>

コンポジションが `ACTIVE` 状態に遷移すると、StartComposition の呼び出し中に指定された S3 バケットへの HLS ビデオセグメント、メタデータファイル、サムネイル (設定されている場合) の書き込みが開始されます。このコンテンツは、後処理またはオンデマンド動画再生として利用できます。

コンポジションがライブになると、「IVS Composition State Change」イベントが発生すると、マニフェストファイル、ビデオセグメント、サムネイルが書き込まれるまでに少し時間がかかることに注意してください。「IVS Composition State Change (Session End)」イベントの受信後に、録画したストリームを再生または処理することをお勧めします。詳細については、「[IVS Real-Time Streaming で Amazon EventBridge を使用する](eventbridge.md)」を参照してください。

以下は、ライブの IVS セッションの録画のディレクトリ構造およびコンテンツの例です。

```
MNALAcH9j2EJ/s2AdaGUbvQgp/2pBRKrNgX1ff/composite
   events
      recording-started.json
      recording-ended.json
   media
      hls
      thumbnails
      latest_thumbnail
```

`events`フォルダには、録画イベントに対応するメタデータファイルが含まれています。JSON メタデータファイルは、録画が開始された時、正常に終了した時、失敗して終了した時に生成されます。
+ `events/recording-started.json`
+ `events/recording-ended.json`
+ `events/recording-failed.json`

該当する `events` フォルダには、`recording-started.json`、および `recording-ended.json` または `recording-failed.json` のどちらかが含まれます。

これらには、録画されたセッションとその出力形式に関連するメタデータが含まれます。JSON の詳細を以下に示します。

`media` フォルダには、サポートされているメディアコンテンツが含まれています。`hls` サブフォルダには、コンポジションセッション中に生成されたすべてのメディアファイルとマニフェストファイルが含まれており、IVS プレーヤーで再生できます。HLS マニフェストは `multivariant.m3u8` フォルダにあります。設定されている場合、 `thumbnails` と `latest_thumbnail` のサブフォルダには、コンポジションセッション中に生成された JPEG サムネイルメディアファイルが含まれます。

## StorageConfiguration のバケットポリシー
<a name="comp-rec-bucket-policy"></a>

StorageConfiguration オブジェクトが作成されると、IVS は指定した S3 バケットにコンテンツを書き込むためのアクセス権を取得します。このアクセス権は S3 バケットのポリシーを変更することで付与されます。バケットのポリシーが IVS のアクセス権を削除するように変更されると、進行中や新規の録画はできなくなります。

以下の例は、IVS で S3 バケットに書き込めるようにする S3 バケットポリシーを示しています。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "CompositeWrite-y1d212y",
            "Effect": "Allow",
            "Principal": {
                "Service": "ivs-composite.ap-northeast-1.amazonaws.com"
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::my-s3-bucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                },
                "Bool": {
                    "aws:SecureTransport": "true"
                }
            }
        }
    ]
}
```

------

## JSON メタデータファイル
<a name="comp-rec-json"></a>

このメタデータは JSON 形式です。これには、以下の情報が含まれています。


| フィールド | Type | 必須 | 説明 | 
| --- | --- | --- | --- | 
| `stage_arn` | 文字列 | はい | コンポジションのソースとして使用されているステージの ARN。 | 
| `media` | オブジェクト | はい | この録画に使用できるメディアコンテンツの列挙型オブジェクトを含むオブジェクト。有効な値: `"hls"`。  | 
| [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html) | オブジェクト | はい | Apple HLS 形式の出力を記述する列挙型フィールド。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 整数 | 条件付き | 録画された HLS コンテンツの継続時間 (ミリ秒単位)。これは、`recording_status` が `"RECORDING_ENDED"` または `"RECORDING_ENDED_WITH_FAILURE"` のときにのみ利用できます。録画完了前に障害が発生した場合は、0 になります。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 文字列 | はい | HLS コンテンツが格納されている S3 プレフィックスからの相対パス。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 文字列 | はい |  HLS マスタープレイリストファイルの名前。  | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | オブジェクト | はい | メタデータオブジェクトのレンディション (HLS バリアント) の配列。レンディションは必ず 1 つ以上。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 文字列 | はい | このレンディションの HLS コンテンツが格納されている S3 プレフィックスからの相対パス。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 文字列 | はい | このレンディションのメディアプレイリストファイルの名前。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | 条件付き | エンコードされた動画のピクセル解像度の高さ。これは、レンディションに動画トラックが含まれている場合にのみ使用できます。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 整数 | 条件付き | エンコードされた動画のピクセル解像度の幅。これは、レンディションに動画トラックが含まれている場合にのみ使用できます。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | オブジェクト | 条件付き | サムネイル出力を記述する列挙型フィールド。これを使用できるのは、サムネイル設定の `storage` フィールドに `SEQUENTIAL` が含まれる場合のみです。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | はい | シーケンシャルサムネイルコンテンツが格納されている S3 プレフィックスからの相対パス。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | オブジェクト | はい | メタデータオブジェクトの解像度 (サムネイルバリアント) の配列。常に少なくとも 1 つの解像度があります。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | はい | この解像度のサムネイルコンテンツが格納されている S3 プレフィックスからの相対パス。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | はい | サムネイルのピクセル解像度の高さ。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | はい | サムネイルのピクセル解像度の幅。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | オブジェクト | 条件付き | サムネイル出力を記述する列挙型フィールド。これを使用できるのは、サムネイル設定の `storage` フィールドに `LATEST` が含まれる場合のみです。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | はい | `latest_thumbnail` が格納されている S3 プレフィックスからの相対パス。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | オブジェクト | はい | メタデータオブジェクトの解像度 (サムネイルバリアント) の配列。常に少なくとも 1 つの解像度があります。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | はい | この解像度の最新のサムネイルが保存されている S3 プレフィックスからの相対パス。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | はい | 最新のサムネイルのピクセル解像度の高さ。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | はい | 最新のサムネイルのピクセル解像度の幅。 | 
| `recording_ended_at` | string | 条件付き | 録画終了時の RFC 3339 UTC タイムスタンプ。これは、`recording_status` が `"RECORDING_ENDED"` または `"RECORDING_ENDED_WITH_FAILURE"` のときにのみ利用できます。 `recording_started_at`と`recording_ended_at`は、これらのイベントが生成されたときのタイムスタンプであり、HLS ビデオセグメントのタイムスタンプと完全に一致しない場合があります。録画時間を正確に決定するには、`duration_ms`フィールドを使用してください。  | 
| `recording_started_at` | string | 条件付き | 録画開始時の RFC 3339 UTC タイムスタンプ。`recording_status` が `RECORDING_START_FAILED` の場合、これは使用できません。 `recording_ended_at`については、上記の注意事項を参照してください。  | 
| `recording_status` | 文字列 | はい | 録画ステータス。有効な値は、`"RECORDING_STARTED"`、`"RECORDING_ENDED"`、`"RECORDING_START_FAILED"`、`"RECORDING_ENDED_WITH_FAILURE"` です。 | 
| `recording_status_message` | string | 条件付き | ステータスの詳細情報。これは、`recording_status` が `"RECORDING_ENDED"` または `"RECORDING_ENDED_WITH_FAILURE"` のときにのみ利用できます。 | 
| `version` | 文字列 | はい | メタデータスキーマのバージョン。 | 

### 例: recording-started.json
<a name="comp-rec-json-ex-rec-start"></a>

```
{
  "version": "v1",
  "stage_arn": "arn:aws:ivs:ap-northeast-1:123456789012:stage/aAbBcCdDeE12",
  "recording_started_at": "2023-11-01T06:01:36Z",
  "recording_status": "RECORDING_STARTED",
  "media": {
    "hls": {
      "path": "media/hls",
      "playlist": "multivariant.m3u8",
      "renditions": [
        {
          "path": "720p30-abcdeABCDE12",
          "playlist": "playlist.m3u8",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    },
    "thumbnails": {
      "path": "media/thumbnails",
      "resolutions": [
        {
          "path": "1280x720",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    },
    "latest_thumbnail": {
      "path": "media/latest_thumbnail",
      "resolutions": [
        {
          "path": "1280x720",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    }
  }
}
```

### 例: recording-ended.json
<a name="comp-rec-json-ex-rec-end"></a>

```
{
  "version": "v1",
  "stage_arn": "arn:aws:ivs:ap-northeast-1:123456789012:stage/aAbBcCdDeE12",
  "recording_started_at": "2023-10-27T17:00:44Z",
  "recording_ended_at": "2023-10-27T17:08:24Z",
  "recording_status": "RECORDING_ENDED",
  "media": {
    "hls": {
      "duration_ms": 460315,
      "path": "media/hls",
      "playlist": "multivariant.m3u8",
      "renditions": [
        {
          "path": "720p30-abcdeABCDE12",
          "playlist": "playlist.m3u8",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    },
    "thumbnails": {
      "path": "media/thumbnails",
      "resolutions": [
        {
          "path": "1280x720",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    },
    "latest_thumbnail": {
      "path": "media/latest_thumbnail",
      "resolutions": [
        {
          "path": "1280x720",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    }
  }
}
```

### 例: recording-failed.json
<a name="comp-rec-json-ex-rec-fail"></a>

```
{
  "version": "v1",
  "stage_arn": "arn:aws:ivs:ap-northeast-1:123456789012:stage/aAbBcCdDeE12",
  "recording_started_at": "2023-10-27T17:00:44Z",
  "recording_ended_at": "2023-10-27T17:08:24Z",
  "recording_status": "RECORDING_ENDED_WITH_FAILURE",
  "media": {
    "hls": {
      "duration_ms": 460315,
      "path": "media/hls",
      "playlist": "multivariant.m3u8",
      "renditions": [
        {
          "path": "720p30-abcdeABCDE12",
          "playlist": "playlist.m3u8",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    },
    "thumbnails": {
      "path": "media/thumbnails",
      "resolutions": [
        {
          "path": "1280x720",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    },
    "latest_thumbnail": {
      "path": "media/latest_thumbnail",
      "resolutions": [
        {
          "path": "1280x720",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    }
  }
}
```

## プライベートバケットからの録画コンテンツの再生
<a name="comp-rec-playback"></a>

デフォルトでは録画コンテンツはプライベートです。したがって、これらのオブジェクトは S3 のダイレクト URL を使用してアクセスして再生することはできません。IVS プレーヤーまたは別のプレーヤーを使用して再生するために HLS 多変量プレイリスト (m3u8 ファイル) を開こうとすると、エラー (「リクエストしたリソースへのアクセス許可がありません」という内容など) が表示されます。代わりに、Amazon CloudFront CDN (コンテンツ配信ネットワーク) を使用してこれらのファイルを再生することができます。

CloudFront ディストリビューションは、プライベートバケットからコンテンツを配信するように設定できます。通常、これは、読み取りが CloudFront が提供するコントロールをバイパスするオープンにアクセス可能なバケットを持つよりも望ましいです。オリジンアクセスコントロール (OAC) を作成すると、プライベートバケットから配信されるようにディストリビューションを設定できます。OAC は特別な CloudFront ユーザーで、プライベートオリジンバケットに対する読み取りアクセス許可を持ちます。ディストリビューションの作成後、CloudFront コンソールまたは API を使用して OAC を作成することができます。「*Amazon CloudFront デベロッパーガイド*」の「[新しいオリジンアクセスコントロールの作成](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html#create-oac-overview-s3)」を参照してください。

### CORS を有効にした CloudFront を使用して再生をセットアップする
<a name="comp-rec-playback-setup"></a>

この例では、デベロッパーが CORS を有効にした CloudFront ディストリビューションを設定し、どのドメインからでも録画を再生できるようにする方法を説明します。これは開発段階では特に役立ちますが、以下の例を本番環境のニーズに合わせて変更できます。

#### ステップ 1: S3 バケットを作成する
<a name="comp-rec-playback-setup-step1"></a>

録画の保存に使用する S3 バケットを作成します。バケットは IVS ワークフローに使用するのと同じリージョンにある必要があることに注意してください。

次のように、十分なアクセス許可の CORS ポリシーをバケットに追加します。

1. AWS コンソールで、**[S3 バケットアクセス許可]** タブに移動します。

1. 以下の CORS ポリシーをコピーし、**[クロスオリジンリソース共有 (CORS)]** に貼り付けます。これにより S3 バケットの CORS アクセスが有効になります。

   ```
   [
       {
           "AllowedHeaders": [
               "*"
           ],
           "AllowedMethods": [
               "PUT",
               "POST",
               "DELETE",
               "GET"
           ],
           "AllowedOrigins": [
               "*"
           ],
           "ExposeHeaders": [
               "x-amz-server-side-encryption",
               "x-amz-request-id",
               "x-amz-id-2"
           ]
       }
   ]
   ```

#### ステップ 2: CloudFront ディストリビューションを作成する
<a name="comp-rec-playback-setup-step2"></a>

「*CloudFront デベロッパーガイド*」の「[CloudFront ディストリビューションの作成](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-creating-console.html)」を参照してください。

AWS コンソールを使用して、以下の情報を入力します。


| このフィールドには | これを選択します | 
| --- | --- | 
| オリジンドメイン | 前のステップで作成した S3 バケット | 
| オリジンアクセス | オリジンアクセスコントロール設定 (推奨)、デフォルトパラメータを使用 | 
| デフォルトのキャッシュ動作: ビューワープロトコルポリシー | Redirect HTTP to HTTPS | 
| デフォルトのキャッシュ動作: 許可される HTTP メソッド | GET、HEAD、OPTIONS | 
| デフォルトのキャッシュ動作: キャッシュキーとオリジンリクエスト | CachingDisabled ポリシー | 
| デフォルトのキャッシュ動作: オリジンリクエストポリシー | CORS-S3Origin | 
| デフォルトのキャッシュ動作: レスポンスヘッダーポリシー | SimpleCORS | 
| ウェブアプリケーションファイアウォール | セキュリティ保護を有効にする | 

次に、CloudFront ディストリビューションを保存します。

#### ステップ 3: S3 バケットポリシーを設定する
<a name="comp-rec-playback-setup-step3"></a>

1. S3 バケットに設定した StorageConfiguration をすべて削除します。これにより、そのバケットのポリシーを作成したときに自動的に追加されたバケットポリシーがすべて削除されます。

1. CloudFront ディストリビューションに移動し、すべてのディストリビューションフィールドが前のステップで定義した状態になっていることを確認し、**バケットポリシーをコピー**します (**[ポリシーをコピー]** ボタンを使用)。

1. S3 バケットに移動します。**[アクセス許可]** タブで **[バケットポリシーを編集]** を選択し、前のステップでコピーしたバケットポリシーを貼り付けます。このステップの後、バケットポリシーには CloudFront ポリシーのみが含まれているはずです。

1. S3 バケットを指定し、StorageConfiguration を作成します。

StorageConfiguration が作成されると、S3 バケットポリシーに 2 つの項目が表示されます。1 つは CloudFront がコンテンツを読み取ることを許可し、もう 1 つは IVS がコンテンツを書き込むことを許可します。CloudFront と IVS アクセスを含む最終的なバケットポリシーの例を「[例: CloudFront と IVS アクセスを含む S3 バケットポリシー](#comp-rec-playback-example)」に示します。

#### ステップ 4: 録画を再生する
<a name="comp-rec-playback-setup-step4"></a>

CloudFront ディストリビューションを正常にセットアップし、バケットポリシーを更新したら、IVS プレーヤーを使用して録画を再生できるはずです。

1. コンポジションを正常に開始し、S3 バケットに録画が保存されていることを確認します。

1. この例のステップ 1 からステップ 3 を実行すると、CloudFront URL を介してビデオファイルを使用できるようになります。CloudFront の URL は、Amazon CloudFront コンソールの **[詳細]** タブにある **[ディストリビューションドメイン名]** です。次のように表示されます。

   `a1b23cdef4ghij.cloudfront.net`

1. CloudFront ディストリビューションを介して録画した動画を再生するには、S3 バケットで `multivariant.m3u8` ファイルのオブジェクトキーを見つけます。次のように表示されます。

   `FDew6Szq5iTt/9NIpWJHj0wPT/fjFKbylPb3k4/composite/media/hls/multivariant.m3u8`

1. CloudFront URL の末尾にオブジェクトキーを追加します。最終的にページ URL は次のようになります。

   `https://a1b23cdef4ghij.cloudfront.net/FDew6Szq5iTt/9NIpWJHj0wPT/fjFKbylPb3k4/composite/media/hls/multivariant.m3u8`

1. これで、最終的な URL を IVS プレーヤーのソース属性に追加して、録画全体を視聴できます。録画した動画を視聴するには、「*IVS Player SDK: Web のガイド*」の「[使用開始](https://docs.aws.amazon.com//ivs/latest/LowLatencyUserGuide/web-getting-started.html)」のデモを使用できます。

### 例: CloudFront と IVS アクセスを含む S3 バケットポリシー
<a name="comp-rec-playback-example"></a>

以下のスニペットは、CloudFront がプライベートバケットにコンテンツを読み取り、IVS がバケットにコンテンツを書き込むことを許可する S3 バケットポリシーを示しています。**注: 以下のスニペットをコピーして自分のバケットに貼り付けないでください。ポリシーには、CloudFront ディストリビューションと StorageConfiguration に関連する ID が含まれている必要があります。**

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "CompositeWrite-7eiKaIGkC9DO",
      "Effect": "Allow",
      "Principal": {
        "Service": "ivs-composite.ap-northeast-1.amazonaws.com"
      },
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": "arn:aws:s3:::eicheane-test-1026-2-ivs-recordings/*",
      "Condition": {
        "StringEquals": {
          "s3:x-amz-acl": "bucket-owner-full-control"
        },
        "Bool": {
          "aws:SecureTransport": "true"
        }
      }
    },
    {
      "Sid": "AllowCloudFrontServicePrincipal",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudfront.amazonaws.com"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::eicheane-test-1026-2-ivs-recordings/*",
      "Condition": {
        "StringEquals": {
          "AWS:SourceArn": "arn:aws:cloudfront::844311324168:distribution/E1NG4YMW5MN25A"
        }
      }
    }
  ]
}
```

------

## トラブルシューティング
<a name="comp-rec-troubleshooting"></a>
+ **構成が S3 バケットに書き込まれません –** S3 バケットと StorageConfiguration オブジェクトが同じリージョンに作成されていることを確認してください。また、バケットポリシーをチェックして IVS がバケットにアクセスできることを確認してください。「[StorageConfiguration のバケットポリシー](#comp-rec-bucket-policy)」を参照してください。
+ ***ListCompositions* を実行してもコンポジションが見つかりません –** コンポジションは一時的なリソースです。最終状態に移行すると、数分後に自動的に削除されます。
+ **コンポジションが自動的に停止します –** ステージにパブリッシャーがいない時間が 60 秒を超えると、コンポジションは自動的に停止します。

## 既知の問題
<a name="comp-rec-issues"></a>

Composite Recording によって書き込まれたメディアプレイリストには、コンポジションの進行中はタグ `#EXT-X-PLAYLIST-TYPE:EVENT` が付けられます。コンポジションが完了すると、タグは `#EXT-X-PLAYLIST-TYPE:VOD` に更新されます。再生をスムーズにするため、このプレイリストはコンポジションが正常に終了した後にのみ使用することをお勧めします。