기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
자동 실시간 이미지 생성
Amazon Kinesis Video Streams는 이미지를 트랜스코딩하고 전송하는 기능을 제공합니다. Kinesis Video Streams는 비디오 데이터에서 이미지를 실시간으로 자동으로 추출하고 지정된 Amazon S3 버킷에 이미지를 전송합니다. 실시간 자동 이미지 추출을 구현하려면 다음 단계를 수행해야 합니다.
생성된 이미지를 수신할 S3 버킷을 생성합니다.
Kinesis Video Streams에 이미지를 생성하는 방법과 이미지를 전송할 위치를 알려주는 ImageGenerationConfiguration 스트림 속성을 구성합니다.
이미지 생성 태그 추가 - Kinesis Video Streams는 이미지 생성 태그가 있는 조각만 사용하여 이미지를 생성합니다. 이러한 태그는
putKinesisVideoEventMetadata
메서드와 함께 Kinesis Video Streams 생산자 SDK를 사용하여 비디오를 업로드할 때 추가됩니다.
다음 절차에서는 이러한 각 단계를 완료하는 지침을 제공합니다.
고객 관리형 키를 사용하는 경우 PutMedia
호출을 수행하는 역할(업로더)에 데이터를 암호화 및 해독하고 Amazon S3 버킷에 액세스하는 데 필요한 다음과 같은 권한이 있는지 확인합니다.
-
kms:Encrypt
-
kms:GenerateDataKey
-
kms:Decrypt
-
s3:PutObject
자세한 내용은 서버 측 암호화를 시작하는 방법 단원을 참조하십시오.
생성된 이미지 대상을 구성하려면
이미지가 전송될 S3 대상 버킷을 생성합니다.
Amazon S3 사용 설명서에 따라 Amazon S3 버킷을 생성합니다.
스트림의 이미지 생성 구성을 업데이트할 때 다음 단계에서 필요한 버킷의 URI를 기록해 둡니다.
-
를 AWS CLI 설치하고 구성했는지 확인합니다. 자세한 내용은 AWS Command Line Interface 버전 2 사용 설명서를 참조하세요.
-
다음 콘텐츠를 입력으로
update-image-generation-input.json
사용하여 라는 새 파일을 생성합니다. 자리 표시자 값을 사용하려는 값으로 업데이트합니다. 지원되는 최대 및 최소 값은 UpdateImageGenerationConfiguration API를 참조하세요.{ "StreamName": "
demo-stream
", "ImageGenerationConfiguration": { "Status": "ENABLED", "DestinationConfig": { "DestinationRegion": "us-east-1
", "Uri": "s3://my-bucket-name
" }, "SamplingInterval": 200, "ImageSelectorType": "PRODUCER_TIMESTAMP", "Format": "JPEG", "FormatConfig": { "JPEGQuality": "80" }, "WidthPixels": 320, "HeightPixels": 240 } } -
다음 명령과 같이 UpdateImageGenerationConfiguration API를 사용하고 JSON 파일을 입력으로 연결하여 스트림의 이미지 생성 구성을 업데이트합니다. 파일 경로는 현재 디렉터리의 파일을 가리킵니다.
aws kinesisvideo update-image-generation-configuration \ --cli-input-json file://./update-image-generation-input.json
-
성공하면 빈 응답이 반환되고 터미널에 아무것도 인쇄되지 않습니다.
참고
이미지 생성 구성을 업데이트한 후 이미지 생성 워크플로를 시작하는 데 최소 1분이 걸립니다. 스트림에 비디오를 업로드하기 전에 1분 이상 기다립니다.
-
구성 설정을 확인합니다. AWS CLI 를 사용하여 스트림의 DescribeImageGenerationConfiguration API를 호출합니다.
aws kinesisvideo describe-image-generation-configuration \ --stream-name "
demo-stream
"
Kinesis Video Streams는 이미지 생성 태그가 있는 조각에 대해서만 이미지를 생성하고 전송합니다. Amazon S3 이미지 생성 태그와 함께 제공되는 추가 조각 메타데이터는 Amazon S3 메타데이터로 저장됩니다.
참고
이미지 생성 태그는 스트림 수준 태그가 아닌 조각 메타데이터 태그를 나타냅니다.
중요
이미지 생성 태그는 조각-메타데이터 태그 제한에 포함됩니다. 자세한 내용은 스트리밍 메타데이터 서비스 할당량 단원을 참조하십시오.
다음은 mkvinfo
유틸리티를 사용하는 조각 메타데이터 태그 구조의 예입니다. 이미지 생성 태그는 키가 AWS_KINESISVIDEO_IMAGE_GENERATION
이고 값이 없는 MKV 단순 태그입니다. 자세한 내용은 Matroska 설명서의 비디오 태그 예제
|+ Tags
| + Tag
| // MANDATORY: Predefined MKV tag to trigger image generation for the fragment
| + Simple
| + Name: AWS_KINESISVIDEO_IMAGE_GENERATION
| // OPTIONAL: S3 prefix which will be set as prefix for generated image.
| + Simple
| + Name: AWS_KINESISVIDEO_IMAGE_PREFIX
| + String: image_prefix_in_s3
// 256 bytes max
| // OPTIONAL: Key value pairs that will be persisted as S3 Image object metadata.
| + Simple
| + Name: CUSTOM_KEY_1
// Max 128 bytes
| + String: CUSTOM_VALUE_1
// Max 256 bytes
| + Simple
| + Name: CUSTOM_KEY_2
// Max 128 bytes
| + String: CUSTOM_VALUE_2
// Max 256 bytes
조각에 이미지 생성 태그 추가
Kinesis Video Streams는 이미지 생성 태그가 있는 조각에 대해서만 이미지를 생성하고 전송합니다. Kinesis Video Streams는 이러한 특수 MKV 태그를 인식하고 스트림의 이미지 처리 구성을 기반으로 이미지 생성 워크플로를 시작합니다.
Kinesis Video Streams 생산자 SDK를 사용하여 미디어를 업로드하는 경우 putKinesisVideoEventMetadata
메서드를 사용하여 태그를 지정할 각 조각에 이미지 생성 태그를 추가합니다. keyframe
플래그가 포함된 프레임으로 putFrame
를 호출하면 새 조각이 시작됩니다.
사전 레코딩된 비디오를 업로드하는 경우 네트워크 속도에 따라 레코딩된 속도와 다른 속도로 업로드될 수 있습니다. 비디오의 원래 타임스탬프를 기반으로 이미지를 정기적으로 생성하고 Amazon Kinesis Video Streams가 비디오를 수신한 속도를 기반으로 생성된 서버 타임스탬프를 사용하지 않으려면 생산자 타임스탬프를 사용하여 이미지 생성을 구성하는 것이 좋습니다.
이 코드의 전체 예를 보려면 GitHub의 VideoOnlyRealtimeStreamingSample
// Setup sample frame MEMSET(frameBuffer, 0x00, frameSize); frame.frameData = frameBuffer; frame.version = FRAME_CURRENT_VERSION; frame.trackId = DEFAULT_VIDEO_TRACK_ID; frame.duration = HUNDREDS_OF_NANOS_IN_A_SECOND / DEFAULT_FPS_VALUE; frame.decodingTs = defaultGetTime(); // current time frame.presentationTs = frame.decodingTs; Frame eofr = EOFR_FRAME_INITIALIZER; while(defaultGetTime() > streamStopTime) { frame.index = frameIndex; frame.flags = fileIndex % DEFAULT_KEY_FRAME_INTERVAL == 0 ? FRAME_FLAG_KEY_FRAME : FRAME_FLAG_NONE; frame.size = SIZEOF(frameBuffer); CHK_STATUS(readFrameData(&frame, frameFilePath)); // 1. End the previous fragment if (frame.flags == FRAME_FLAG_KEY_FRAME && !firstFrame) { putKinesisVideoFrame(streamHandle, &eofr); } // 2. putFrame call CHK_STATUS(putKinesisVideoFrame(streamHandle, &frame)); if (frame.flags == FRAME_FLAG_KEY_FRAME) { // 3. Adding the image generation tag CHK_STATUS(putKinesisVideoEventMetadata(streamHandle, STREAM_EVENT_TYPE_IMAGE_GENERATION, NULL);) // 4. Adding fragment metadata for (n = 1; n <= 5; n++) { SNPRINTF(metadataKey, METADATA_MAX_KEY_LENGTH, "SAMPLE_KEY_%d", n); SNPRINTF(metadataValue, METADATA_MAX_VALUE_LENGTH, "SAMPLE_VALUE_%d", frame.index + n); CHK_STATUS(putKinesisVideoFragmentMetadata(streamHandle, metadataKey, metadataValue, FALSE)); } } defaultThreadSleep(frame.duration); frame.decodingTs += frame.duration; frame.presentationTs = frame.decodingTs; frameIndex++; fileIndex++; fileIndex = fileIndex % NUMBER_OF_FRAME_FILES; firstFrame = TRUE; } // 5. End the final fragment putKinesisVideoFrame(streamHandle, &eofr);
샘플 프레임을 설정하기 위한 예제 코드의 요소는 다음과 같습니다.
-
각 조각은 조각의 끝()으로 끝나야 합니다
eofr
. 이 문은 다음 프레임의 시작을 알리는 새 키프레임이 수신될 때마다 스트림에 다음 프레임을 추가eofr
하기 전에를 넣음을 나타냅니다. -
현재 프레임을 스트림에 넣습니다.
-
이미지 생성 태그를 추가합니다.
putKinesisVideoEventMetadata
메서드는 호출 후 및 이전에 언제든지putFrame(keyFrame)
호출할 수 있습니다putFrame(eofr)
. 조각당 최대 한 번만 호출해야 합니다. 모든 조각에는 키프레임이 하나만 있으므로 간소화를 위해 현재 이를 호출합니다. 의 반환 값은 성공 코드(0)에 대해 확인putKinesisVideoEventMetadata
됩니다. -
Kinesis Video Streams가 Amazon S3 객체 메타데이터로 변환할 다른 사용자 지정 조각 메타데이터를 추가합니다.
-
이 업로드 세션에서 최종 조각을 종료합니다.
샘플을 사용하여 이미지 생성 태그 추가
명령줄 옵션을 사용하여 이미지 생성 태그를 추가하려면 C++ 생산자 SDKkvs_gstreamer_audio_video_sample
에서를 사용할 수 있습니다. 다음 예제와 같이 -e image
또는 -e both
인수를 추가하여이 기능을 활성화합니다.
./kvs_gstreamer_audio_video_sample
stream-name
\ -fvideo-to-upload.mp4
\ -e both
이 샘플 애플리케이션에 대한 자세한 내용은 GitHub의 Amazon Kinesis Video Streams CPP Producer, GStreamer Plugin 및 JNI README
Amazon S3 객체 경로(이미지)
S3 객체 경로는 생성된 이미지가 전달될 구성된 S3 버킷의 위치를 설명합니다. 다음 형식을 사용합니다.
ImagePrefix
_AccountID
_StreamName
_ImageTimecode
_RandomID
.file-extension
객체 경로 요소는 다음과 같이 정의됩니다.
-
ImagePrefix
- 있는AWS_KINESISVIDEO_IMAGE_PREFIX
경우의 값입니다. -
AccountID
- 스트림이 생성되는 AWS 계정 ID입니다. -
StreamName
- 이미지가 생성되는 스트림의 이름입니다. -
ImageTimecode
- 이미지가 생성되는 조각의 에포크 타임코드(밀리초). -
RandomID
- 임의 GUID. -
file-extension
- 요청된 이미지 형식을 기반으로 하는 JPG 또는 PNG입니다.
이 예제에서 생성된 이미지의 객체 경로는 다음과 같습니다.
111122223333_demo-stream_16907729324_f20f9add-75e7-4399-a30f-fc7aefb1bab7.jpg
이미지 메타데이터 검색
S3 콘솔 또는 CLI를 사용하여 생성된 이미지의 메타데이터를 검색할 수 있습니다.
Kinesis Video Streams는 조각 번호, 생산자 및 서버 타임스탬프, 생성된 이미지의 콘텐츠 유형 메타데이터를 모두 Amazon S3 객체 메타데이터로 설정합니다. 추가 MKV 태그가 있는 경우 해당 태그도 Amazon S3 객체 메타데이터로 추가됩니다. 다음 예제에서는 Amazon S3 헤드 객체 API 명령을 사용하여 객체 메타데이터를 검색하는 방법을 보여줍니다. 응답에는 Kinesis Video Streams에서 생성한 메타데이터가 포함됩니다.
aws s3api head-object --bucket
my-bucket-name
--key111122223333
_demo-stream
_1690707290324_f20f9add-7e57-4399-a30f-fc7aefb1bab7.jpg{ "AcceptRanges": "bytes", "LastModified": "2023-07-30T08:54:51+00:00", "ContentLength": 22693, "ETag": "\"63e03cb6d57f77e2db984c1d344b1083\"", "ContentType": "image/jpeg", "ServerSideEncryption": "AES256", "Metadata": { "aws_kinesisvideo_producer_timestamp": "1690707290324", "aws_kinesisvideo_server_timestamp": "1690707289209", "aws_kinesisvideo_fragment_number": "91343852333182036507421233921329142742245756394" } }
S3 객체 메타데이터에 대한 자세한 내용은 섹션을 참조하세요https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMetadata.html.
제한을 방지하기 위한 Amazon S3 URI 권장 사항
Amazon S3에 수천 개의 이미지를 쓰면 제한이 발생할 위험이 있습니다. 자세한 내용은 S3 접두사 Put 요청 제한을 참조하세요.
Amazon S3 접두사는 초당 3,500개의 PUT 요청이라는 PUT 제한으로 시작되며 고유한 접두사에 대해 시간이 지남에 따라 점진적으로 증가합니다. 날짜와 시간을 Amazon S3 접두사로 사용하지 마세요. 시간 코딩 데이터는 한 번에 하나의 접두사에 영향을 미치며, 정기적으로 변경되어 이전 접두사 스케일 업을 무효화합니다.
더 빠르고 일관된 Amazon S3 조정을 활성화하려면 Amazon S3 대상 URI에 16진수 코드 또는 UUID와 같은 임의의 접두사를 추가하는 것이 좋습니다. 예를 들어, 16진수 코드 접두사는 16개의 서로 다른 접두사(각 고유한 16진수 문자에 대한 접두사)로 요청을 무작위로 분할하므로 Amazon S3가 자동 조정된 후 초당 56,000개의 PUT 요청을 허용합니다.