

# IVS의 Amazon S3에 자동 레코딩 \| 저지연 스트리밍
<a name="record-to-s3"></a>

이 섹션에서는 Amazon IVS Low-Latency Streaming의 S3에 자동 레코딩 기능에 대해 설명합니다. 레코딩된 Amazon IVS 스트림을 위한 데이터 스토리지 뿐만 아니라 스토리지 콘텐츠와 메타데이터 파일 스키마에 대한 정보도 제공하고 있습니다. 또한 레코딩된 콘텐츠 재생에 대한 정보도 아래에서 확인하실 수 있습니다.


| 세부 정보를 볼 항목 ... | 참조할 섹션... | 
| --- | --- | 
| 비디오 레코딩 설정 및 중지 |  *Amazon IVS 시작하기*의 [선택적 레코딩을 사용하여 채널 생성](https://docs.aws.amazon.com//ivs/latest/LowLatencyUserGuide/getting-started-create-channel.html) | 
| API | [IVS API 참조](https://docs.aws.amazon.com//ivs/latest/LowLatencyAPIReference/Welcome.html) | 
| 비용 |  [Amazon IVS 비용](https://docs.aws.amazon.com//ivs/latest/LowLatencyUserGuide/costs.html) | 

## S3Prefix
<a name="r2s3-prefix"></a>

S3 접두사는 레코딩되는 각 라이브 스트림에 대한 고유한 디렉터리 구조입니다. 라이브 스트림의 모든 미디어 및 메타데이터 파일은 이 디렉터리 안에 기록됩니다. 레코딩이 활성화된 채널의 경우 라이브 세션이 시작될 때 S3 접두사가 생성되고 레코딩 시작 및 종료 시 CloudWatch 이벤트에 제공됩니다.

S3 접두사의 형식은 다음과 같습니다.

```
/ivs/v1/<aws_account_id>/<channel_id>/<year>/<month>/<day>/<hours>/<minutes>/<recording_id>
```

위치:
+ `aws_account_id`는 AWS 계정 ID(AWS 계정을 만들 때 생성됨), 여기에서 채널이 생성됩니다.
+ `channel_id`는 채널 ARN 의 리소스 ID 부분(Amazon 리소스 이름의 마지막 부분)입니다. [용어집](ivs-glossary.md)에서 ARN을 참조하세요.
+ `<year>/<month>/<day>/<hours>/<minutes>`는 레코딩이 시작될 때 UTC 타임스탬프입니다.
+ `recording_id`는 각 레코딩 세션에 대해 생성된 고유 ID입니다.

예:

```
ivs/v1/123456789012/AsXego4U6tnj/2020/6/23/20/12/j8Z9O91ndcVs
```

## 레코딩 콘텐츠
<a name="r2s3-contents"></a>

레코딩이 시작되면 비디오 세그먼트 및 메타데이터 파일이 채널에 대해 구성된 S3 버킷에 기록됩니다. 이러한 콘텐츠는 온디맨드 비디오로 후처리 또는 재생에 사용할 수 있습니다.

라이브 스트림이 시작되고 레코딩 시작 EventBridge 이벤트가 생성된 후 매니페스트 파일과 비디오 세그먼트가 기록되기까지 약간의 시간이 걸립니다. 레코딩 종료 이벤트가 전송된 후에만 레코딩된 스트림을 재생하거나 처리하는 것이 좋습니다. ([IVS에서 Amazon EventBridge 사용](eventbridge.md) 섹션을 참조하세요.)

다음은 라이브 Amazon IVS 세션 레코딩의 샘플 디렉터리 구조 및 콘텐츠입니다.

```
ivs/v1/123456789012/AsXego4U6tnj/2020/6/23/20/12/j8Z9O91ndcVs/
   events
      recording-started.json
      recording-ended.json
   media
      hls
      thumbnails
```

`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`에는 라이브 세션 중에 생성된 모든 미디어 및 매니페스트 파일이 포함되어 있으며, 이는 Amazon IVS 플레이어에서 재생할 수 있습니다. 이 폴더에는 표준 마스터 매니페스트 `master.m3u8`와 바이트 범위 지원 매니페스트 `byte-range-multivariant.m3u8`라는 두 가지 종류의 HLS 매니페스트가 있습니다. 따라서 각 변환 폴더에는 `playlist.m3u8` 파일과 `byte-range-variant.m3u8` 파일이 모두 있습니다. (아래의 [바이트 범위 재생 목록](#r2s3-byte-range-playlists)을 참조하세요.)
+ `thumbnails`에는 라이브 세션 중에 생성된 썸네일 이미지가 들어 있습니다. 썸네일은 생성되어 1분마다 버킷에 기록됩니다. (이 동작을 변경하려면 레코딩 구성의 `thumbnailConfiguration` 속성을 재정의합니다.)

**중요:** `media` 폴더의 콘텐츠는 처음 수신된 비디오 세그먼트의 특성에 따라 동적으로 생성 및 결정됩니다. 폴더 콘텐츠가 최종 특성(예: 변환 품질)을 나타내지 않을 수도 있습니다. *정적 경로에 대해 가정하는 것은 자제하시기 바랍니다.* 사용 가능한 HLS 변환과 해당 경로를 검색하려면 아래에 설명된 JSON 메타데이터 파일을 사용합니다.

## 바이트 범위 재생 목록
<a name="r2s3-byte-range-playlists"></a>

S3에 자동 레코딩 기능은 표준 HLS 재생 목록 외에 [바이트 범위 재생 목록](https://datatracker.ietf.org/doc/html/draft-pantos-http-live-streaming-23#section-4.3.2.2) 생성을 지원합니다. 바이트 범위 재생 목록은 HLS 사양 버전 4를 준수합니다. 이를 통해 콘텐츠를 더욱 세밀하게 클리핑할 수 있습니다. 바이트 범위 재생 목록에서는 변환 인덱스 파일의 각 세그먼트가 비디오 청크의 바이트 하위 범위를 참조하므로 표준 10초 미디어 파일 크기보다 더 세분화됩니다. 바이트 범위 재생 목록의 경우 세그먼트 지속 시간은 스트림에 구성된 키프레임 간격과 동일합니다.

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

레코딩 구성의 `thumbnailConfiguration` 속성을 사용하면 라이브 세션에 대한 썸네일 레코딩을 활성화 또는 비활성화하고 라이브 세션에 대해 썸네일이 생성되는 간격을 수정할 수 있습니다. 썸네일 간격은 1초에서 60초 사이일 수 있습니다. 기본적으로 썸네일 레코딩은 60초 간격으로 활성화됩니다. 자세한 내용은 [Amazon IVS Low-Latency Streaming API Reference](https://docs.aws.amazon.com//ivs/latest/LowLatencyAPIReference/Welcome.html)를 참조하세요.

또한 썸네일 구성에 `storage` 필드(`SEQUENTIAL` 및/또는 `LATEST`)와 해상도(`LOWEST_RESOLUTION`, `SD`, `HD` 또는 `FULL_HD`)가 포함될 수 있습니다. 다음은 각 옵션의 해상도입니다.

160 <= `LOWEST_RESOLUTION` <= 360

360 < `SD` <= 480

480 < `HD` <= 720

720 < `FULL_HD` <= 1,080

멀티트랙 비디오 입력을 사용하는 스트림에 `resolution`이 설정되지 않은 경우 모든 변환의 썸네일이 기록됩니다. 멀티트랙에 대한 자세한 내용은 [Multitrack Video](multitrack-video.md)를 참조하세요.

## 조각화된 스트림 병합
<a name="r2s3-merge-fragmented-streams"></a>

레코딩 구성의 `recordingReconnectWindowSeconds` 속성을 통해 스트림이 중단되고 새 스트림이 시작되는 경우 Amazon IVS가 이전 스트림과 동일한 S3 접두사에 레코딩을 시도하는 기간(초)을 지정할 수 있습니다. 즉, 지정된 간격 내에 브로드캐스트의 연결이 끊어졌다가 다시 연결되면 여러 스트림이 단일 브로드캐스트로 간주되어 병합됩니다.

**Amazon EventBridge의 IVS 레코딩 상태 변경 이벤트:** Amazon IVS가 새 스트림이 시작되지 않도록 대기하므로 레코딩 종료 이벤트 및 *레코딩 종료* JSON 메타데이터 파일이 `recordingReconnectWindowSeconds` 이상 지연됩니다.

스트림 병합 기능 설정에 관한 지침은 *Amazon IVS 시작하기*에서 [4단계: 선택적 레코딩을 사용하여 채널 생성](getting-started-create-channel.md)의 내용을 참조하세요.

### 자격
<a name="r2s3-merge-fragmented-streams-eligibility"></a>

여러 스트림을 동일한 S3 접두사에 레코딩하려면 모든 스트림에 대해 특정 조건이 충족되어야 합니다.
+ 동영상 너비와 높이가 같아야 합니다.
+ 프레임 속도가 같아야 합니다.
+ 후속 스트림의 비트 전송률 차이는 원본 스트림 비트 전송률의 50%이하여야 합니다.
+ 비디오 코덱과 오디오 코덱이 동일해야 합니다.

**참고**:
+ 최대 20개의 스트림이 병합된 후에는 새 S3 접두사가 생성됩니다.
+ 48시간 후에는 새 S3 접두사가 생성됩니다. 예를 들어 첫 번째 브로드캐스트가 48시간 동안 지속되고 `recordingReconnectWindowSeconds` 간격 내에 다른 브로드캐스트가 시작되는 경우, 다음 브로드캐스트는 첫 번째 S3 접두사에 병합되지 *않습니다*.
+ 빠른 재연결로 인해 이전 브로드캐스트가 S3에 쓰기를 완료하기 전에 새 브로드캐스트가 시작될 수 있습니다. 이 경우 새 브로드캐스트가 이전 S3 접두사에 병합되지 *않습니다*. (S3에 쓰기는 일반적으로 브로드캐스트 종료 후 10초 이내에 완료됩니다.) 빠른 재연결은 1) 빠른 모바일 앱 배경/전경 전환, 2) IVS 모바일 브로드캐스트 SDKs의 자동 재연결 기능을 사용하는 동안 스트림 인수가 불가능한 경우, 3) [StopStream](https://docs.aws.amazon.com//ivs/latest/LowLatencyAPIReference/API_StopStream.html)을 호출할 때 스트리밍 클라이언트 소프트웨어에서 자동 재연결을 트리거하는 경우 등 여러 시나리오에서 발생할 수 있습니다.

### 알려진 문제
<a name="r2s3-merge-fragmented-streams-known-issue"></a>

`recordingReconnectWindowSeconds`가 활성화되고 웹 브로드캐스트 SDK가 사용되는 경우 웹 브로드캐스트 SDK가 비트레이트 품질을 동적으로 변경하기 때문에 동일한 S3 접두사에 레코딩되지 않을 수 있습니다.

## JSON 메타데이터 파일
<a name="r2s3-json-metadata"></a>

레코딩 상태 변경 이벤트가 발생하면 대응하는 Amazon CloudWatch 지표가 생성되고 메타데이터 파일이 S3 접두사 안에 기록됩니다. ([Amazon IVS Low-Latency Streaming 모니터링](stream-health.md)을 참조하세요.)

이 메타데이터는 JSON 형식입니다. 이는 다음 정보로 구성됩니다.


| 필드 | 유형 | 필수 | 설명 | 
| --- | --- | --- | --- | 
| `channel_arn` | 문자열 | 예 | 라이브 스트림을 브로드캐스팅하는 채널의 ARN입니다. | 
| `media` | 객체 | 예 | 이 레코딩에 사용할 수 있는 미디어 콘텐츠의 열거된 객체를 포함하는 객체입니다. 유효한 값: `"hls"`, `"thumbnails"`. | 
| [See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/ivs/latest/LowLatencyUserGuide/record-to-s3.html) | 객체 | 예 | Apple HLS 형식 출력을 설명하는 열거형 필드입니다. | 
|  [See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/ivs/latest/LowLatencyUserGuide/record-to-s3.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/LowLatencyUserGuide/record-to-s3.html)  | 문자열 | 예 | HLS 콘텐츠가 저장되는 S3 접두사의 상대 경로입니다. | 
|  [See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | 문자열 | 예 | HLS 마스터 재생 목록 파일의 이름입니다. | 
|  [See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | 문자열 | 예 | HLS 바이트 범위 다변량 재생 목록의 이름입니다. | 
|  [See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | 객체 | 예 | 메타데이터 객체의 변환 배열(HLS 변형)입니다. 항상 하나 이상의 변환이 있습니다. | 
|  [See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | 문자열 | 예 | 이 변환에 대해 HLS 콘텐츠가 저장되는 S3 접두사의 상대 경로입니다. | 
|  [See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | 문자열 | 예 | 이 변환에 대한 미디어 재생 목록 파일의 이름입니다. | 
|  [See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | 문자열 | 예 | 이 변환에 대한 바이트 범위 재생 목록의 이름입니다. | 
|  [See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | int | 조건 | 인코딩된 비디오의 해상도 높이(픽셀)입니다. 이는 변환에 비디오 트랙이 포함된 경우에만 사용할 수 있습니다. | 
|  [See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | int | 조건 | 인코딩된 비디오의 해상도 폭(픽셀)입니다. 이는 변환에 비디오 트랙이 포함된 경우에만 사용할 수 있습니다. | 
|  [See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | 객체 | 조건부 | 썸네일 출력을 설명하는 열거형 필드입니다. 이는 썸네일 구성의 `recordingMode`가 `INTERVAL`인 경우에만 사용할 수 있습니다. | 
|  [See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | 문자열 | 조건부 | 썸네일 콘텐츠가 저장되는 S3 접두사의 상대 경로입니다. 이는 썸네일 구성의 `recordingMode`가 `INTERVAL`인 경우에만 사용할 수 있습니다. | 
|  [See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | int | 예 | 썸네일의 높이입니다. 기본값: 소스 변환의 해상도. 이 값은 관련 레코딩 구성의 사용자 입력, 특히 `thumbnailConfiguration.resolution ` 값의 영향을 받습니다. | 
|  [See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | int | 예 | 썸네일의 너비입니다. 기본값: 소스 변환의 해상도. 이 값은 관련 레코딩 구성의 사용자 입력, 특히 `thumbnailConfiguration.resolution` 값의 영향을 받습니다. | 
|  [See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | 객체 | 예 | 최신 썸네일 출력을 설명하는 열거형 필드입니다. 이는 썸네일 구성의 `storage`가 `LATEST`를 포함하는 경우에만 사용할 수 있습니다. | 
|  [See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | int | 예 | 썸네일의 높이입니다. 기본값은 소스 변환의 해상도일 것입니다. 이 값은 관련 레코딩 구성의 사용자 입력, 특히 `thumbnailConfiguration.resolution` 값의 영향을 받습니다. | 
|  [See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | int | 예 | 썸네일의 너비입니다. 기본값은 소스 변환의 해상도일 것입니다. 이 값은 관련 레코딩 구성의 사용자 입력, 특히 `thumbnailConfiguration.resolution` 값의 영향을 받습니다. | 
| `recording_ended_at` | 문자열 | 조건 | 레코딩이 종료된 RFC 3339 UTC 타임스탬프입니다. 이는 `recording_status`가 `"RECORDING_ENDED"` 또는 `"RECORDING_ENDED_WITH_FAILURE"`인 경우에만 사용할 수 있습니다.<br />`recording_started_at`과 `recording_ended_at`은 이러한 이벤트가 생성될 때의 타임스탬프이며 HLS 비디오 세그먼트 타임스탬프와 정확히 일치하지 않을 수 있습니다. 레코딩 지속 시간을 정확하게 파악하려면 `duration_ms` 필드를 사용하세요. | 
| `recording_started_at` | 문자열 | 예 | 레코딩이 시작된 RFC 3339 UTC 타임스탬프입니다.<br />`recording_ended_at`에 대한 위의 참고 사항을 참조하세요. | 
| `recording_status` | 문자열 | 예 | 레코딩 상태입니다. 유효한 값: `"RECORDING_STARTED"`, `"RECORDING_ENDED"`, `"RECORDING_ENDED_WITH_FAILURE"`. | 
| `recording_status_message` | 문자열 | 조건 | 상태에 대한 설명 정보입니다. 이는 `recording_status`가 `"RECORDING_ENDED"` 또는 `"RECORDING_ENDED_WITH_FAILURE"`인 경우에만 사용할 수 있습니다. | 
| `version` | 문자열 | 예 | 메타데이터 스키마의 버전입니다. | 

### 예: recording\_started.json
<a name="r2s3-json-metadata-recording-started"></a>

```
{
   "version": "v1",
   "channel_arn": "arn:aws:ivs:us-west-2:123456789012:channel/AsXego4U6tnj",
   "recording_started_at": "2020-06-12T12:53:26Z",
   "recording_status : "RECORDING_STARTED",
   "media": {
      "hls": {
         "path": "media/hls",
         "playlist": "master.m3u8",
         "byte_range_playlist": "byte-range-multivariant.m3u8",
         "renditions": [
            {
               "path": "480p30",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 480,
               "resolution_width": 852
            },
            {
               "path": "360p30",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 360,
               "resolution_width": 640
            },
            {
               "path": "160p30",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 160,
               "resolution_width": 284
            },
            {
               "path": "720p60",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 720,
               "resolution_width": 1280
            }
         ]
      },
      "thumbnails": {
         "path": "media/thumbnails",
         "resolution_height": 480,
         "resolution_width": 852
      },
      "latest_thumbnail": {
         "path": "media/latest_thumbnail/thumb.jpg",
         "resolution_height": 480,
         "resolution_width": 852
      }
   }
}
```

### 예: recording\_ended.json
<a name="r2s3-json-metadata-recording-ended"></a>

```
{
   "version": "v1",
   "channel_arn": "arn:aws:ivs:us-west-2:123456789012:channel/AsXego4U6tnj",
   "recording_ended_at": "2020-06-14T12:53:20Z",
   "recording_started_at": "2020-06-12T12:53:26Z",
   "recording_status": "RECORDING_ENDED",
   "media": {
      "hls": {
         "duration_ms": 172794489,
         "path": "media/hls",
         "playlist": "master.m3u8",
         "byte_range_playlist": "byte-range-multivariant.m3u8",
         "renditions": [
            {
               "path": "480p30",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 480,
               "resolution_width": 852
            },
            {
               "path": "360p30",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 360,
               "resolution_width": 640
            },
            {
               "path": "160p30",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 160,
               "resolution_width": 284
            },
            {
               "path": "720p60",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 720,
               "resolution_width": 1280
            }
         ]
      },
      "thumbnails": {
         "path": "media/thumbnails",
         "resolution_height": 480,
         "resolution_width": 852
      },
      "latest_thumbnail": {
         "path": "media/latest_thumbnail/thumb.jpg",
         "resolution_height": 480,
         "resolution_width": 852
      }
   }
}
```

### 예: recording\_failed.json
<a name="r2s3-json-metadata-recording-failed"></a>

```
{
   "version": "v1",
   "channel_arn": "arn:aws:ivs:us-west-2:123456789012:channel/AsXego4U6tnj",
   "recording_ended_at": "2020-06-14T12:53:20Z",
   "recording_started_at": "2020-06-12T12:53:26Z",
   "recording_status": "RECORDING_ENDED_WITH_FAILURE",
   "recording_status_message": "InternalServerException",
   "media": {
      "hls": {
         "duration_ms": 172794489,
         "path": "media/hls",
         "playlist": "master.m3u8",
         "renditions": [
            {
               "path": "480p30",
               "playlist": "playlist.m3u8",
               "resolution_height": 480,
               "resolution_width": 852
            },
            {
               "path": "720p60",
               "playlist": "playlist.m3u8",
               "resolution_height": 720,
               "resolution_width": 1280
            }
         ]
      },
      "thumbnails": {
         "path": "media/thumbnails",
         "resolution_height": 480,
         "resolution_width": 852
      },
      "latest_thumbnail": {
         "path": "media/latest_thumbnail/thumb.jpg",
         "resolution_height": 480,
         "resolution_width": 852
      }
   }
}
```

## 레코딩의 변환 검색
<a name="r2s3-recording-renditions"></a>

Amazon IVS 채널로 콘텐츠를 스트리밍할 때 S3에 자동 레코딩은 소스 비디오를 사용하여 여러 변환을 생성합니다. Amazon IVS 플레이어는 [가변 비트 전송률](player.md)(Adaptive Bitrate Streaming, ABR)을 사용하여 필요에 따라 다양한 네트워크 조건에 맞게 재생을 최적화하기 위해 자동으로 변환(비트 전송률)을 전환합니다.

라이브 스트리밍 중에 생성된 각 변환은 S3 레코딩 접두사 안의 고유한 경로에 레코딩됩니다. 해상도 세부 정보, 경로 및 재생 목록 파일 이름은 레코딩의 시작 및 종료 중에 [JSON 메타데이터 파일](#r2s3-json-metadata)에 저장됩니다. 레코딩 구성의 `renditionSelection` 값이 `ALL`이면 모든 변환이 기록을 위해 선택됩니다. `renditionSelection`이 `CUSTOM`인 경우 사용자는 `LOWEST_RESOLUTION`, `SD`, `HD` 및 FULL\_HD 옵션 중 하나 이상을 선택해야 합니다. 다음은 각 옵션의 해상도입니다.

160 <= `LOWEST_RESOLUTION` <= 360

360 < `SD` <= 480

480 < `HD` <= 720

720 < `FULL_HD` <= 1,080

**중요:** 정적 변환 경로 또는 생성된 변환 목록에 대해 가정하지 *않습니다*. 이는 변경될 수 있기 때문입니다. Amazon IVS 레코딩에 대해 특정 변환을 항상 사용할 수 있다고 가정하지 *않습니다*. 사용 가능한 변환, 해상도 및 경로를 확인하려면 메타데이터 파일을 참조하세요.

레코딩 접두사 안의 `event/recording_started.json` 또는 `event/recording_ended.json` 파일에는 레코딩 접두사 안에 있는 미디어 파일의 경로와 이름이 포함됩니다. 모든 `path` 요소는 계층의 이전 경로에 상대적입니다. `media > hls` 아래 요소는 이 레벨에서 정의된 마스터 재생 목록 이름과 경로와 함께 HLS 자산을 설명합니다.

다음은 S3 레코딩 접두사와 메타데이터 파일을 사용하여 마스터 재생 목록 경로를 생성하는 방법을 보여주는 Python 코드 조각입니다.

```
def get_master_playlist(metadata_json, s3_recording_prefix):
   return s3_recording_prefix + '/' + metadata_json['media']['hls']['path'] + '/' + metadata_json['media']['hls']['playlist']
```

`media > hls > renditions` 아래 요소는 레코딩된 변환 목록을 설명합니다. `resolution_height` 및 `resolution_width` 속성을 사용하여 비디오 해상도를 식별할 수 있습니다. `path` 및 `playlist` 요소를 사용하여 변환 재생 목록 경로를 파생시킬 수 있습니다. 이 필드를 사용하여 후처리에 사용할 변환을 결정합니다.

레코딩에 사용할 수 있는 가장 높은 변환 재생 목록을 검색하려는 경우 'IVS 레코딩 상태 변경' EventBridge 이벤트를 구독할 수 있습니다. ([IVS에서 Amazon EventBridge 사용](eventbridge.md)를 참조하세요.) 다음은 해당 이벤트에 구독된 Lambda 함수를 사용하는 방법을 보여주는 샘플 Python 스크립트입니다.

```
import json
import boto3
s3 = boto3.resource('s3')

def get_highest_rendition_playlist(bucket_name, prefix_name):
   object_path = "{}/events/recording-started.json".format(prefix_name)
   object = s3.Object(bucket_name, object_path)
   body = str(object.get()['Body'].read().decode('utf-8'))
   metadata = json.loads(body)
   media_path = metadata["media"]["hls"]["path"]
   renditions = metadata["media"]["hls"]["renditions"]

   highest_rendition = None
   highest_rendition_size = 0

   for rendition in renditions:
       current_rendition_size = rendition["resolution_height"]
       if (current_rendition_size > highest_rendition_size):
           highest_rendition_size = current_rendition_size
           highest_rendition = rendition

   highest_rendition_playlist = media_path + '/' + highest_rendition['path'] + '/' + highest_rendition['playlist']
   return highest_rendition_playlist


def lambda_handler(event, context):
   prefix_name = event["detail"]["recording_s3_key_prefix"]
   bucket_name = event["detail"]["recording_s3_bucket_name"]
   rendition_playlist = get_highest_rendition_playlist(bucket_name, prefix_name)
   print("Highest rendition playlist: {}/{}".format(prefix_name, rendition_playlist))

   return {
       'statusCode': 200,
       'body': rendition_playlist
   }
```

## 프라이빗 버킷에서 레코딩된 콘텐츠 재생
<a name="r2s3-private-bucket-playback"></a>

Amazon S3에 자동 레코딩 기능으로 레코딩된 객체는 기본적으로 프라이빗이므로 직접 S3 URL을 사용하여 재생할 수 없습니다. Amazon IVS 플레이어나 다른 플레이어를 사용하여 재생할 HLS 마스터 매니페스트(m3u8 파일)를 열려고 하면 오류가 발생합니다(예: “요청한 리소스에 액세스할 수 있는 권한이 없습니다”). 대신 이러한 파일은 Amazon CloudFront 콘텐츠 전송 네트워크(CDN)를 사용하여 재생할 수 있습니다.

### Amazon CloudFront 배포
<a name="r2s3-cdn-oai"></a>

프라이빗 버킷의 콘텐츠를 제공하도록 CloudFront 배포를 구성할 수 있습니다. 일반적으로 읽기에서 CloudFront가 제공하는 제어를 우회하는 공개적으로 액세스 가능한 버킷을 사용하는 것을 권장합니다. 프라이빗 원본 버킷에 대한 읽기 권한이 있는 특수한 CloudFront 사용자인 오리진 액세스 제어(origin access control, OAC)를 생성하여 프라이빗 버킷을 통해 서비스를 제공하도록 배포를 설정할 수 있습니다. 배포를 생성한 후 CloudFront 콘솔 또는 API를 통해 OAI를 생성할 수 있습니다. [새로운 오리진 액세스 제어 생성](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html#create-oac-overview-s3)을 참조하세요.

### Amazon CloudFront에서 재생
<a name="r2s3-cdn-playback"></a>

프라이빗 버킷에 액세스할 수 있도록 OAC를 사용하여 배포를 설정하면 CloudFront URL을 통해 비디오 파일을 사용할 수 있습니다. CloudFront URL은 AWS CloudFront 콘솔의 **세부 정보(Details)** 탭에 있는 **배포 도메인 이름(Distribution domain name)**입니다. 이 키는 다음과 같은 형식입니다.

a1b23cdef4ghij.cloudfront.net.

배포를 통해 레코딩된 비디오를 스트리밍하려면 `master.m3u8` 파일의 객체 키를 찾습니다. 이 키는 다음과 같은 형식입니다.

```
ivs/v1/012345678912/a0bCDeFGH1IjK/2021/4/20/12/03/aBcdEFghIjkL/media/hls/master.m3u8
```

이 객체 키를 CloudFront URL의 끝에 추가합니다. 최종 URL은 다음과 같습니다.

```
https://a1b23cdef4ghij.cloudfront.net/ivs/v1/012345678912/a0bCDeFGH1IjK/2021/4/20/12/03/aBcdEFghIjkL/media/hls/master.m3u8
```

웹 브라우저에서 재생하려면 CloudFront와 S3 버킷 모두에서 CORS를 구성해야 합니다. CloudFront 구성의 경우 [오리진 요청 정책 생성](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.html#origin-request-create-origin-request-policy)의 지침에 따라 **CORS-S3 오리진** 요청 정책과 **SimpleCORS** 응답 헤더 정책을 CloudFront 배포에 연결합니다. 아래 예제 구성 콘솔 페이지를 참조하세요.

![예제 구성 콘솔 페이지. 캐시 정책과 오리진 요청 정책을 사용하여 캐시 키와 오리진 요청을 제어하는 것이 좋습니다.](http://docs.aws.amazon.com/ko_kr/ivs/latest/LowLatencyUserGuide/images/CORS_Configuration.png)


S3 CORS 구성의 경우 [CORS 구성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ManageCorsUsing.html)을 참조하여 S3 버킷에 대한 적절한 규칙을 생성하세요.

이제 버킷에서 직접 재생하는 것처럼 레코딩된 비디오를 재생할 수 있습니다.

자세한 내용은 [Amazon S3 오리진에 대한 액세스 제한](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html)을 참조하세요.