기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Amazon S3에 자동 레코딩(저지연 스트리밍)
이 섹션에서는 Amazon IVS 저지연 auto-record-to 스트리밍의 -S3 기능에 대한 정보를 제공합니다. 레코딩된 Amazon IVS 스트림을 위한 데이터 스토리지 뿐만 아니라 스토리지 콘텐츠와 메타데이터 파일 스키마에 대한 정보도 제공하고 있습니다. 또한 레코딩된 콘텐츠 재생에 대한 정보도 아래에서 확인하실 수 있습니다.
세부 정보를 볼 항목 ... | 참조할 섹션... |
---|---|
비디오 레코딩 설정 및 중지 |
Amazon IVS 시작하기의 선택적 레코딩을 사용하여 채널 생성 |
API |
|
비용 | Amazon IVS 비용 |
S3Prefix
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 리소스 이름의 마지막 부분)입니다. 용어집에서 ARN을 참조하세요. -
<year>/<month>/<day>/<hours>/<minutes>
는 레코딩이 시작될 때 UTC 타임스탬프입니다. -
recording_id
는 각 레코딩 세션에 대해 생성된 고유 ID입니다.
예:
ivs/v1/123456789012/AsXego4U6tnj/2020/6/23/20/12/j8Z9O91ndcVs
레코딩 콘텐츠
레코딩이 시작되면 비디오 세그먼트 및 메타데이터 파일이 채널에 대해 구성된 S3 버킷에 기록됩니다. 이러한 콘텐츠는 온디맨드 비디오로 후처리 또는 재생에 사용할 수 있습니다.
참고로 라이브 스트림이 시작되고 Recording Start EventBridge 이벤트가 발생한 후 매니페스트 파일과 비디오 세그먼트가 기록되기까지 시간이 조금 걸립니다. 레코딩 종료 이벤트가 전송된 후에만 레코딩된 스트림을 재생하거나 처리하는 것이 좋습니다. ( EventBridge IVS와 함께 아마존 사용하기 섹션을 참조하세요.)
다음은 라이브 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
파일이 모두 있습니다. (아래의 바이트 범위 재생 목록을 참조하세요.) -
thumbnails
에는 라이브 세션 중에 생성된 썸네일 이미지가 들어 있습니다. 썸네일은 생성되어 1분마다 버킷에 기록됩니다. (이 동작을 변경하려면 레코딩 구성의thumbnailConfiguration
속성을 재정의합니다.)
중요: media
폴더의 콘텐츠는 처음 수신된 비디오 세그먼트의 특성에 따라 동적으로 생성 및 결정됩니다. 폴더 콘텐츠가 최종 특성(예: 변환 품질)을 나타내지 않을 수도 있습니다. 정적 경로(static path)에 대해 가정하는 것은 자제하시기 바랍니다. 사용 가능한 HLS 변환과 해당 경로를 검색하려면 아래에 설명된 JSON 메타데이터 파일을 사용합니다.
바이트 범위 재생 목록
auto-record-to-S3 기능은 표준 HLS 재생 목록 외에도 바이트 범위 재생 목록
썸네일
레코딩 구성의 thumbnailConfiguration
속성을 사용하면 라이브 세션에 대한 썸네일 레코딩을 활성화 또는 비활성화하고 라이브 세션에 대해 썸네일이 생성되는 간격을 수정할 수 있습니다. 썸네일 간격은 1초에서 60초 사이일 수 있습니다. 기본적으로 썸네일 레코딩은 60초 간격으로 활성화됩니다. 자세한 내용은 Amazon IVS API 레퍼런스를 참조하세요.
또한 썸네일 구성에 storage
필드(SEQUENTIAL
및/또는 LATEST
)와 해상도(LOWEST_RESOLUTION
, SD
, HD
또는 FULL_HD
)가 포함될 수 있습니다. 다음은 각 옵션의 해상도입니다.
160 <= LOWEST_RESOLUTION
<= 360
360 < SD
<= 480
480 < HD
<= 720
720 < FULL_HD
<= 1,080
조각화된 스트림 병합
레코딩 구성의 recordingReconnectWindowSeconds
속성을 통해 스트림이 중단되고 새 스트림이 시작되는 경우 Amazon IVS가 이전 스트림과 동일한 S3 접두사에 레코딩을 시도하는 기간(초)을 지정할 수 있습니다. 즉, 지정된 간격 내에 브로드캐스트의 연결이 끊어졌다가 다시 연결되면 여러 스트림이 단일 브로드캐스트로 간주되어 병합됩니다.
Amazon의 IVS 녹화 상태 변경 이벤트 EventBridge: Amazon IVS는 새 스트림이 시작되지 않도록 recordingReconnectWindowSeconds
대기하므로 녹화 종료 이벤트 및 녹화가 종료된 JSON 메타데이터 파일은 최소한 지연됩니다.
스트림 병합 기능 설정에 관한 지침은 Amazon IVS 시작하기에서 4단계: 선택적 레코딩을 사용하여 채널 생성의 내용을 참조하세요.
자격
여러 스트림을 동일한 S3 접두사에 레코딩하려면 모든 스트림에 대해 특정 조건이 충족되어야 합니다.
-
동영상 너비와 높이가 같아야 합니다.
-
프레임 속도가 같아야 합니다.
-
후속 스트림의 비트 전송률 차이는 원본 스트림 비트 전송률의 50%이하여야 합니다.
-
비디오 코덱과 오디오 코덱이 동일해야 합니다.
참고:
-
최대 20개의 스트림이 병합된 후에는 새 S3 접두사가 생성됩니다.
-
48시간 후에는 새 S3 접두사가 생성됩니다. 예를 들어 첫 번째 브로드캐스트가 48시간 동안 지속되고
recordingReconnectWindowSeconds
간격 내에 다른 브로드캐스트가 시작되는 경우, 다음 브로드캐스트는 첫 번째 S3 접두사에 병합되지 않습니다. 각 스트림은 이전 스트림보다 10초 이상 늦게 시작해야 합니다.
알려진 문제
recordingReconnectWindowSeconds
가 활성화되고 웹 브로드캐스트 SDK가 사용되는 경우 웹 브로드캐스트 SDK가 비트레이트 품질을 동적으로 변경하기 때문에 동일한 S3 접두사에 레코딩되지 않을 수 있습니다.
JSON 메타데이터 파일
기록 상태 변경 이벤트가 발생하면 해당 Amazon CloudWatch 지표가 생성되고 S3 접두사 내에 메타데이터 파일이 작성됩니다. (Amazon IVS 저지연 스트리밍 모니터링을 참조하세요.)
이 메타데이터는 JSON 형식입니다. 이는 다음 정보로 구성됩니다.
필드 | 유형 | 필수 | 설명 |
---|---|---|---|
|
문자열 | 예 | 라이브 스트림을 브로드캐스팅하는 채널의 ARN입니다. |
|
객체 | 예 | 이 레코딩에 사용할 수 있는 미디어 콘텐츠의 열거된 객체를 포함하는 객체입니다. 유효한 값: |
|
객체 | 예 | Apple HLS 형식 출력을 설명하는 열거형 필드입니다. |
|
정수 | 조건 | 레코딩된 HLS 콘텐츠의 지속 시간(밀리초)입니다. 이는 |
|
문자열 | 예 | HLS 콘텐츠가 저장되는 S3 접두사의 상대 경로입니다. |
|
문자열 | 예 |
HLS 마스터 재생 목록 파일의 이름입니다. |
|
문자열 | 예 | HLS 바이트 범위 다변량 재생 목록의 이름입니다. |
|
객체 | 예 | 메타데이터 객체의 변환 배열(HLS 변형)입니다. 항상 하나 이상의 변환이 있습니다. |
|
문자열 | 예 | 이 변환에 대해 HLS 콘텐츠가 저장되는 S3 접두사의 상대 경로입니다. |
|
문자열 | 예 | 이 변환에 대한 미디어 재생 목록 파일의 이름입니다. |
|
문자열 | 예 | 이 변환에 대한 바이트 범위 재생 목록의 이름입니다. |
|
int | 조건 | 인코딩된 비디오의 해상도 높이(픽셀)입니다. 이는 변환에 비디오 트랙이 포함된 경우에만 사용할 수 있습니다. |
|
int | 조건 | 인코딩된 비디오의 해상도 폭(픽셀)입니다. 이는 변환에 비디오 트랙이 포함된 경우에만 사용할 수 있습니다. |
|
객체 | 조건 | 썸네일 출력을 설명하는 열거형 필드입니다. 이는 썸네일 구성의 |
|
문자열 | 조건 | 썸네일 콘텐츠가 저장되는 S3 접두사의 상대 경로입니다. 이는 썸네일 구성의 |
|
int | 예 | 썸네일의 높이입니다. 기본값: 소스 변환의 해상도. 이 값은 관련 레코딩 구성의 사용자 입력, 특히 |
|
int | 예 | 썸네일의 너비입니다. 기본값: 소스 변환의 해상도. 이 값은 관련 레코딩 구성의 사용자 입력, 특히 |
|
객체 | 예 | 최신 썸네일 출력을 설명하는 열거형 필드입니다. 이는 썸네일 구성의 |
|
int | 예 | 썸네일의 높이입니다. 기본값은 소스 변환의 해상도일 것입니다. 이 값은 관련 레코딩 구성의 사용자 입력, 특히 |
|
int | 예 | 썸네일의 너비입니다. 기본값은 소스 변환의 해상도일 것입니다. 이 값은 관련 레코딩 구성의 사용자 입력, 특히 |
|
문자열 | 조건 | 레코딩이 종료된 RFC 3339 UTC 타임스탬프입니다. 이는
|
|
문자열 | 예 | 레코딩이 시작된 RFC 3339 UTC 타임스탬프입니다.
|
|
문자열 | 예 | 레코딩 상태입니다. 유효한 값: |
|
문자열 | 조건 | 상태에 대한 설명 정보입니다. 이는 |
|
문자열 | 예 | 메타데이터 스키마의 버전입니다. |
예: recording_started.json
{ "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
{ "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
{ "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 } } }
레코딩의 변환 검색
Amazon IVS 채널로 콘텐츠를 스트리밍할 때 auto-record-to-s 3은 소스 비디오를 사용하여 여러 렌디션을 생성합니다. Amazon IVS 플레이어는 가변 비트 전송률(Adaptive Bitrate Streaming, ABR)을 사용하여 필요에 따라 다양한 네트워크 조건에 맞게 재생을 최적화하기 위해 자동으로 변환(비트 전송률)을 전환합니다.
라이브 스트리밍 중에 생성된 각 변환은 S3 레코딩 접두사 안의 고유한 경로에 레코딩됩니다. 해상도 세부 정보, 경로 및 재생 목록 파일 이름은 레코딩의 시작 및 종료 중에 JSON 메타데이터 파일에 저장됩니다. 레코딩 구성의 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 ( EventBridge IVS와 함께 아마존 사용하기를 참조하세요.) 다음은 해당 이벤트에 구독된 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 }
프라이빗 버킷에서 레코딩된 콘텐츠 재생
Amazon S3에 자동 레코딩 기능으로 레코딩된 객체는 기본적으로 프라이빗이므로 직접 S3 URL을 사용하여 재생할 수 없습니다. Amazon IVS 플레이어나 다른 플레이어를 사용하여 재생할 HLS 마스터 매니페스트(m3u8 파일)를 열려고 하면 오류가 발생합니다(예: “요청한 리소스에 액세스할 수 있는 권한이 없습니다”). 대신 Amazon CloudFront CDN (콘텐츠 전송 네트워크) 을 사용하여 이러한 파일을 재생할 수 있습니다.
아마존 CloudFront 디스트리뷰션
CloudFront 프라이빗 버킷의 콘텐츠를 제공하도록 배포를 구성할 수 있습니다. 일반적으로 이 방법은 에서 제공하는 제어를 우회하여 읽을 수 있는 공개적으로 액세스할 수 있는 버킷을 사용하는 것보다 좋습니다. CloudFront 프라이빗 오리진 버킷에 대한 읽기 권한을 가진 특수 CloudFront 사용자인 OAC (Origin Access Control) 를 생성하여 프라이빗 버킷에서 서비스하도록 배포를 설정할 수 있습니다. 배포를 생성한 후 CloudFront 콘솔이나 API를 통해 OAC를 생성할 수 있습니다. 새로운 오리진 액세스 제어 생성을 참조하세요.
아마존에서 재생 CloudFront
OAC를 사용하여 프라이빗 버킷에 액세스할 수 있도록 배포를 설정한 후에는 CloudFront URL을 통해 동영상 파일을 사용할 수 있어야 합니다. CloudFront URL은 AWS CloudFront 콘솔의 세부 정보 탭에 있는 배포 도메인 이름입니다. 이 키는 다음과 같은 형식입니다.
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
웹 브라우저에서 재생하려면 S3 버킷 CloudFront 모두에 CORS를 구성해야 합니다. CloudFront 구성하려면 원본 요청 정책 생성의 지침에 따라 CORS-S3 원본 요청 정책 및 SimpleCors 응답 헤더 정책을 배포에 첨부하십시오. CloudFront 아래 예제 구성 콘솔 페이지를 참조하세요.
S3 CORS 구성의 경우 CORS 구성을 참조하여 S3 버킷에 대한 적절한 규칙을 생성하세요.
이제 버킷에서 직접 재생하는 것처럼 레코딩된 비디오를 재생할 수 있습니다.
자세한 내용은 Amazon S3 오리진에 대한 액세스 제한을 참조하세요.