

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# C\$1\$1 생산자 라이브러리 사용
<a name="producer-sdk-cpp"></a>

Amazon Kinesis Video Streams 제공 C\$1\$1 생산자 라이브러리를 사용하여 디바이스에서 Kinesis 비디오 스트림으로 미디어 데이터를 전송하는 애플리케이션 코드를 작성할 수 있습니다.

## 객체 모델
<a name="producer-sdk-cpp-objectmodel"></a>

C\$1\$1 라이브러리는 Kinesis 비디오 스트림으로의 데이터 전송을 관리하기 위해 다음 객체를 제공합니다.
+ **KinesisVideoProducer:** 미디어 소스 및 AWS 자격 증명에 대한 정보를 포함하고 Kinesis Video Streams 이벤트에 대해 보고할 콜백을 유지합니다.
+ **KinesisVideoStream:** Kinesis 비디오 스트림을 나타냅니다. 이름, 데이터 보존 기간, 미디어 콘텐츠 유형 등 비디오 스트림의 파라미터에 대한 정보를 포함합니다.

## 스트림에 미디어 넣기
<a name="producer-sdk-cpp-putframe"></a>

C\$1\$1 라이브러리 제공 메서드(예: `PutFrame`)를 사용하여 `KinesisVideoStream` 객체에 데이터를 넣을 수 있습니다. 그런 다음 라이브러리는 내부 데이터 상태를 관리하는데, 다음과 같은 작업을 포함할 수 있습니다.
+ 인증 수행.
+ 네트워크 지연 시간 감시. 지연 시간이 너무 길면 라이브러리가 프레임 드롭을 선택할 수 있습니다.
+ 진행 중인 스트리밍의 상태 추적.

## 콜백 인터페이스
<a name="producer-sdk-cpp-callbacks"></a>

이 계층은 일단의 콜백 인터페이스를 노출시키는데, 애플리케이션 계층에 알리는 데 사용됩니다. 이들 콜백 인터페이스에는 다음이 포함됩니다.


+ **서비스 콜백 인터페이스(`CallbackProvider`): **라이브러리는 스트림을 생성하고, 스트림 설명을 가져오고, 스트림을 삭제할 때이 인터페이스를 통해 가져온 이벤트를 호출합니다.
+ **클라이언트 준비 상태 또는 스토리지 이벤트 부족 인터페이스(`ClientCallbackProvider`):** 라이브러리는 클라이언트가 준비되거나 사용 가능한 스토리지 또는 메모리가 부족할 수 있음을 감지하면이 인터페이스에서 이벤트를 호출합니다.
+ **스트림 이벤트 콜백 인터페이스(`StreamCallbackProvider`):** 라이브러리는 준비 상태로 전환되는 스트림, 삭제된 프레임 또는 스트림 오류와 같은 스트림 이벤트가 발생할 때이 인터페이스에서 이벤트를 호출합니다.

Kinesis Video Streams는 이러한 인터페이스에 대한 기본 구현을 제공합니다. 사용자 지정 네트워킹 로직이 필요하거나 사용자 인터페이스에 낮은 스토리지 조건을 노출하려는 경우 자체 사용자 지정 구현을 제공할 수도 있습니다.

생산자 라이브러리의 콜백에 대한 자세한 내용은 섹션을 참조하세요[생산자 SDK 콜백](producer-reference-callbacks.md).

## 절차: C\$1\$1 생산자 SDK 사용
<a name="producer-sdk-cpp-using"></a>

이 절차에서는 C\$1\$1 애플리케이션에서 Kinesis Video Streams 클라이언트 및 미디어 소스를 사용하여 Kinesis 비디오 스트림으로 데이터를 전송하는 방법을 보여줍니다.

이 절차에는 다음 단계가 포함됩니다.

**Topics**

# 사전 조건
<a name="producer-sdk-cpp-prerequisites"></a>

