

# 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
```