기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
코드 작성 및 검토
의 C++ 프로듀서 라이브러리 사용 이 섹션에서는 C++ 테스트 하네스 (tst/ProducerTestFixture.h
및 기타 파일) 의 코드를 살펴봅니다. 이전 단원에서 이 코드를 다운로드했습니다.
비종속 플랫폼 C++ 예제는 다음과 같은 코딩 패턴을 보여 줍니다.
-
Kinesis Video
KinesisVideoProducer
Streams에 액세스할 인스턴스를 생성합니다. -
KinesisVideoStream
의 인스턴스를 만듭니다. 이렇게 하면 같은 이름의 스트림이 아직 없는 AWS 계정 경우 Kinesis 비디오 스트림이 생성됩니다. -
가용한 경우 모든 데이터 프레임에 대해
putFrame
을KinesisVideoStream
에 호출하여 스트림에 전송합니다.
다음 섹션에서는 이 코딩 패턴에 대한 자세한 정보를 제공합니다.
의 인스턴스를 생성하십시오. KinesisVideoProducer
KinesisVideoProducer::createSync
메서드를 호출하여 KinesisVideoProducer
객체를 생성합니다. 다음 예제에서는 ProducerTestFixture.h
파일에서 KinesisVideoProducer
를 생성합니다.
kinesis_video_producer_ = KinesisVideoProducer::createSync(move(device_provider_), move(client_callback_provider_), move(stream_callback_provider_), move(credential_provider_), defaultRegion_);
createSync
방법으로 다음 파라미터를 취합니다.
-
디바이스 또는 스토리지 구성에 관한 정보를 포함한
DeviceInfoProvider
객체를 반환하는DeviceInfo
객체.참고
deviceInfo.storageInfo.storageSize
파라미터를 사용하여 콘텐츠 스토어 크기를 구성합니다. 콘텐츠 스트림은 콘텐츠 스토어를 공유합니다. 스토리지 크기 요구 사항을 확인하려면 평균 프레임 크기에 모든 스트림의 최대 지속 시간 동안 저장된 프레임 수를 곱합니다. 그런 다음 조각 모음을 고려하여 1.2를 곱합니다. 예를 들어 애플리케이션에 다음 구성이 있는 것으로 가정하겠습니다.-
스트림 세 개
-
최대 지속 시간 3분
-
각 스트림은 초당 30프레임 (FPS) 입니다.
-
프레임마다 10,000KB
이 애플리케이션의 콘텐츠 저장소 요구 사항은 3 (스트림) * 3 (분) * 60 (분당 초) * 10000 (kb) * 1.2 (조각 모음 허용량) = 194.4Mb ~ 200Mb입니다.
-
-
특정 클라이언트의 이벤트를 보고하는 함수 별칭을 반환하는
ClientCallbackProvider
객체. -
특정 스트림의 이벤트가 발생할 때 콜백되는 함수 별칭을 반환하는
StreamCallbackProvider
객체. -
자격 증명 환경 변수에 대한 액세스를 제공하는
CredentialProvider
객체입니다. AWS -
AWS 리전 (“us-west-2"). 서비스 엔드포인트는 리전으로부터 결정됩니다.
의 인스턴스를 생성하십시오. KinesisVideoStream
StreamDefinition
파라미터로 KinesisVideoProducer::CreateStream
메서드를 호출하여 KinesisVideoStream
객체를 생성합니다. 예제에서는 ProducerTestFixture.h
파일에서 트랙 유형을 비디오로, 트랙 ID를 1로 지정하여 KinesisVideoStream
을 생성합니다.
auto stream_definition = make_unique<StreamDefinition>(stream_name, hours(2), tags, "", STREAMING_TYPE_REALTIME, "video/h264", milliseconds::zero(), seconds(2), milliseconds(1), true, true, true); return kinesis_video_producer_->createStream(move(stream_definition));
StreamDefinition
객체에는 다음의 필드가 있습니다.
-
스트림 이름.
-
데이터 보존 기간.
-
스트림 태그. 이들 태그는 소비자 애플리케이션이 정확한 스트림을 찾거나 스트림에 관한 상세를 정보를 얻는데 사용할 수 있습니다. AWS Management Console에서도 태그를 볼 수 있습니다.
-
AWS KMS 스트림의 암호화 키. 자세한 내용은 Kinesis Video Streams의 데이터 보호 단원을 참조하십시오.
-
스트리밍 유형. 현재 유일한 유효 값은
STREAMING_TYPE_REALTIME
입니다. -
미디어 콘텐츠 유형.
-
미디어 지연 시간. 이 값은 현재 사용되지 않으므로 0으로 설정해야 합니다.
-
각 조각의 재생 시간.
-
미디어 타임코드 척도.
-
미디어가 키 프레임 조각을 사용하는지 여부.
-
미디어가 타임코드를 사용하는지 여부.
-
미디어가 절대 조각 시간을 사용하는지 여부.
Kinesis 비디오 스트림에 오디오 트랙 추가
다음 addTrack
방법을 사용하여 비디오 트랙 스트림 정의에 오디오 트랙 세부 정보를 추가할 수 있습니다StreamDefinition
.
stream_definition->addTrack(DEFAULT_AUDIO_TRACKID, DEFAULT_AUDIO_TRACK_NAME, DEFAULT_AUDIO_CODEC_ID, MKV_TRACK_INFO_TYPE_AUDIO);
addTrack
메서드에는 다음과 같은 파라미터가 필요합니다.
-
트랙 ID (오디오의 경우와 동일). 이 값은 고유한 값으로서 0이 아니어야 합니다.
-
사용자 정의 트랙 이름 (예: 오디오 트랙의 경우 “오디오”)
-
이 트랙의 코덱 ID (예: 오디오 트랙 “A_ AAC “)
-
트랙 유형 (예: 오디오의 경우 MKV _ _ TRACK INFO TYPE _ AUDIO _의 열거형 값 사용)
오디오 트랙용 코덱 전용 데이터가 있는 경우 함수를 호출할 때 이를 전달할 수 있습니다. addTrack KinesisVideoStream 객체를 만든 후 에서 start 메서드를 호출하면서 코덱 개인 데이터를 전송할 수도 있습니다. KinesisVideoStream
Kinesis 비디오 스트림에 프레임 넣기
헤더와 미디어 데이터가 포함된 Frame
객체를 전달하여 Kinesis 비디오 스트림에 미디어를 넣습니다. KinesisVideoStream::putFrame
예제에서는 ProducerApiTest.cpp
파일에서 putFrame
를 호출합니다.
frame.duration = FRAME_DURATION_IN_MICROS * HUNDREDS_OF_NANOS_IN_A_MICROSECOND; frame.size = SIZEOF(frameBuffer_); frame.frameData = frameBuffer_; MEMSET(frame.frameData, 0x55, frame.size); while (!stop_producer_) { // Produce frames timestamp = std::chrono::duration_cast<std::chrono::nanoseconds>( std::chrono::system_clock::now().time_since_epoch()).count() / DEFAULT_TIME_UNIT_IN_NANOS; frame.index = index++; frame.decodingTs = timestamp; frame.presentationTs = timestamp; // Key frame every 50th frame.flags = (frame.index % 50 == 0) ? FRAME_FLAG_KEY_FRAME : FRAME_FLAG_NONE; ... EXPECT_TRUE(kinesis_video_stream->putFrame(frame));
참고
위의 C++ 프로듀서 예제는 테스트 데이터의 버퍼를 전송합니다. 실제 애플리케이션에서는 미디어 소스(에: 카메라)의 프레임 데이터로부터 프레임 버퍼 및 크기를 알아야 합니다.
Frame
객체에는 다음의 필드가 있습니다.
-
프레임 인덱스. 이는 단순 점증 값이어야 합니다.
-
프레임과 관련된 플래그. 예를 들어, 인코더가 키 프레임을 생산하도록 구성되어 있다면 이 프레임에는
FRAME_FLAG_KEY_FRAME
플래그가 할당될 것입니다. -
디코딩 타임스탬프.
-
프레젠테이션 타임스탬프.
-
프레임 지속 시간(최대 100 ns 단위).
-
프레임 크기(바이트).
-
프레임 데이터.
프레임 형식에 대한 자세한 내용은 을 참조하십시오Kinesis Video Streams 데이터 모델.
KinesisVideoFrame a를 특정 트랙에 넣으세요. KinesisVideoStream
PutFrameHelper
클래스를 사용하여 프레임 데이터를 특정 트랙에 넣을 수 있습니다. 먼저 를 getFrameDataBuffer
호출하여 데이터를 채울 사전 할당된 버퍼 중 하나에 대한 포인터를 가져옵니다. KinesisVideoFrame
그런 다음 를 putFrameMultiTrack
호출하여 프레임 데이터의 유형을 나타내는 Boolean 값과 KinesisVideoFrame
함께 를 전송할 수 있습니다. 비디오 데이터이면 true를 사용하고, 프레임에 오디오 데이터가 포함되어 있으면 false를 사용합니다. 이 putFrameMultiTrack
메서드는 큐잉 메커니즘을 사용하여 프래그먼트가 일정하게 증가하는 프레임 타임스탬프를 유지하고 두 MKV 프래그먼트가 겹치지 않도록 합니다. 예를 들어 프래그먼트의 첫 번째 프레임의 MKV 타임스탬프는 항상 이전 프래그먼트의 마지막 프레임의 타임스탬프보다 커야 합니다. MKV
PutFrameHelper
에는 다음 필드가 있습니다.
-
대기열에 있는 최대 오디오 프레임 수.
-
대기열에 있는 최대 비디오 프레임 수.
-
단일 오디오 프레임에 할당할 크기입니다.
-
단일 비디오 프레임에 할당할 크기.
액세스 지표 및 지표 로깅
C++ SDK 프로듀서에는 메트릭 및 메트릭 로깅 기능이 포함되어 있습니다.
getKinesisVideoMetrics
및 getKinesisVideoStreamMetrics
API 작업을 사용하여 Kinesis Video Streams 및 활성 스트림에 대한 정보를 검색할 수 있습니다.
다음은 kinesis-video-pic/src/client/include/com/amazonaws/kinesis/video/client/Include.h
파일의 코드입니다.
/** * Gets information about the storage availability. * * @param 1 CLIENT_HANDLE - the client object handle. * @param 2 PKinesisVideoMetrics - OUT - Kinesis Video metrics to be filled. * * @return Status of the function call. */ PUBLIC_API STATUS getKinesisVideoMetrics(CLIENT_HANDLE, PKinesisVideoMetrics); /** * Gets information about the stream content view. * * @param 1 STREAM_HANDLE - the stream object handle. * @param 2 PStreamMetrics - Stream metrics to fill. * * @return Status of the function call. */ PUBLIC_API STATUS getKinesisVideoStreamMetrics(STREAM_HANDLE, PStreamMetrics);
getKinesisVideoMetrics
로 채워지는 PClientMetrics
객체에는 다음 정보가 포함되어 있습니다.
-
contentStoreSize: 콘텐츠 스토어의 전체 크기 (스트리밍 데이터를 저장하는 데 사용되는 메모리) (바이트).
-
contentStoreAvailable크기: 콘텐츠 저장소에서 사용 가능한 메모리 (바이트).
-
contentStoreAllocated크기: 콘텐츠 저장소에 할당된 메모리.
-
totalContentViews크기: 콘텐츠 뷰에 사용된 총 메모리입니다. 콘텐츠 보기는 콘텐츠 저장소에 있는 일련의 정보 인덱스입니다.
-
totalFrameRate: 모든 활성 스트림의 초당 총 프레임 수입니다.
-
totalTransferRate: 모든 스트림에서 전송되는 총 초당 비트 수 (bps) 입니다.
getKinesisVideoStreamMetrics
로 채워지는 PStreamMetrics
객체에는 다음 정보가 포함되어 있습니다.
-
currentViewDuration: 콘텐츠 뷰의 헤드 (프레임이 인코딩된 경우) 와 현재 위치 (프레임 데이터가 Kinesis Video Streams로 전송되는 경우) 간의 100ns 단위 차이.
-
overallViewDuration: 콘텐츠 뷰의 헤드 (프레임이 인코딩될 때) 부터 끝까지 (콘텐츠 뷰에 할당된 총 공간을 초과했거나 Kinesis Video Streams에서
PersistedAck
메시지를 수신하고 지속되는 것으로 알려진 프레임이 플러시되어 프레임이 메모리에서 플러시되는 경우) 사이의 100ns 단위 차이. -
currentViewSize: 헤드 (프레임이 인코딩된 경우) 에서 현재 위치 (프레임이 Kinesis Video Streams로 전송될 때) 까지의 콘텐츠 뷰 크기 (바이트) 입니다.
-
overallViewSize: 콘텐츠 보기의 총 크기 (바이트).
-
currentFrameRate: 마지막으로 측정한 스트림 속도 (초당 프레임 수).
-
currentTransferRate: 마지막으로 측정한 스트림 속도 (초당 바이트 수).
해제
나머지 바이트를 버퍼에 넣고 ACK
를 대기하려는 경우 stopSync
를 사용할 수 있습니다.
kinesis_video_stream->stopSync();
또는 stop
를 호출하여 스트리밍을 종료할 수 있습니다.
kinesis_video_stream->stop();
스트림을 중지한 후에는 다음을 호출하여 스트림을 비울 수 있습니다. API
kinesis_video_producer_->freeStream(kinesis_video_stream);