

# IVS 레코딩 \$1 실시간 스트리밍
<a name="rt-recording"></a>

IVS 실시간 스트리밍에는 두 가지 레코딩 옵션이 있습니다.
+ 개별 참가자 레코딩에서는 각 게시자의 미디어가 별도의 파일에 레코딩됩니다.
+ 반면에 복합 레코딩에서는 모든 게시자의 미디어를 단일 보기로 결합하여 하나의 파일에 레코딩합니다.

개별 참가자 레코딩에서는 추가 Amazon IVS 요금 청구가 발생하지 않지만, 복합 레코딩에서는 인코딩된 비디오의 시간당 요금에 대한 요금 청구가 발생합니다. 두 가지 레코딩 옵션에서 모두 표준 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>

이 옵션은 게시자가 한 명인 라이브 스트림 또는 특히 조정 목적으로 각 게시자의 별도 레코딩이 필요한 경우에 적합합니다. 자세한 내용은 [개별 참가자 레코딩](rt-individual-participant-recording.md)을 참조하세요.

![\[개별 참가자 레코딩을 사용하여 각 게시자의 미디어를 별도의 파일에 레코딩합니다.\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/images/Individual_Participant_Recording.png)


## 복합 레코딩
<a name="comp-rec"></a>

이 옵션은 여러 게시자의 미디어를 단일 보기로 결합하여 하나의 파일에 레코딩하므로 온디맨드 비디오 환경에 적합합니다. 자세한 내용은 [복합 레코딩](rt-composite-recording.md)을 참조하세요.

![\[서버 측 구성을 사용하여 S3 버킷에 스테이지를 레코딩합니다.\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/images/Composite_Recording.png)


## 썸네일
<a name="thumbnails"></a>

IVS 실시간 스트리밍을 위한 썸네일 레코딩은 개별 참가자 레코딩과 복합(다중 참가자) 레코딩 모두에 대해 설정할 수 있습니다. 썸네일 레코딩을 활성화 또는 비활성화하고 썸네일이 생성되는 간격을 조정하려면:
+ 개별 참가자 레코딩의 경우 `thumbnailConfiguration` 속성을 사용합니다.
+ 복합 레코딩의 경우 `thumbnailConfigurations` 속성을 사용합니다.

썸네일 간격은 1\$186,400초(24시간)이며, 기본적으로 썸네일 레코딩은 비활성화되어 있습니다. 자세한 내용은 [Amazon IVS Real-Time Streaming API 레퍼런스](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/Welcome.html)를 참조하세요.

썸네일 구성에는 `SEQUENTIAL` 및/또는 `LATEST`로 설정할 수 있는 `storage` 필드가 포함됩니다. `storage` 필드에 따라 썸네일의 S3 스토리지 동작이 결정됩니다.
+ `SEQUENTIAL`은 모든 썸네일을 직렬 방식으로 저장합니다. 이 값이 기본값입니다.
+ `LATEST`는 가장 최근 썸네일만 저장하고 이전 썸네일을 덮어씁니다.

`SEQUENTIAL` 및 `LATEST`를 모두 지정하면 썸네일이 순차적 아카이브용 경로와 최신 썸네일용 경로로 구성된 두 개의 개별 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 실시간 스트리밍 고객이 IVS 스테이지 게시자를 개별적으로 S3 버킷에 레코딩할 수 있습니다. 스테이지에 개별 참가자 레코딩을 사용할 수 있을 때 게시자가 스테이지에 게시하기 시작하면 해당 콘텐츠가 레코딩됩니다.

**참고:** 하나의 비디오에 모든 스테이지 참가자를 합쳐야 한다면 복합 레코딩 특성이 더 적합합니다. IVS 실시간 스트리밍 콘텐츠 레코딩 요약은 [레코딩](rt-recording.md)을 참조하세요.

![\[개별 참가자 레코딩을 사용하여 각 게시자의 미디어를 별도의 파일에 레코딩합니다.\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/images/Individual_Participant_Recording.png)


## 워크플로
<a name="ind-part-rec-workflow"></a>

![\[개별 참가자 레코딩을 사용하여 각 게시자의 미디어를 별도의 파일에 레코딩하는 워크플로입니다.\]](http://docs.aws.amazon.com/ko_kr/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 설명서를 참조하세요. 참고로, 개별 참가자 레코딩은 S3 버킷은 IVS 스테이지와 동일한 AWS 리전에 생성되어야 합니다.

**중요**: 기존 S3 버킷을 사용하는 경우:
+ **객체 소유권** 설정은 **버킷 소유자 적용** 또는 **버킷 소유자 기본 설정**이어야 합니다.
+ **기본 암호화** 설정은 **Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3)**여야 합니다.

자세한 내용은 S3 설명서에서 [객체 소유권 제어](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html) 및 [암호화로 데이터 보호](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingEncryption.html)를 참조하세요.

### 2. StorageConfiguration 객체 생성
<a name="ind-part-rec-create-storageconfig-object"></a>

버킷을 생성한 후 IVS 실시간 스트리밍 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 실시간 스트리밍 Broadcast SDK](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/broadcast.html) 중 하나를 사용하여 게시를 시작하면 참가자-레코딩 프로세스가 자동으로 시작되고 레코딩이 시작되었음을 나타내는 [EventBridge 이벤트](eventbridge.md)가 수신됩니다. (이벤트가 IVS 참가자 레코딩 상태 변경 - 레코딩 시작입니다.) 이와 동시에 구성된 S3 버킷에 VOD 및 메타데이터 파일 쓰기가 참가자-레코딩 프로세스가 시작됩니다. 참고: 매우 짧은 기간(5초 미만) 동안 연결된 참가자에게는 레코딩이 보장되지 않습니다.

각 레코딩의 S3 접두사를 가져오는 두 가지 방법이 있습니다.
+ 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 통해 발송됩니다. 이 이벤트가 수신된 후에만 레코딩된 스트림을 재생하거나 처리하는 것이 좋습니다. 자세한 내용은 [IVS 실시간 스트리밍과 함께 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 접두사에 레코딩을 시도하는 기간(초)을 지정할 수 있습니다. 즉, 지정된 간격 내에 게시자가 브로드캐스트의 연결을 끊었다가 다시 연결하면 여러 레코딩이 단일 레코딩으로 간주되어 서로 병합됩니다.

`SEQUENTIAL` 모드에서 썸네일 레코딩이 활성화된 경우에는 썸네일도 동일한 `recordingS3Prefix`에서 병합됩니다. 레코딩이 병합되면 이전 레코딩에 대해 작성되었던 이전 썸네일 값에서 썸네일 카운터가 다시 시작됩니다.

**Amazon EventBridge의 IVS 레코딩 상태 변경 이벤트:** IVS가 새 스트림이 시작되지 않도록 대기하므로 레코딩 종료 이벤트 및 레코딩 종료 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>

개별 참가자 레코딩에는 후처리 중에 여러 참가자의 레코딩을 동기화하기 위해 밀리초로 정확한 정밀 UTC 타임스탬프를 제공하는 HLS 재생 목록의 `EXT-X-PROGRAM-DATE-TIME` 태그가 포함됩니다.

여러 참가자를 개별적으로 기록하고 동기화된 구성(예: side-by-side 또는 picture-in-picture 레이아웃)을 생성하려는 경우, 참가자가 다른 시간에 스테이지에 참여했거나 네트워크 중단으로 인해 발생할 수 있는 불연속성을 경험했더라도 이러한 타임스탬프를 사용하여 레코딩을 정확하게 정렬할 수 있습니다.

각 참가자의 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 형식입니다. 이는 다음 정보로 구성됩니다.


| Field | 유형 | 필수 | 설명 | 
| --- | --- | --- | --- | 
| `stage_arn` | 문자열 | 예 | 레코딩 소스로 사용되는 스테이지의 ARN입니다. | 
| `session_id` | 문자열 | 예 | `session_id` 참가자가 레코딩되는 스테이지의 를 나타내는 문자열입니다. | 
| `participant_id` | 문자열 | 예 | 레코딩된 참가자의 식별자를 나타내는 문자열입니다. | 
| `recording_started_at` | 문자열 | 조건부 | 레코딩이 시작된 RFC 3339 UTC 타임스탬프입니다. `recording_status`가 `RECORDING_START_FAILED`인 경우에는 이 기능을 사용할 수 없습니다. `recording_ended_at`에 대한 아래의 참고도 참조하세요. | 
| `recording_ended_at` | 문자열 | 조건 | 레코딩이 종료된 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` | 문자열 | 조건 | 상태에 대한 설명 정보입니다. 이는 `recording_status`가 `"RECORDING_ENDED"` 또는 `"RECORDING_ENDED_WITH_FAILURE"`인 경우에만 사용할 수 있습니다. | 
| `media` | 객체 | 예 | 이 레코딩에 사용할 수 있는 미디어 콘텐츠의 열거된 객체를 포함하는 객체입니다. 유효한 값: `"hls"`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 객체 | 예 | Apple HLS 형식 출력을 설명하는 열거형 필드입니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/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/ko_kr/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 문자열 | 예 | HLS 콘텐츠가 저장되는 S3 접두사의 상대 경로입니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 문자열 | 예 | HLS 마스터 재생 목록 파일의 이름입니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 객체 | 예 | 메타데이터 객체의 변환 배열(HLS 변형)입니다. 항상 하나 이상의 변환이 있습니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 문자열 | 예 | 이 변환에 대해 HLS 콘텐츠가 저장되는 S3 접두사의 상대 경로입니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 문자열 | 예 | 이 변환에 대한 미디어 재생 목록 파일의 이름입니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 객체 | 조건부 | 썸네일 출력을 설명하는 열거형 필드입니다. 이는 썸네일 구성의 `storage` 필드가 `SEQUENTIAL`을 포함하는 경우에만 사용할 수 있습니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 문자열 | 예 | 순차적 썸네일 콘텐츠가 저장되는 S3 접두사의 상대 경로입니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 객체 | 예 | 메타데이터 객체의 변환 배열(썸네일 변형)입니다. 항상 하나 이상의 변환이 있습니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 문자열 | 예 | 이 변환에 대한 썸네일 콘텐츠가 저장되는 S3 접두사의 상대 경로입니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 객체 | 조건부 | 썸네일 출력을 설명하는 열거형 필드입니다. 이는 썸네일 구성의 `storage` 필드가 `LATEST`를 포함하는 경우에만 사용할 수 있습니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 문자열 | 예 | `latest_thumbnail`이 저장되는 S3 접두사의 상대 경로입니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 객체 | 예 | 메타데이터 객체의 변환 배열(썸네일 변형)입니다. 항상 하나 이상의 변환이 있습니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | 문자열 | 예 | 이 변환에 대한 최신 썸네일이 저장되는 S3 접두사의 상대 경로입니다. | 
| `version` | 문자열 | 예 | 메타데이터 스키마의 버전입니다. | 

### 예: 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 레코딩 \$1 실시간 스트리밍
<a name="rt-composite-recording"></a>

이 문서에서는 [서버 측 구성](server-side-composition.md) 내에서 복합 레코딩 기능을 사용하는 방법을 설명합니다. 복합 레코딩을 사용하면 IVS 서버를 사용하여 하나의 보기로 모든 스테이지 게시자를 효과적으로 결합한 다음 결과 비디오를 S3 버킷에 저장함으로써 IVS 스테이지의 HLS 레코딩을 생성할 수 있습니다.

표준 S3 스토리지 및 요청 비용이 적용됩니다. 썸네일에는 추가 IVS 요금이 부과되지 않습니다. 자세한 내용은 [Amazon IVS 요금](https://aws.amazon.com/ivs/pricing/)을 참조하세요.

## 사전 조건
<a name="comp-rec-prerequisites"></a>

복합 레코딩을 사용하려면 활성 게시자가 있는 스테이지와 레코딩 대상으로 사용할 S3 버킷이 있어야 합니다. 아래에서는 EventBridge 이벤트를 사용하여 S3 버킷에 구성을 레코드 할 수 있는 한 가지 워크플로를 설명합니다. 그 대신 자체 앱 로직에 따라 구성을 시작하고 중지할 수 있습니다.

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. 몇 초 후 S3 버킷에 유지되는 HLS 세그먼트를 확인할 수 있습니다.

![\[서버 측 구성을 사용하여 S3 버킷에 스테이지를 레코딩합니다.\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/images/Composite_Recording_Workflow.png)


**참고:** 스테이지에 있는 게시자 참가자가 60초 동안 활동이 없으면 구성이 자동 종료됩니다. 이때 구성이 종료되고 `STOPPED` 상태로 전환합니다. `STOPPED` 상태로 몇 분 지나면 구성을 자동으로 삭제합니다. 자세한 내용은 *서버 측 구성*의 [구성 수명 주기](ssc-overview.md#ssc-composition-endpoint)를 참조하세요.

## 복합 레코딩 예제: 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 실시간 스트리밍 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` 상태로 전환되면 HLS 비디오 세그먼트, 메타데이터 파일 및 썸네일(구성된 경우)이 StartComposition 호출 중에 지정된 S3 버킷에 기록되기 시작합니다. 이 콘텐츠는 온디맨드 비디오로 후처리 또는 재생에 사용할 수 있습니다.

구성이 활성화되면 “IVS 구성 상태 변경” 이벤트가 생성되며 매니페스트 파일, 비디오 세그먼트 및 썸네일이 기록되기까지 약간의 시간이 걸립니다. "IVS 구성 상태 변경(레코딩 종료)" 이벤트를 받은 후에 레코딩된 스트림을 재생하거나 처리하는 것이 좋습니다. 자세한 내용은 [IVS 실시간 스트리밍과 함께 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 형식입니다. 이는 다음 정보로 구성됩니다.


| Field | 유형 | 필수 | 설명 | 
| --- | --- | --- | --- | 
| `stage_arn` | 문자열 | 예 | 구성의 소스로 사용되는 스테이지의 ARN입니다. | 
| `media` | 객체 | 예 | 이 레코딩에 사용할 수 있는 미디어 콘텐츠의 열거된 객체를 포함하는 객체입니다. 유효한 값: `"hls"`.  | 
| [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html) | 객체 | 예 | Apple HLS 형식 출력을 설명하는 열거형 필드입니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/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/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 문자열 | 예 | HLS 콘텐츠가 저장되는 S3 접두사의 상대 경로입니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 문자열 | 예 |  HLS 마스터 재생 목록 파일의 이름입니다.  | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 객체 | 예 | 메타데이터 객체의 변환 배열(HLS 변형)입니다. 항상 하나 이상의 변환이 있습니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 문자열 | 예 | 이 변환에 대해 HLS 콘텐츠가 저장되는 S3 접두사의 상대 경로입니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 문자열 | 예 | 이 변환에 대한 미디어 재생 목록 파일의 이름입니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | 조건 | 인코딩된 비디오의 해상도 높이(픽셀)입니다. 이는 변환에 비디오 트랙이 포함된 경우에만 사용할 수 있습니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | 조건 | 인코딩된 비디오의 해상도 폭(픽셀)입니다. 이는 변환에 비디오 트랙이 포함된 경우에만 사용할 수 있습니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 객체 | 조건부 | 썸네일 출력을 설명하는 열거형 필드입니다. 이는 썸네일 구성의 `storage` 필드가 `SEQUENTIAL`을 포함하는 경우에만 사용할 수 있습니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 문자열 | 예 | 순차적 썸네일 콘텐츠가 저장되는 S3 접두사의 상대 경로입니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 객체 | 예 | 메타데이터 객체의 해상도(썸네일 변형) 배열입니다. 항상 하나 이상의 해상도가 있습니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 문자열 | 예 | 이 해상도에 대한 썸네일 콘텐츠가 저장되는 S3 접두사의 상대 경로입니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | 예 | 썸네일의 픽셀 해상도 높이입니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | 예 | 썸네일의 픽셀 해상도 너비입니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 객체 | 조건부 | 썸네일 출력을 설명하는 열거형 필드입니다. 이는 썸네일 구성의 `storage` 필드가 `LATEST`를 포함하는 경우에만 사용할 수 있습니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 문자열 | 예 | `latest_thumbnail`이 저장되는 S3 접두사의 상대 경로입니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 객체 | 예 | 메타데이터 객체의 해상도(썸네일 변형) 배열입니다. 항상 하나 이상의 해상도가 있습니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | 문자열 | 예 | 이 해상도에 대한 최신 썸네일이 저장되는 S3 접두사의 상대 경로입니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | 예 | 최신 썸네일의 픽셀 해상도 높이입니다. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | 예 | 최신 썸네일의 픽셀 해상도 너비입니다. | 
| `recording_ended_at` | 문자열 | 조건 | 레코딩이 종료된 RFC 3339 UTC 타임스탬프입니다. 이는 `recording_status`가 `"RECORDING_ENDED"` 또는 `"RECORDING_ENDED_WITH_FAILURE"`인 경우에만 사용할 수 있습니다. `recording_started_at`과 `recording_ended_at`은 이러한 이벤트가 생성될 때의 타임스탬프이며 HLS 비디오 세그먼트 타임스탬프와 정확히 일치하지 않을 수 있습니다. 레코딩 지속 시간을 정확하게 파악하려면 `duration_ms` 필드를 사용하세요.  | 
| `recording_started_at` | 문자열 | 조건부 | 레코딩이 시작된 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` | 문자열 | 조건 | 상태에 대한 설명 정보입니다. 이는 `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가 제공하는 제어를 우회하는 공개적으로 액세스 가능한 버킷을 사용하는 것을 권장합니다. 프라이빗 원본 버킷에 대한 읽기 권한이 있는 특수한 CloudFront 사용자인 원본 액세스 제어(OAC)를 생성하여 프라이빗 버킷을 통해 서비스를 제공하도록 배포를 설정할 수 있습니다. 배포를 생성한 후 CloudFront 콘솔 또는 API를 통해 OAI를 생성할 수 있습니다. *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 버킷 정책에 두 개의 항목이 표시됩니다. 하나는 CloudFront가 콘텐츠를 읽도록 허용하고 다른 하나는 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. 이제 IVS 플레이어의 소스 속성에 최종 URL을 추가하여 전체 레코딩을 시청할 수 있습니다. 레코딩된 비디오를 보려면 *IVS Player SDK: 웹 가이드*의 [시작하기](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>

구성 진행 중에는 복합 레코딩으로 작성된 미디어 재생 목록에 `#EXT-X-PLAYLIST-TYPE:EVENT` 태그가 붙습니다. 구성이 완료되면 태그가 `#EXT-X-PLAYLIST-TYPE:VOD`로 업데이트됩니다. 원활한 재생 환경을 위해 구성이 성공적으로 완료된 후에만 이 재생 목록을 사용하는 것이 좋습니다.