

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

# C 생산자 라이브러리 사용
<a name="producer-sdk-c-api"></a>

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

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

Kinesis Video Streams C 생산자 라이브러리는 [https://github.com/awslabs/amazon-kinesis-video-streams-pic/](https://github.com/awslabs/amazon-kinesis-video-streams-pic/) GitHub에서 사용할 수 있는 플랫폼 독립 코드베이스(PIC)라는 공통 구성 요소를 기반으로 합니다. PIC에는 기본 구성 요소에 대한 플랫폼 독립적 비즈니스 로직이 포함되어 있습니다. Kinesis Video Streams C 생산자 라이브러리는 시나리오 및 플랫폼별 콜백과 이벤트를 허용하는 추가 API 계층으로 PIC를 래핑합니다. Kinesis Video Streams C 생산자 라이브러리에는 PIC를 기반으로 구축된 다음 구성 요소가 있습니다.
+ **디바이스 정보 공급자** - PIC API에 직접 제공할 수 있는 `DeviceInfo` 구조를 노출합니다. 애플리케이션이 처리하는 스트림의 수와 유형, 사용 가능한 RAM의 양에 따라 구성된 필수 버퍼링 양에 따라 콘텐츠 스토어를 최적화할 수 있는 애플리케이션 시나리오 최적화 공급자를 비롯한 공급자 세트를 구성할 수 있습니다.
+ **스트림 정보 공급자** - PIC API에 직접 제공할 수 있는 `StreamInfo` 구조를 노출합니다. 애플리케이션 유형 및 일반적인 스트리밍 시나리오 유형과 관련된 공급자 세트가 있습니다. 여기에는 비디오, 오디오, 오디오 및 비디오 멀티트랙과 같은 공급자가 포함됩니다. 이러한 각 시나리오에는 애플리케이션의 요구 사항에 따라 사용자 지정할 수 있는 기본값이 있습니다.
+ **콜백 공급자** - PIC API에 직접 제공할 수 있는 `ClientCallbacks` 구조를 노출합니다. 여기에는 네트워킹(CURL 기반 API 콜백), 권한 부여(AWS 자격 증명 API) 및 오류 콜백에 대한 스트리밍 재시도를 위한 콜백 공급자 세트가 포함됩니다. 콜백 공급자 API는 AWS 리전 및 권한 부여 정보와 같이 구성할 여러 인수를 가져옵니다. 이는 IoT 인증서를 사용하거나 AccessKeyId, SecretKey 또는 SessionToken을 사용하여 AWS 수행됩니다. 애플리케이션에서 일부 애플리케이션별 로직을 구현하기 위해 특정 콜백을 추가로 처리해야 하는 경우 사용자 지정 콜백으로 콜백 공급자를 향상할 수 있습니다.
+ **FrameOrderCoordinator** - 다중 트랙 시나리오에 대한 오디오 및 비디오 동기화를 처리하는 데 도움이 됩니다. 애플리케이션의 특정 로직을 처리하도록 사용자 지정할 수 있는 기본 동작이 있습니다. 또한 하위 계층 PIC API에 제출하기 전에 PIC 프레임 구조의 프레임 메타데이터 패키징을 간소화합니다. 멀티 트랙이 아닌 시나리오의 경우 이 구성 요소는 PIC putFrame API에 대한 패스스루입니다.

C 라이브러리는 Kinesis 비디오 스트림에 대한 데이터 전송을 관리하기 위해 다음과 같은 객체를 제공합니다.
+ **KinesisVideoClient** - 디바이스에 대한 정보를 포함하고 Kinesis Video Streams 이벤트에 대해 보고할 콜백을 유지합니다.
+ **KinesisVideoStream** - 이름, 데이터 보존 기간 및 미디어 콘텐츠 유형과 같은 비디오 스트림의 파라미터에 대한 정보를 나타냅니다.

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

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

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

이 절차에서는 C 애플리케이션에서 Kinesis Video Streams 클라이언트 및 미디어 소스를 사용하여 H.264 인코딩 비디오 프레임을 Kinesis 비디오 스트림으로 전송하는 방법을 보여줍니다.

이 절차에는 다음 단계가 포함됩니다.
+ [C 생산자 라이브러리 코드 다운로드](producersdk-c-download.md)
+ [코드 작성 및 검사](producersdk-c-write.md)
+ [코드 실행 및 확인](producersdk-c-test.md)

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

C 생산자 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_HOME` 환경 변수 설정: `export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/`

# C 생산자 라이브러리 코드 다운로드
<a name="producersdk-c-download"></a>

이 단원에서는 하위 수준 라이브러리를 다운로드합니다. 이 예제에 대한 사전 조건 및 기타 세부 정보는 섹션을 참조하세요[C\$1\$1 생산자 라이브러리 사용](producer-sdk-cpp.md).





1. 디렉터리를 생성한 다음 GitHub 리포지토리에서 예제 소스 코드를 복제합니다.

   ```
   git clone --recursive https://github.com/awslabs/amazon-kinesis-video-streams-producer-c.git
   ```
**참고**  
`--recursive`와 함께 git clone을 실행하지 않는 경우 `amazon-kinesis-video-streams-producer-c/open-source` 디렉터리에서 `git submodule update --init`을 실행합니다. pkg-config, CMake 및 빌드 환경도 설치해야 합니다.  
자세한 내용은 [https://github.com/awslabs/amazon-kinesis-video-streams-producer-c.git](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c.git) `README.md`를 참조하세요.

1. 여러분이 선택한 통합 개발 환경(IDE)(예: [Eclipse](https://www.eclipse.org/))에서 코드를 엽니다.

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

이 섹션에서는 GitHub의 [https://github.com/awslabs/amazon-kinesis-video-streams-producer-c](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c) 리포지토리 `samples` 폴더에 `KvsVideoOnlyStreamingSample.c` 있는 샘플 애플리케이션의 코드를 살펴봅니다. 이전 단계에서 이 코드를 다운로드했습니다. 이 샘플은 C 생산자 라이브러리를 사용하여 폴더 내부의 H.264 인코딩 비디오 프레임을 Kinesis 비디오 스트림`samples/h264SampleFrames`으로 전송하는 방법을 보여줍니다.

이 샘플 애플리케이션에는 세 개의 섹션이 있습니다.
+ 초기화 및 구성:
  + 플랫폼별 미디어 파이프라인 초기화 및 구성.
  + 파이프라인에 대한 KinesisVideoClient 및 KinesisVideoStream 초기화 및 구성, 콜백 설정, 시나리오별 인증 통합, 코덱 프라이빗 데이터 추출 및 제출, READY 상태로 스트림 가져오기.
+ 기본 루프:
  + 타임스탬프 및 플래그와 함께 미디어 파이프라인에서 프레임 가져오기.
  + KinesisVideoStream에 프레임 제출.
+ 해제:
  + (동기화) KinesisVideoStream 중지, KinesisVideoStream 확보, KinesisVideoClient 확보.

이 샘플 애플리케이션은 다음 작업을 완료합니다.
+ `createDefaultDeviceInfo` API를 호출하여 디바이스 또는 스토리지 구성에 대한 정보가 포함된 `deviceInfo` 객체를 생성합니다.

  ```
  // default storage size is 128MB. Use setDeviceInfoStorageSize after create to change storage size.
  CHK_STATUS(createDefaultDeviceInfo(&pDeviceInfo));
  // adjust members of pDeviceInfo here if needed
      pDeviceInfo->clientInfo.loggerLogLevel = LOG_LEVEL_DEBUG;
  ```
+ `createRealtimeVideoStreamInfoProvider` API를 호출하여 `StreamInfo` 객체를 생성합니다.

  ```
  CHK_STATUS(createRealtimeVideoStreamInfoProvider(streamName, DEFAULT_RETENTION_PERIOD, DEFAULT_BUFFER_DURATION, &pStreamInfo));
  // adjust members of pStreamInfo here if needed
  ```
+ `createDefaultCallbacksProviderWithAwsCredentials` API를 호출하여 정적 AWS 자격 증명을 기반으로 기본 콜백 공급자를 생성합니다.

  ```
  CHK_STATUS(createDefaultCallbacksProviderWithAwsCredentials(accessKey,
                                                                  secretKey,
                                                                  sessionToken,
                                                                  MAX_UINT64,
                                                                  region,
                                                                  cacertPath,
                                                                  NULL,
                                                                  NULL,
                                                                  FALSE,
                                                                  &pClientCallbacks));
  ```
+ `createKinesisVideoClient` API를 호출하여 디바이스 스토리지에 대한 정보가 포함된 `KinesisVideoClient` 객체를 생성하고 Kinesis Video Streams 이벤트에 대해 보고할 콜백을 유지합니다.

  ```
  CHK_STATUS(createKinesisVideoClient(pDeviceInfo, pClientCallbacks, &clientHandle));                
  ```
+ `createKinesisVideoStreamSync` API를 호출하여 `KinesisVideoStream` 객체를 생성합니다.

  ```
  CHK_STATUS(createKinesisVideoStreamSync(clientHandle, pStreamInfo, &streamHandle));                
  ```
+ 샘플 프레임을 설정하고 `PutKinesisVideoFrame` API를 호출하여 해당 프레임을 `KinesisVideoStream` 객체로 전송합니다.

  ```
   // 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;
  
      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));
  
          CHK_STATUS(putKinesisVideoFrame(streamHandle, &frame));
          defaultThreadSleep(frame.duration);
  
          frame.decodingTs += frame.duration;
          frame.presentationTs = frame.decodingTs;
          frameIndex++;
          fileIndex++;
          fileIndex = fileIndex % NUMBER_OF_FRAME_FILES;
      }
  ```
+ 해제:

  ```
  CHK_STATUS(stopKinesisVideoStreamSync(streamHandle));
  CHK_STATUS(freeKinesisVideoStream(&streamHandle));
  CHK_STATUS(freeKinesisVideoClient(&clientHandle));
  ```

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



에 대한 코드를 실행하고 확인하려면 다음을 [C\$1\$1 생산자 라이브러리 사용](producer-sdk-cpp.md)수행합니다.

1. 다음 명령을 실행하여 [다운로드한 C SDK](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c.git)에서 `build` 디렉터리를 생성하고 디렉터리`cmake`에서 시작합니다.

   ```
   mkdir -p amazon-kinesis-video-streams-producer-c/build; 
   cd amazon-kinesis-video-streams-producer-c/build; 
   cmake ..
   ```

   `cmake ..`에 다음 옵션을 사용할 수 있습니다.
   + `-DBUILD_DEPENDENCIES` - 소스에서 종속 라이브러리를 빌드할지 여부입니다.
   + `-DBUILD_TEST=TRUE` - 빌드 단위 및 통합 테스트. 디바이스에 대한 지원을 확인하는 데 유용할 수 있습니다.

     `./tst/webrtc_client_test`
   + `-DCODE_COVERAGE` - 적용 범위 보고를 활성화합니다.
   + `-DCOMPILER_WARNINGS` - 모든 컴파일러 경고를 활성화합니다.
   + `-DADDRESS_SANITIZER` - AddressSanitizer로 빌드합니다.
   + `-DMEMORY_SANITIZER` - MemorySanitizer로 빌드합니다.
   + `-DTHREAD_SANITIZER` - ThreadSanitizer로 빌드합니다.
   + `-DUNDEFINED_BEHAVIOR_SANITIZER` - UndefinedBehaviorSanitizer로 빌드합니다.
   + `-DALIGNED_MEMORY_MODEL` - 정렬된 메모리 모델 전용 디바이스용으로 빌드 기본값은 `OFF`입니다.

1. 이전 단계로 방금 생성한 `build` 디렉터리로 이동하여를 실행`make`하여 WebRTC C SDK와 제공된 샘플을 빌드합니다.

   ```
   make                
   ```

1. 샘플 애플리케이션은 폴더 내의 h.264 인코딩 비디오 프레임을 Kinesis Video Streams`samples/h264SampleFrames`로 `kinesis_video_cproducer_video_only_sample` 전송합니다. 다음 명령은 10초 동안 루프의 비디오 프레임을 Kinesis Video Streams로 전송합니다.

   ```
   ./kinesis_video_cproducer_video_only_sample YourStreamName 10
   ```

   다른 폴더(예: `MyH264FramesFolder`)에서 H.264 인코딩 프레임을 보내려면 다음 인수를 사용하여 샘플을 실행합니다.

   ```
   ./kinesis_video_cproducer_video_only_sample YourStreamName 10 MyH264FramesFolder
   ```

1. 세부 정보 표시 로그를 활성화하려면 `CMakeList.txt`에서 해당 라인의 주석을 제거하여 `HEAP_DEBUG` 및 `LOG_STREAMING` C-정의를 정의합니다.

IDE의 디버그 출력에서 테스트 제품군의 진행 상황을 모니터링할 수 있습니다. 와 같은 Amazon CloudWatch 콘솔에서 스트림과 연결된 지표를 확인하여 스트림의 트래픽을 모니터링할 수도 있습니다`PutMedia.IncomingBytes`.

**참고**  
테스트 도구가 빈 바이트의 프레임만 전송하기 때문에 콘솔은 데이터를 비디오 스트림으로 표시하지 않습니다.