C\$1\$1 생산자 SDK를 설정하기 전에 다음 사전 조건이 있는지 확인합니다.
+ **자격 증명:** 샘플 코드에서 자격 증명 프로필 파일에 설정한 AWS 프로필을 지정하여 자격 증명을 제공합니다. 아직 설정하지 않았다면 먼저 자격 증명 프로필을 설정합니다.

  자세한 내용은 [개발을 위한 자격 AWS 증명 및 리전 설정을 참조하세요](https://docs.aws.amazon.com//sdk-for-java/v1/developer-guide/setup-credentials.html).
+ **인증서 스토어 통합:** Kinesis Video Streams 생산자 라이브러리는 호출하는 서비스와 신뢰를 구축해야 합니다. 이는 퍼블릭 인증서 스토어에서 인증 기관(CAs)을 검증하여 수행됩니다. Linux 기반 모델은 이 스토어가 `/etc/ssl`/ 디렉터리에 위치합니다.

  다음 위치에서 인증 스토어로 인증서를 다운로드합니다.

  [https://www.amazontrust.com/repository/SFSRootCAG2.pem](https://www.amazontrust.com/repository/SFSRootCAG2.pem)
+ 다음의 macOS용 빌드 종속성을 설치합니다.
  + [Autoconf 2.69](http://www.gnu.org/software/autoconf/autoconf.html) (라이선스 GPLv3\$1/Autoconf: GNU GPL 버전 3 이상) 
  + [CMake 3.7 또는 3.8](https://cmake.org/)
  + [Pkg-Config](https://www.freedesktop.org/wiki/Software/pkg-config/)
  + xCode(macOS)/clang/gcc(xcode-select 버전 2347)
  + Java Development Kit (JDK) (Java JNI 컴파일용)
  + [Lib-Pkg](https://github.com/freebsd/pkg/tree/master/libpkg)
+ Ubuntu에 대해 다음 빌드 종속성을 설치합니다.
  + Git: `sudo apt install git`
  + [CMake](http://kitware.com/cmake): `sudo apt install cmake`
  + G\$1\$1: `sudo apt install g++`
  + pkg-config: `sudo apt install pkg-config`
  + OpenJDK: `sudo apt install openjdk-8-jdk`
**참고**  
이는 Java 네이티브 인터페이스(JNI)를 빌드하는 경우에만 필요합니다.
  + `JAVA_HOME` 환경 변수 설정: `export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/`

# C\$1\$1 생산자 라이브러리 코드 다운로드 및 구성
<a name="producersdk-cpp-download"></a>

C\$1\$1 생산자 라이브러리를 다운로드하고 구성하는 방법에 대한 자세한 내용은 [Amazon Kinesis Video Streams CPP 생산자, GStreamer 플러그인 및 JNI](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp)를 참조하세요.

이 예제에 대한 사전 조건 및 자세한 내용은 섹션을 참조하세요[C\$1\$1 생산자 라이브러리 사용](producer-sdk-cpp.md).

## CMake 인수
<a name="cmake-arguments"></a>

다음은 C\$1\$1 생산자 SDK별 CMake 인수에 대한 참조 테이블입니다. [표준 CMake 옵션을](https://cmake.org/cmake/help/latest/manual/cmake-env-variables.7.html) CMake에 전달할 수도 있습니다.

**중요**  
모두 선택 사항입니다.

**특정 기능을 포함하거나 제외하기 위한 플래그**


| CMake 인수 | Type | 기본값 | 설명 | 
| --- | --- | --- | --- | 
| `BUILD_DEPENDENCIES` |  부울  |  ON  | 소스에서 종속성을 빌드합니다. 그렇지 않으면 시스템에 이미 설치된 종속성을 사용합니다. 필요한 종속성 중 하나를 찾을 수 없는 경우 오류가 반환됩니다. | 
| `BUILD_GSTREAMER_PLUGIN` | 부울 |  OFF  | kvssink GStreamer 플러그인을 빌드합니다. | 
|  `BUILD_JNI`  | 부울 |  OFF  | Java 런타임 환경에서이 코드를 호출할 수 있도록 Java 네이티브 인터페이스(JNI)를 빌드합니다. | 
|  `ALIGNED_MEMORY_MODEL`  | 부울 |  OFF  | 메모리 할당을 8바이트 경계에 맞춰야 하는 경우. 일부 아키텍처는 정렬되지 않은 메모리 액세스를 허용하지 않습니다. | 
| `CONSTRAINED_DEVICE` | 부울 |  OFF  | Windows 이외 전용. ON일 때 스레드 스택 크기를 로 설정합니다0.5 MiB. [Alpine Linux](https://wiki.alpinelinux.org/wiki/Main_Page) 빌드에 필요합니다. 그렇지 않으면 운영 체제 기본값이 사용됩니다. | 
|  `BUILD_STATIC`  | 부울 |  OFF  | 라이브러리와 실행 파일을 [공유](https://en.wikipedia.org/wiki/Shared_library)(OFF) 또는 [정적](https://en.wikipedia.org/wiki/Static_library)(ON)으로 빌드합니다. | 
|  `ADD_MUCLIBC`  | 부울 |  OFF  | 임베디드 시스템용으로 설계된 더 작은 C 표준 라이브러리인 표준 C 라이브러리 대신 [uClibc](https://en.wikipedia.org/wiki/UClibc)에 연결합니다. | 
|  `OPEN_SRC_INSTALL_PREFIX`  |  문자열  | ../오픈 소스/로컬 | 소스에서 빌드하는 경우 오픈 소스 종속성을 설치할 위치입니다. | 

**교차 컴파일을 위한 플래그**

**중요**  
대상 및 호스트 머신 CPU 아키텍처가 다른 경우 이를 설정합니다.


| CMake 인수 | Type | 기본값 | 설명 | 
| --- | --- | --- | --- | 
| `BUILD_LOG4CPLUS_HOST` |  문자열  |  ""  | 지정된 CPU 아키텍처에 대한 log4cplus 종속성을 구축합니다. 설정하지 않으면 log4cplus가 호스트 시스템의 CPU 아키텍처를 자동으로 감지하고 사용합니다. | 
| `BUILD_OPENSSL_PLATFORM`  |  문자열  |  ""  | 지정된 CPU 아키텍처에 대한 OpenSSL 종속성을 구축합니다. 설정하지 않으면 OpenSSL가 호스트 시스템의 CPU 아키텍처를 자동으로 감지하고 사용합니다. | 

**테스트와 관련된 플래그**


| CMake 인수 | Type | 기본값 | 설명 | 
| --- | --- | --- | --- | 
| `BUILD_TEST` |  부울  |  OFF  | 단위 및 통합 테스트를 빌드합니다. 모든 테스트를 실행하려면 빌드 디렉터리./tst/producerTest에서를 실행합니다. AWS 테스트를 실행하려면 자격 증명이 필요합니다. | 
| `CODE_COVERAGE` | 부울 | OFF | GNU/Clang 컴파일러에만 사용할 수 있습니다. [gcov](https://gcc.gnu.org/onlinedocs/gcc/Gcov.html) 및 보고서 생성을 통해 코드 적용 범위 수집을 활성화합니다. | 
| `COMPILER_WARNINGS` | 부울 | OFF | GNU/Clang 컴파일러에만 사용할 수 있습니다. 모든 컴파일러 경고를 활성화합니다. | 
| `ADDRESS_SANITIZER` | 부울 | OFF | GNU/Clang 컴파일러에만 사용할 수 있습니다. [AddressSanitizer](https://compiler-rt.llvm.org/)로 빌드합니다. | 
| `MEMORY_SANITIZER` | 부울 | OFF | GNU/Clang 컴파일러에만 사용할 수 있습니다. [MemorySanitizer](https://compiler-rt.llvm.org/)를 사용하여 빌드합니다. | 
| `THREAD_SANITIZER` | 부울 | OFF | GNU/Clang 컴파일러에만 사용할 수 있습니다. [ThreadSanitizer](https://compiler-rt.llvm.org/)로 빌드합니다. | 
| `UNDEFINED_BEHAVIOR_SANITIZER` | 부울 | OFF | GNU/Clang 컴파일러에만 사용할 수 있습니다. [UndefinedBehaviorSanitizer](https://compiler-rt.llvm.org/)를 사용하여 빌드합니다. | 

이러한 CMake 인수를 사용하려면 `cmake ..` 명령에 따라 공백으로 구분된 `-Dkey=value` 페어 목록으로 전달합니다. 예제:

```
cmake .. -DBUILD_GSTREAMER_PLUGIN=ON -DBUILD_DEPENDENCIES=OFF -DALIGNED_MEMORY_MODEL=ON 
```

CMake는 `$PATH` 변수에 따라 컴파일러 도구 체인을 찾습니다. CMake를 실행하기 전에 교차 컴파일에 사용할 도구 체인을 명시적으로 설정하도록 `CC` 및 `CXX` 환경 변수를 설정합니다.

# 코드 작성 및 검사
<a name="producersdk-cpp-write"></a>

의이 섹션에서는 C\$1\$1 테스트 도구(`tst/ProducerTestFixture.h` 및 기타 파일)의 코드를 [C\$1\$1 생산자 라이브러리 사용](producer-sdk-cpp.md)검사합니다. 이전 단원에서 이 코드를 다운로드했습니다.

**비종속 플랫폼** C\$1\$1 예제는 다음과 같은 코딩 패턴을 보여 줍니다.
+ 의 인스턴스를 생성`KinesisVideoProducer`하여 Kinesis Video Streams에 액세스합니다.
+ `KinesisVideoStream`의 인스턴스를 만듭니다. 이렇게 하면 동일한 이름의 스트림이 아직 없는 AWS 계정 경우에 Kinesis 비디오 스트림이 생성됩니다.
+ 가용한 경우 모든 데이터 프레임에 대해 `putFrame`을 `KinesisVideoStream`에 호출하여 스트림에 전송합니다.

다음 섹션에서는이 코딩 패턴에 대한 자세한 정보를 제공합니다.



## KinesisVideoProducer 인스턴스 생성
<a name="producersdk-cpp-write-create-producer"></a>

`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(스트림) \$1 3(분) \$1 60(분당 초) \$1 10000(kb) \$1 1.2(분할 허용량) = 194.4Mb \$1 200Mb**입니다.
+ 특정 클라이언트의 이벤트를 보고하는 함수 별칭을 반환하는 `ClientCallbackProvider` 객체.
+ 특정 스트림의 이벤트가 발생할 때 콜백되는 함수 별칭을 반환하는 `StreamCallbackProvider` 객체.
+ 자격 증명 환경 변수에 AWS 대한 액세스를 제공하는 `CredentialProvider` 객체입니다.
+  AWS 리전 ("us-west-2"). 서비스 엔드포인트는 리전으로부터 결정됩니다.

## KinesisVideoStream 인스턴스 생성
<a name="producersdk-cpp-write-create-stream"></a>

`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의 데이터 보호](how-kms.md) 단원을 참조하십시오.
+ 스트리밍 유형. 현재 유일한 유효 값은 `STREAMING_TYPE_REALTIME`입니다.
+ 미디어 콘텐츠 유형.
+ 미디어 지연 시간. 이 값은 현재 사용되지 않으므로 0으로 설정해야 합니다.
+ 각 조각의 재생 시간.
+ 미디어 타임코드 척도.
+ 미디어가 키 프레임 조각을 사용하는지 여부.
+ 미디어가 타임코드를 사용하는지 여부.
+ 미디어가 절대 조각 시간을 사용하는지 여부.

## Kinesis 비디오 스트림에 오디오 트랙 추가
<a name="producersdk-cpp-write-add-audiotrack-to-stream"></a>

의 `addTrack` 메서드를 사용하여 비디오 트랙 스트림 정의에 오디오 트랙 세부 정보를 추가할 수 있습니다`StreamDefinition`.

```
stream_definition->addTrack(DEFAULT_AUDIO_TRACKID, DEFAULT_AUDIO_TRACK_NAME, DEFAULT_AUDIO_CODEC_ID, MKV_TRACK_INFO_TYPE_AUDIO);
```

`addTrack` 메서드에는 다음 파라미터가 필요합니다.
+ Track id(오디오용 1). 이 값은 고유한 값으로서 0이 아니어야 합니다.
+ 사용자 정의 트랙 이름(예: 오디오 트랙의 경우 "audio").
+ 이 트랙의 코덱 ID(예: 오디오 트랙 "A\$1AAC"의 경우).
+ 트랙 유형(예: 오디오에 MKV\$1TRACK\$1INFO\$1TYPE\$1AUDIO의 열거형 값 사용).

오디오 트랙용 코덱 프라이빗 데이터가 있는 경우, addTrack 함수를 호출할 때 해당 데이터를 전달할 수 있습니다. KinesisVideoStream에서 시작 방법을 호출하는 동안 KinesisVideoStream 객체를 생성한 후에 코덱 프라이빗 데이터를 전달할 수도 있습니다.

## Kinesis 비디오 스트림에 프레임 넣기
<a name="producersdk-cpp-write-putframe"></a>

를 사용하여 Kinesis 비디오 스트림에 미디어를 넣고 헤더 및 미디어 데이터가 포함된 `Frame` 객체를 `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\$1\$1 생산자 예제에서는 테스트 데이터의 버퍼를 전송합니다. 실제 애플리케이션에서는 미디어 소스(에: 카메라)의 프레임 데이터로부터 프레임 버퍼 및 크기를 알아야 합니다.

`Frame` 객체에는 다음의 필드가 있습니다.
+ 프레임 인덱스. 이는 단순 점증 값이어야 합니다.
+ 프레임과 관련된 플래그. 예를 들어, 인코더가 키 프레임을 생산하도록 구성되어 있다면 이 프레임에는 `FRAME_FLAG_KEY_FRAME` 플래그가 할당될 것입니다.
+ 타임스탬프 디코딩.
+ 프레젠테이션 타임스탬프입니다.
+ 프레임 지속 시간(최대 100 ns 단위).
+ 프레임 크기(바이트).
+ 프레임 데이터.

프레임 형식에 대한 자세한 내용은 섹션을 참조하세요[Kinesis Video Streams 데이터 모델](how-data.md).

## KinesisVideoStream의 특정 트랙에 KinesisVideoFrame 넣기 KinesisVideoStream
<a name="producersdk-cpp-write-putframeintospecifictrack"></a>

`PutFrameHelper` 클래스를 사용하여 프레임 데이터를 특정 트랙에 넣을 수 있습니다. 먼저를 호출`getFrameDataBuffer`하여 미리 할당된 버퍼 중 하나에 대한 포인터를 가져와 `KinesisVideoFrame` 데이터를 채웁니다. 그런 다음를 호출`putFrameMultiTrack`하여 부울 값과 `KinesisVideoFrame` 함께를 전송하여 프레임 데이터 유형을 나타낼 수 있습니다. 비디오 데이터이면 true를 사용하고, 프레임에 오디오 데이터가 포함되어 있으면 false를 사용합니다. `putFrameMultiTrack` 메서드는 대기열 메커니즘을 사용하여 MKV 조각이 단조롭게 증가하는 프레임 타임스탬프를 유지하고 두 조각이 겹치지 않도록 합니다. 예를 들어 조각의 첫 번째 프레임의 MKV 타임스탬프는 항상 이전 조각의 마지막 프레임의 MKV 타임스탬프보다 커야 합니다.

`PutFrameHelper`에는 다음 필드가 있습니다.
+ 대기열의 최대 오디오 프레임 수입니다.
+ 대기열의 최대 비디오 프레임 수입니다.
+ 단일 오디오 프레임에 할당할 크기입니다.
+ 단일 비디오 프레임에 할당할 크기입니다.

## 액세스 지표 및 지표 로깅
<a name="producersdk-cpp-write-metrics"></a>

C\$1\$1 생산자 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:** 콘텐츠 스토어의 전체 크기(바이트)(스트리밍 데이터 저장에 사용되는 메모리)입니다.
+ **contentStoreAvailableSize:** 콘텐츠 스토어에서 사용 가능한 메모리를 바이트 단위로 표시합니다.
+ **contentStoreAllocatedSize:** 콘텐츠 스토어에 할당된 메모리입니다.
+ **totalContentViewsSize:** 콘텐츠 보기에 사용되는 전체 메모리입니다. 콘텐츠 보기는 콘텐츠 스토어의 일련의 정보 인덱스입니다.
+ **totalFrameRate:** 전체 활성 스트림에 누적되어 있는 초당 프레임 수입니다.
+ **totalTransferRate:** 모든 스트림에서 전송 중인 전체 초당 비트(bps)입니다.

`getKinesisVideoStreamMetrics`로 채워지는 `PStreamMetrics` 객체에는 다음 정보가 포함되어 있습니다.
+ **currentViewDuration:** 콘텐츠 뷰의 헤드(프레임이 인코딩되는 경우)와 현재 위치(프레임 데이터가 Kinesis Video Streams로 전송되는 경우) 간의 100ns 단위 차이입니다.
+ **overallViewDuration:** 콘텐츠 뷰의 헤드(프레임 인코딩 시)와 테일(콘텐츠 뷰에 할당된 총 공간을 초과하거나 Kinesis Video Streams에서 `PersistedAck` 메시지를 수신하고 지속된 것으로 알려진 프레임이 플러시되기 때문에 프레임이 메모리에서 플러시되는 경우) 간의 100ns 단위 차이입니다.
+ **currentViewSize:** 헤드(프레임 인코딩 시)에서 현재 위치(프레임이 Kinesis Video Streams로 전송되는 경우)까지의 콘텐츠 보기의 바이트 크기입니다.
+ **overallViewSize:** 콘텐츠 보기의 총 크기(바이트)입니다.
+ **currentFrameRate:** 스트림 레이트의 최종 측정값입니다(초당 프레임 단위).
+ **currentTransferRate:** 스트림 레이트의 최종 측정값입니다(초당 바이트 단위).

## 해제
<a name="producersdk-cpp-write-teardown"></a>

나머지 바이트를 버퍼에 넣고 `ACK`를 대기하려는 경우 `stopSync`를 사용할 수 있습니다.

```
kinesis_video_stream->stopSync();            
```

또는 `stop`를 호출하여 스트리밍을 종료할 수 있습니다.

```
kinesis_video_stream->stop();            
```

스트리밍이 중지된 후 다음 API를 호출하여 스트림을 해제할 수 있습니다.

```
kinesis_video_producer_->freeStream(kinesis_video_stream);            
```

# 코드 실행 및 확인
<a name="producersdk-cpp-test"></a>

에 대한 코드를 실행하고 확인하려면 다음 OS 관련 지침을 [C\$1\$1 생산자 라이브러리 사용](producer-sdk-cpp.md)참조하세요.
+ [Linux](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/docs/linux.md)
+ [macOS](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/docs/macos.md)
+ [Windows](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/docs/windows.md)
+ [Raspberry Pi OS](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/docs/raspberry-pi.md)

와 같은 Amazon CloudWatch 콘솔에서 스트림과 연결된 지표를 확인하여 스트림의 트래픽을 모니터링할 수 있습니다`PutMedia.IncomingBytes`.

# C\$1\$1 생산자 SDK를 GStreamer 플러그인으로 사용
<a name="producer-sdk-cpp-gstreamer"></a>

[GStreamer](https://gstreamer.freedesktop.org/)는 여러 카메라 및 비디오 소스에서 모듈식 플러그인을 결합하여 사용자 지정 미디어 파이프라인을 생성하는 데 사용되는 인기 있는 미디어 프레임워크입니다. Kinesis Video Streams GStreamer 플러그인은 기존 GStreamer 미디어 파이프라인과 Kinesis Video Streams의 통합을 간소화합니다.

C\$1\$1 생산자 SDK를 GStreamer 플러그인으로 사용하는 방법에 대한 자세한 내용은 섹션을 참조하세요[예: Kinesis Video Streams 생산자 SDK GStreamer 플러그인 - kvssink](examples-gstreamer-plugin.md).

# C\$1\$1 생산자 SDK를 Docker 컨테이너의 GStreamer 플러그인으로 사용
<a name="producer-sdk-cpp-gstreamer-docker"></a>

[GStreamer](https://gstreamer.freedesktop.org/)는 모듈식 플러그인을 결합하여 사용자 지정 미디어 파이프라인을 생성하기 위해 여러 카메라 및 비디오 소스에서 사용하는 인기 있는 미디어 프레임워크입니다. Kinesis Video Streams GStreamer 플러그인은 기존 GStreamer 미디어 파이프라인과 Kinesis Video Streams의 통합을 간소화합니다.

또한 [Docker]()를 사용하여 GStreamer 파이프라인을 생성하면 Kinesis Video Streams의 운영 환경이 표준화되어 애플리케이션 구축 및 실행이 간소화됩니다.

C\$1\$1 생산자 SDK를 Docker 컨테이너의 GStreamer 플러그인으로 사용하는 방법에 대한 자세한 내용은 섹션을 참조하세요[Docker 컨테이너에서 GStreamer 요소 실행](examples-gstreamer-plugin.md#examples-gstreamer-plugin-docker).

# C\$1\$1 생산자 SDK에서 로깅 사용
<a name="producer-sdk-cpp-logging"></a>

`kinesis-video-native-build` 폴더의 `kvs_log_configuration` 파일에서 C\$1\$1 생산자 SDK 애플리케이션에 대한 로깅을 구성합니다.

다음 예제는 `DEBUG` 수준 로그 항목을 AWS Management Console에 기록하는 애플리케이션을 구성하는 기본 구성 파일의 첫 번째 줄을 보여줍니다.

```
log4cplus.rootLogger=DEBUG, KvsConsoleAppender
```

로깅 수순을 `INFO`로 설정하여 로깅 상세도를 낮출 수 있습니다.

로그 파일에 로그 항목을 쓰도록 애플리케이션을 구성하려면 파일의 첫 번째 줄을 다음과 같이 업데이트합니다.

```
log4cplus.rootLogger=DEBUG, KvsConsoleAppender, KvsFileAppender
```

그러면 애플리케이션이 `kvs.log` 폴더의 `kinesis-video-native-build/log`에 로그 항목을 기록하도록 구성됩니다.

로그 파일 위치를 변경하려면 다음 줄을 새 경로로 수정합니다.

```
log4cplus.appender.KvsFileAppender.File=./log/kvs.log
```

**참고**  
`DEBUG` 수준 로깅이 파일에 기록될 경우 로그 파일이 디바이스의 가용 저장 공간을 빠르게 소모할 수 있습니다.