

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

# Kinesis Video Streams에 업로드
<a name="producer-sdk"></a>

Amazon Kinesis Video Streams 생산자 라이브러리는 Kinesis Video Streams 생산자 SDK의 라이브러리 세트입니다. 클라이언트는 라이브러리와 SDK를 사용하여 Kinesis Video Streams에 안전하게 연결하고 콘솔 또는 클라이언트 애플리케이션에서 실시간으로 볼 수 있도록 미디어 데이터를 스트리밍하기 위한 온디바이스 애플리케이션을 구축합니다.

다음과 같은 방식으로 미디어 데이터를 스트리밍할 수 있습니다.
+ 실시간
+ 몇 초 동안 버퍼링한 후
+ 미디어 업로드 후

Kinesis Video Streams 스트림을 생성한 후 해당 스트림으로 데이터 전송을 시작할 수 있습니다. SDK를 사용하여 미디어 소스에서 프레임이라고 하는 비디오 데이터를 추출하여 Kinesis Video Streams에 업로드하는 애플리케이션 코드를 생성할 수 있습니다. 이러한 애플리케이션을 *생산자* 애플리케이션이라고도 합니다.

생산자 라이브러리에는 다음 구성 요소가 포함되어 있습니다.
+ [Kinesis Video Streams 생산자 클라이언트](#producer-sdk-client)
+ [Kinesis Video Streams 생산자 라이브러리](#producer-sdk-library)

## Kinesis Video Streams 생산자 클라이언트
<a name="producer-sdk-client"></a>

Kinesis Video Streams 생산자 클라이언트에는 단일 `KinesisVideoClient` 클래스가 포함됩니다. 이 클래스는 미디어 소스를 관리하고, 소스에서 데이터를 수신하고, 미디어 소스에서 Kinesis Video Streams로 데이터가 흐를 때 스트림 수명 주기를 관리합니다. 또한 Kinesis Video Streams와 독점 하드웨어 및 소프트웨어 간의 상호 작용을 정의하는 `MediaSource` 인터페이스를 제공합니다.

미디어 원본은 거의 모든 것이 될 수 있습니다. 예를 들어, 카메라 미디어 원본 또는 마이크 미디어 원본을 사용할 수 있습니다. 미디어 원본은 오디오 및 비디오 원본만으로 국한되지 않습니다. 예를 들어, 데이터 로그는 텍스트 파일이어야 하지만, 데이터 스트림으로도 전송할 수 있습니다. 데이터를 동시에 스트리밍하는 여러 대의 카메라를 스마트폰에 탑재할 수도 있습니다.

임의의 원본으로부터 데이터를 얻기 위해서는 `MediaSource` 인터페이스를 구현해야 합니다. 이 인터페이스는 기본적으로는 지원하지 않는 추가적인 시나리오도 구현할 수 있습니다. 예를 들어 다음을 Kinesis Video Streams로 전송하도록 선택할 수 있습니다.
+ 진단 데이터 스트림(예: 애플리케이션 로그 및 이벤트)
+ 적외선 카메라, RADAR 또는 깊이 카메라의 데이터

Kinesis Video Streams는 카메라와 같은 미디어 생성 디바이스에 기본 제공 구현을 제공하지 않습니다. 이러한 디바이스로부터 데이터를 추출하려면 코드를 구현해야 하기 때문에 자체적인 미디어 원본 구현을 생성해야 합니다. 그런 다음 Kinesis Video Streams에 데이터를 업로드`KinesisVideoClient`하는에 사용자 지정 미디어 소스를 명시적으로 등록할 수 있습니다.

Kinesis Video Streams 생산자 클라이언트는 Java 및 Android 애플리케이션에서 사용할 수 있습니다. 자세한 내용은 [Java 생산자 라이브러리 사용](producer-sdk-javaapi.md) 및 [Android 생산자 라이브러리 사용](producer-sdk-android.md) 섹션을 참조하세요.

## Kinesis Video Streams 생산자 라이브러리
<a name="producer-sdk-library"></a>

Kinesis Video Streams 생산자 라이브러리는 Kinesis Video Streams 생산자 클라이언트에 포함되어 있습니다. 이 라이브러리는 Kinesis Video Streams와의 심층 통합을 원하는 사용자에게 직접 사용할 수도 있습니다. 전용 운영 체제, 네트워크 스택 또는 제한적 내장 리소스를 갖춘 디바이스와의 통합도 가능합니다.

Kinesis Video Streams 생산자 라이브러리는 Kinesis Video Streams로 스트리밍하기 위한 상태 시스템을 구현합니다. 사용자 자체의 전송 구현을 요구하고 서비스를 왕래하는 각 메시지를 명시적으로 처리하는 콜백 후크를 제공합니다.

다음과 같은 이유로 Kinesis Video Streams 생산자 라이브러리를 직접 사용하도록 선택할 수 있습니다.
+ 애플리케이션을 실행하고자 하는 디바이스에 Java 가상 머신이 없는 경우.
+ Java 이외의 언어로 애플리케이션 코드를 작성하고자 하는 경우.
+ 메모리 및 처리 능력과 같은 제한으로 인해 코드의 오버헤드를 줄이고 이를 최소한의 추상화 수준으로 제한하려고 합니다.

현재 Kinesis Video Streams 생산자 라이브러리는 Android, C, C\$1\$1 및 Java 애플리케이션에서 사용할 수 있습니다. 자세한 내용은 다음 *관련 주제에서 지원되는 언어를 참조하세요*.

## 생산자 라이브러리가 무엇인지 이해
<a name="producer-sdk-related-topics"></a>

 [Java 생산자 라이브러리 사용](producer-sdk-javaapi.md) 

 [Android 생산자 라이브러리 사용](producer-sdk-android.md) 

 [C\$1\$1 생산자 라이브러리 사용](producer-sdk-cpp.md) 

 [C 생산자 라이브러리 사용](producer-sdk-c-api.md) 

 [Raspberry Pi에서 C\$1\$1 생산자 SDK 사용](producersdk-cpp-rpi.md) 

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

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

애플리케이션이 Kinesis 비디오 스트림으로 데이터 스트리밍을 시작할 수 있도록 다음 단계를 수행하여 코드를 Kinesis Video Streams와 통합합니다.

1. `KinesisVideoClient` 객체의 인스턴스를 생성합니다.

1. 미디어 원본 정보를 제공하여 `MediaSource` 객체를 생성합니다. 예를 들어 카메라 미디어 원본을 생성할 때 카메라를 식별하고 카메라가 사용하는 인코딩을 지정하는 등 정보를 제공합니다.

   스트리밍을 시작하고자 할 때 사용자 지정 미디어 원본을 생성해야 합니다.

1. 미디어 원본을 `KinesisVideoClient`에 등록합니다.

   `KinesisVideoClient`에 미디어 원본을 등록한 후에 해당 미디어 원본으로 데이터를 사용할 수 있을 때 해당 데이터로 `KinesisVideoClient`를 호출합니다.

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

이 절차에서는 Java 애플리케이션에서 Kinesis Video Streams Java 생산자 클라이언트를 사용하여 Kinesis 비디오 스트림으로 데이터를 전송하는 방법을 보여줍니다.

이 단계에서는 카메라 또는 마이크와 같은 미디어 소스를 필요로 하지 않습니다. 대신 테스트 목적으로 코드가 일련의 바이트로 구성된 샘플 프레임을 생성합니다. 카메라 및 마이크와 같은 실제 소스로부터 미디어 데이터를 전송할 때 동일한 코딩 패턴을 사용할 수 있습니다.

이 절차에는 다음 단계가 포함됩니다.
+ [코드 다운로드 및 구성](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producersdk-javaapi-downloadcode.html)
+ [코드 작성 및 검사](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producersdk-javaapi-writecode.html)
+ [코드 실행 및 확인](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producersdk-javaapi-reviewcode.html)

# 사전 조건
<a name="producersdk-javaapi-prerequisites"></a>

Java 생산자 SDK를 설정하기 전에 다음 사전 조건이 있는지 확인합니다.
+ 샘플 코드에서 자격 증명 프로필 파일에 설정한 프로필을 지정하여 AWS 자격 증명을 제공합니다. 아직 설정하지 않았다면 먼저 자격 증명 프로필을 설정합니다. 자세한 내용은의 [ 개발을 위한 AWS 자격 증명 및 리전 설정을](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html) 참조하세요*AWS SDK for Java*.
**참고**  
Java 예제에서는 `SystemPropertiesCredentialsProvider` 객체를 사용하여 자격 증명을 가져옵니다. 제공자가 `aws.accessKeyId` 및 `aws.secretKey` Java 시스템 속성으로부터 이들 자격 증명을 검색합니다. Java 개발 환경에서 이 시스템 속성을 설정합니다. Java 시스템 속성 설정 방법에 관한 정보는 특정 통합 개발 환경(IDE)에 관한 문서를 참조하십시오.
+ `NativeLibraryPath`에 `KinesisVideoProducerJNI` 파일([https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp))이 있어야 합니다. 이 파일의 파일 이름 확장자는 운영 체제에 따라 다릅니다.
  + **KinesisVideoProducerJNI.so** - Linux
  + **KinesisVideoProducerJNI.dylib** - macOS
  + **KinesisVideoProducerJNI.dll** - Windows
**참고**  
macOS, Ubuntu, Windows 및 Raspbian용 사전 빌드된 라이브러리는 [https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-java.git](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-java) `src/main/resources/lib`에서 사용할 수 있습니다. 다른 환경에서는 [C\$1\$1](producer-sdk-cpp.md)를 컴파일합니다.

# Java 생산자 라이브러리 코드 다운로드 및 구성
<a name="producersdk-javaapi-downloadcode"></a>

Java 생산자 라이브러리 절차의이 섹션에서는 Java 예제 코드를 다운로드하고, 프로젝트를 Java IDE로 가져오고, 라이브러리 위치를 구성합니다.

이 예제에 대한 사전 조건 및 기타 세부 정보는 [Java 생산자 라이브러리 사용을 참조하세요](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-javaapi.html).



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

   ```
   git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-java
   ```

1. 사용하는 Java 통합 개발 환경(IDE)(예: [Eclipse](https://www.eclipse.org/) 또는 [JetBrains IntelliJ IDEA](https://www.jetbrains.com/idea/))를 열고 다운로드한 Apache Maven 프로젝트를 가져옵니다.
   + **IntelliJ IDEA에서 ** [**Import**]를 선택합니다. 다운로드한 패키지의 루트에 있는 `pom.xml` 파일을 찾습니다.
   + **Eclipse:** [**File**], [**Import**], [**Maven**], [**Existing Maven Projects**]를 차례로 선택합니다. 그런 다음 `kinesis-video-java-demo` 디렉터리로 이동합니다.

   자세한 내용은 IDE 관련 문서를 참조하십시오.

1. Java 예제 코드는 현재 AWS 자격 증명을 사용합니다. 다른 자격 증명 프로필을 사용하려면 `DemoAppMain.java`에 있는 다음 코드를 찾습니다.

   ```
   final KinesisVideoClient kinesisVideoClient = KinesisVideoJavaClientFactory
       .createKinesisVideoClient(
           Regions.US_WEST_2,
           AuthHelper.getSystemPropertiesCredentialsProvider());
   ```

   코드를 다음으로 변경합니다.

   ```
   final KinesisVideoClient kinesisVideoClient = KinesisVideoJavaClientFactory
       .createKinesisVideoClient(
           Regions.US_WEST_2,
           new ProfileCredentialsProvider("credentials-profile-name"));
   ```

   자세한 내용은 *AWS SDK for Java* 참조의 [ProfileCredentialsProvider](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/profile/ProfileCredentialsProvider.html)를 참조하세요.

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

[Java 생산자 라이브러리 절차의](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-javaapi.html)이 섹션에서는 이전 섹션에서 다운로드한 Java 예제 코드를 작성하고 검사합니다.

Java 테스트 애플리케이션([https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-java/blob/master/src/main/demo/com/amazonaws/kinesisvideo/demoapp/DemoAppMain.java](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-java/blob/master/src/main/demo/com/amazonaws/kinesisvideo/demoapp/DemoAppMain.java))은 다음과 같은 코딩 패턴을 보입니다.
+ `KinesisVideoClient`의 인스턴스를 만듭니다.
+ `MediaSource`의 인스턴스를 만듭니다.
+ `MediaSource`를 클라이언트에 등록합니다.
+ 스트리밍을 시작합니다. 를 시작`MediaSource`하면 클라이언트로 데이터 전송이 시작됩니다.

다음 단원들에서 세부 정보가 제공됩니다.



## KinesisVideoClient 인스턴스 생성
<a name="producersdk-javaapi-review-code-create-client"></a>

`createKinesisVideoClient` 작업을 호출하여 `KinesisVideoClient` 객체를 생성합니다.

```
final KinesisVideoClient kinesisVideoClient = KinesisVideoJavaClientFactory
    .createKinesisVideoClient(
        Regions.US_WEST_2,
        AuthHelper.getSystemPropertiesCredentialsProvider());
```

`KinesisVideoClient`가 네트워크 호출을 하려면 인증을 위한 자격 증명이 필요합니다. `SystemPropertiesCredentialsProvider` 인스턴스를 전달하면, 인스턴스가 자격 증명 파일에 있는 기본 프로필의 `AWSCredentials`을 읽습니다.

```
[default]
aws_access_key_id = ABCDEFGHIJKLMOPQRSTU
aws_secret_access_key = AbCd1234EfGh5678IjKl9012MnOp3456QrSt7890
```





## MediaSource 인스턴스 생성
<a name="producersdk-javaapi-review-code-create-mediasource"></a>

Kinesis 비디오 스트림으로 바이트를 전송하려면 데이터를 생성해야 합니다. Amazon Kinesis Video Streams는 데이터 소스를 나타내는 `MediaSource` 인터페이스를 제공합니다.

예를 들어 Kinesis Video Streams Java 라이브러리는 `MediaSource` 인터페이스 `ImageFileMediaSource` 구현을 제공합니다. 이 클래스는 Kinesis 비디오 스트림이 아닌 일련의 미디어 파일에서만 데이터를 읽지만 코드를 테스트하는 데 사용할 수 있습니다.

```
final MediaSource bytesMediaSource = createImageFileMediaSource();
```

## MediaSource를 클라이언트에 등록
<a name="producersdk-javaapi-review-code-register-mediasource"></a>

클라이언트에 관해 알도록 생성한 미디어 원본을 `KinesisVideoClient`에 등록합니다(그런 다음 데이터를 클라이언트에 전송할 수 있습니다).

```
kinesisVideoClient.registerMediaSource(mediaSource);
```



## 미디어 소스 시작
<a name="producersdk-javaapi-review-code-start-mediasource"></a>

미디어 소스가 데이터 생성을 시작하고 클라이언트로 전송할 수 있도록 미디어 소스를 시작합니다.

```
bytesMediaSource.start();
```



# 리소스 정리
<a name="producersdk-javaapi-cleanup"></a>

메모리 누수를 방지하려면 다음을 수행하여 클라이언트에서 미디어 소스의 등록을 취소하고 클라이언트를 해제합니다.

```
try {
    kinesisVideoClient.unregisterMediaSource(mediaSource);
    kinesisVideoClient.free();
} catch (final KinesisVideoException e) {
    throw new RuntimeException(e);
}
```

예를 들어 [https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-java/blob/master/src/main/java/com/amazonaws/kinesisvideo/java/service/CachedInfoMultiAuthServiceCallbacksImpl.java](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-java/blob/master/src/main/java/com/amazonaws/kinesisvideo/java/service/CachedInfoMultiAuthServiceCallbacksImpl.java)를 사용하여 캐시에 항목을 추가한 경우:

```
serviceCallbacks.addStreamInfoToCache(streamName, streamInfo);
serviceCallbacks.addStreamingEndpointToCache(streamName, dataEndpoint);
```

완료되면 캐시를 지웁니다.

```
serviceCallbacks.removeStreamFromCache(streamName);
```

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

Java [생산자 라이브러리에 대한 Java](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-javaapi.html) 테스트 하네스를 실행하려면 다음을 수행합니다.

1. [**DemoAppMain**]을 선택합니다.

1. [**Run**]과 [**Run 'DemoAppMain'**]을 선택합니다.

1. 애플리케이션용 JVM 인수에 자격 증명을 추가합니다.
   + **비임시 AWS 자격 증명의 경우:** `"-Daws.accessKeyId={YourAwsAccessKey} -Daws.secretKey={YourAwsSecretKey} -Djava.library.path={NativeLibraryPath}"` 
   + **임시 AWS 자격 증명의 경우:** `"-Daws.accessKeyId={YourAwsAccessKey} -Daws.secretKey={YourAwsSecretKey} -Daws.sessionToken={YourAwsSessionToken} -Djava.library.path={NativeLibraryPath}" ` 

1. 에 로그인 AWS Management Console 하고 [Kinesis Video Streams 콘솔](https://console.aws.amazon.com//kinesisvideo/home/)을 엽니다.

   [**Manage streams**] 페이지에서 스트림을 선택합니다.

1. 내장 플레이어에서 샘플 비디오가 재생됩니다. 프레임이 쌓여 비디오가 재생될 때까지 잠깐 기다려야 할 수 있습니다(일반적인 대역폭과 프로세서 상태에서 최대 10초).

코드 예제는 스트림을 생성합니다. 코드에 있는 `MediaSource`가 시작되면 샘플 프레임을 `KinesisVideoClient`로 전송하기 시작합니다. 그러면 클라이언트가 Kinesis 비디오 스트림으로 데이터를 전송합니다.

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

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

애플리케이션이 Kinesis 비디오 스트림으로 데이터 스트리밍을 시작할 수 있도록 다음 단계를 수행하여 코드를 Kinesis Video Streams와 통합합니다.

1. `KinesisVideoClient` 객체의 인스턴스를 생성합니다.

1. 미디어 원본 정보를 제공하여 `MediaSource` 객체를 생성합니다. 예를 들어 카메라 미디어 원본을 생성할 때 카메라를 식별하고 카메라가 사용하는 인코딩을 지정하는 등 정보를 제공합니다.

   스트리밍을 시작하고자 할 때 사용자 지정 미디어 원본을 생성해야 합니다.

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

이 절차에서는 Android 애플리케이션에서 Kinesis Video Streams Android 생산자 클라이언트를 사용하여 Kinesis 비디오 스트림으로 데이터를 전송하는 방법을 보여줍니다.

이 절차에는 다음 단계가 포함됩니다.
+ [사전 조건](producersdk-android-prerequisites.md)
+ [Android 생산자 라이브러리 코드 다운로드 및 구성](producersdk-android-downloadcode.md)
+ [코드 검사](producersdk-android-writecode.md)
+ [코드 실행 및 확인](producersdk-android-reviewcode.md)

# 사전 조건
<a name="producersdk-android-prerequisites"></a>

애플리케이션 코드 검사, 편집, 실행에는 [Android Studio](https://developer.android.com/studio/index.html)를 권장합니다. 안정적인 최신 버전을 사용하는 것이 좋습니다.

샘플 코드에서 Amazon Cognito 자격 증명을 제공합니다.

**Topics**
+ [사용자 풀 설정](#set-up-user-pool)
+ [자격 증명 풀 설정](#set-up-identity-pool)

## 사용자 풀 설정
<a name="set-up-user-pool"></a>

**사용자 풀을 설정하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에 로그인하고 리전이 올바른지 확인합니다.

1. 왼쪽 탐색 창에서 **사용자 풀을** 선택합니다.

1. **사용자 풀** 섹션에서 **사용자 풀 생성을** 선택합니다.

1. 다음 섹션을 완료합니다.

   1. **1단계: 로그인 환경 구성** - **Cognito 사용자 풀 로그인 옵션** 섹션에서 적절한 옵션을 선택합니다.

      **다음**을 선택합니다.

   1. **2단계: 보안 요구 사항 구성** - 적절한 옵션을 선택합니다.

      **다음**을 선택합니다.

   1. **3단계: 가입 환경 구성** - 적절한 옵션을 선택합니다.

      **다음**을 선택합니다.

   1. **4단계: 메시지 전송 구성** - 적절한 옵션을 선택합니다.

      **IAM 역할 선택** 필드에서 기존 역할을 선택하거나 새 역할을 생성합니다.

      **다음**을 선택합니다.

   1. **5단계: 앱 통합 **- 적절한 옵션을 선택합니다.

      **초기 앱 클라이언트** 필드에서 **기밀 클라이언트**를 선택합니다.

      **다음**을 선택합니다.

   1. **6단계: 검토 및 생성** - 이전 섹션의 선택 사항을 검토한 다음 **사용자 풀 생성을** 선택합니다.

1. **사용자 풀** 페이지에서 방금 생성한 풀을 선택합니다.

   **사용자 풀 ID**를 복사하고 나중에 사용할 수 있도록 기록해 둡니다. `awsconfiguration.json` 파일에서이 값은 입니다`CognitoUserPool.Default.PoolId`.

1. **앱 통합** 탭을 선택하고 페이지 하단으로 이동합니다.

1. **앱 클라이언트 목록** 섹션에서 방금 생성한 **앱 클라이언트 이름을** 선택합니다.

   **클라이언트 ID**를 복사하고 나중에 사용할 수 있도록 기록해 둡니다. `awsconfiguration.json` 파일에서이 값은 입니다`CognitoUserPool.Default.AppClientId`.

1. **클라이언트** 보안 암호를 표시하고 나중에 사용할 수 있도록 기록해 둡니다. `awsconfiguration.json` 파일에서 입니다`CognitoUserPool.Default.AppClientSecret`.

## 자격 증명 풀 설정
<a name="set-up-identity-pool"></a>

**자격 증명 풀을 설정하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에 로그인하고 리전이 올바른지 확인합니다.

1. 왼쪽 탐색 창에서 **자격 증명 풀을** 선택합니다.

1. **자격 증명 풀 생성**을 선택합니다.

1. 자격 증명 풀을 구성합니다.

   1. **1단계: 자격 증명 풀 신뢰 구성** - 다음 섹션을 완료합니다.
      + **사용자 액세스** - **인증된 액세스** 선택
      + **인증된 자격 증명 소스** - **Amazon Cognito 사용자 풀** 선택

      **다음**을 선택합니다.

   1. **2단계: 권한 구성** - **인증된 역할** 섹션에서 다음 필드를 작성합니다.
      + **IAM 역할** - **새 IAM 역할 생성을** 선택합니다.
      + **IAM 역할 이름** - 이름을 입력하고 이후 단계를 위해 기록해 둡니다.

      **다음**을 선택합니다.

   1. **3단계: 자격 증명 공급자 연결** - **사용자 풀 세부 정보** 섹션에서 다음 필드를 작성합니다.
      + **사용자 풀 ID** - 이전에 생성한 사용자 풀을 선택합니다.
      + **앱 클라이언트 ID** - 이전에 생성한 앱 클라이언트 ID를 선택합니다.

      **다음**을 선택합니다.

   1. **4단계: 속성 구성** - **자격 증명 풀 이름 필드에 이름을** 입력합니다.

      **다음**을 선택합니다.

   1. **5단계: 검토 및 생성** - 각 섹션의 선택 사항을 검토한 다음 자격 **증명 풀 생성을** 선택합니다.

1. **자격 증명 풀** 페이지에서 새 자격 증명 풀을 선택합니다.

   자격 **증명 풀 ID**를 복사하고 나중에 사용할 수 있도록 기록해 둡니다. `awsconfiguration.json` 파일에서이 값은 입니다`CredentialsProvider.CognitoIdentity.Default.PoolId`.

1. IAM 역할에 대한 권한을 업데이트합니다.

   1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) IAM 콘솔을 엽니다.

   1. 왼쪽 탐색 창에서 **역할을** 선택합니다.

   1. 위에서 생성한 역할을 찾아 선택합니다.
**참고**  
필요한 경우 검색 창을 사용합니다.

   1. 연결된 권한 정책을 선택합니다.

      **편집**을 선택합니다.

   1. **JSON** 탭을 선택하고 정책을 다음으로 바꿉니다.

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "cognito-identity:*",
                      "kinesisvideo:*"
                  ],
                  "Resource": [
                      "*"
                  ]
              }
          ]
      }
      ```

------

      **다음**을 선택합니다.

   1. 아직 선택하지 않은 경우 **이 새 버전을 기본값으로 설정** 옆의 상자를 선택합니다.

      **변경 사항 저장**을 선택합니다.

# Android 생산자 라이브러리 코드 다운로드 및 구성
<a name="producersdk-android-downloadcode"></a>

Android 생산자 라이브러리 절차의이 섹션에서는 Android 예제 코드를 다운로드하고 Android Studio에서 프로젝트를 엽니다.

이 예제에 대한 사전 조건 및 기타 세부 정보는 [Android 생산자 라이브러리 사용을 참조하세요](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-android.html).



1. 디렉터리를 생성한 다음 GitHub 리포지토리 AWS Mobile SDK for Android 에서를 복제합니다.

   ```
   git clone https://github.com/awslabs/aws-sdk-android-samples
   ```

1. [Android Studio](https://developer.android.com/studio/index.html)를 엽니다.

1. 열리는 화면에서 [**Open an existing Android Studio project**]를 선택합니다.

1. `aws-sdk-android-samples/AmazonKinesisVideoDemoApp` 디렉터리로 이동하여 [**OK**]를 선택합니다.

1. `AmazonKinesisVideoDemoApp/src/main/res/raw/awsconfiguration.json` 파일을 엽니다.

   `CredentialsProvider` 노드에서 [사전 조건](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-android.html#producersdk-android-prerequisites) 섹션의 자격 증명 풀 **설정 절차에서 자격 증명 풀** ID를 제공하고 AWS 리전 (예: **us-west-2**)를 제공합니다.

   `CognitoUserPool` 노드에서 [사전 조건](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-android.html#producersdk-android-prerequisites) 섹션의 **사용자 풀 설정 절차에서 앱 클라이언트 보안 암호, 앱 클라이언트 ID 및 풀** ID를 제공하고 AWS 리전 (예: **us-west-2**)를 제공합니다.

1. `awsconfiguration.json` 파일은 다음과 비슷합니다.

   ```
   {
     "Version": "1.0",
     "CredentialsProvider": {
       "CognitoIdentity": {
         "Default": {
           "PoolId": "us-west-2:01234567-89ab-cdef-0123-456789abcdef",
           "Region": "us-west-2"
         }
       }
     },
     "IdentityManager": {
       "Default": {}
     },
     "CognitoUserPool": {
       "Default": {
         "AppClientSecret": "abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmno",
         "AppClientId": "0123456789abcdefghijklmnop",
         "PoolId": "us-west-2_qRsTuVwXy",
         "Region": "us-west-2"
       }
     }
   }
   ```

1. 리전`AmazonKinesisVideoDemoApp/src/main/java/com/amazonaws/kinesisvideo/demoapp/KinesisVideoDemoApp.java`으로를 업데이트합니다(다음 샘플에서는 **US\$1WEST\$12**로 설정됨).

   ```
   public class KinesisVideoDemoApp extends Application {
       public static final String TAG = KinesisVideoDemoApp.class.getSimpleName();
       public static Regions KINESIS_VIDEO_REGION = Regions.US_WEST_2;
   ```

    AWS 리전 상수에 대한 자세한 내용은 [리전을 참조하세요](https://aws-amplify.github.io/aws-sdk-android/docs/reference/com/amazonaws/regions/Regions.html).

# 코드 검사
<a name="producersdk-android-writecode"></a>

[Android 생산자 라이브러리 절차의](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-android.html)이 섹션에서는 예제 코드를 검토합니다.

Android 테스트 애플리케이션(`AmazonKinesisVideoDemoApp`)은 다음과 같은 코딩 패턴을 보입니다.
+ `KinesisVideoClient`의 인스턴스를 만듭니다.
+ `MediaSource`의 인스턴스를 만듭니다.
+ 스트리밍을 시작합니다. 를 시작`MediaSource`하면 클라이언트로 데이터 전송이 시작됩니다.

다음 단원들에서 세부 정보가 제공됩니다.



## KinesisVideoClient의 인스턴스 생성
<a name="producersdk-android-review-code-create-client"></a>

`[createKinesisVideoClient](https://github.com/aws-amplify/aws-sdk-android/blob/main/aws-android-sdk-kinesisvideo/src/main/java/com/amazonaws/mobileconnectors/kinesisvideo/client/KinesisVideoAndroidClientFactory.java)` 작업을 호출하여 `[KinesisVideoClient](https://github.com/aws-amplify/aws-sdk-android/blob/main/aws-android-sdk-kinesisvideo/src/main/java/com/amazonaws/kinesisvideo/client/KinesisVideoClient.java)` 객체를 생성합니다.

```
mKinesisVideoClient = KinesisVideoAndroidClientFactory.createKinesisVideoClient(
                    getActivity(),
                    KinesisVideoDemoApp.KINESIS_VIDEO_REGION,
                    KinesisVideoDemoApp.getCredentialsProvider());
```

`KinesisVideoClient`가 네트워크 호출을 하려면 인증을 위한 자격 증명이 필요합니다. 이전 섹션에서 수정한 `awsconfiguration.json` 파일에서 Amazon Cognito 자격 증명을 읽`AWSCredentialsProvider`는의 인스턴스를 전달합니다.

## MediaSource 인스턴스 생성
<a name="producersdk-android-review-code-create-mediasource"></a>

Kinesis 비디오 스트림으로 바이트를 전송하려면 데이터를 생성해야 합니다. Amazon Kinesis Video Streams는 데이터 소스를 나타내는 `[MediaSource](https://github.com/aws-amplify/aws-sdk-android/blob/main/aws-android-sdk-kinesisvideo/src/main/java/com/amazonaws/kinesisvideo/internal/client/mediasource/MediaSource.java)` 인터페이스를 제공합니다.

예를 들어 Kinesis Video Streams Android 라이브러리는 `MediaSource` 인터페이스 `[AndroidCameraMediaSource](https://github.com/aws-amplify/aws-sdk-android/blob/main/aws-android-sdk-kinesisvideo/src/main/java/com/amazonaws/mobileconnectors/kinesisvideo/mediasource/android/AndroidCameraMediaSource.java)` 구현을 제공합니다. 이 클래스는 디바이스의 카메라 중 하나에서 데이터를 읽습니다.

다음 코드 예제(`[fragment/StreamConfigurationFragment.java](https://github.com/awslabs/aws-sdk-android-samples/blob/main/AmazonKinesisVideoDemoApp/src/main/java/com/amazonaws/kinesisvideo/demoapp/fragment/StreamConfigurationFragment.java)` 파일의 예제)에서 미디어 원본의 구성이 생성됩니다.

```
private AndroidCameraMediaSourceConfiguration getCurrentConfiguration() {
return new AndroidCameraMediaSourceConfiguration(
        AndroidCameraMediaSourceConfiguration.builder()
                .withCameraId(mCamerasDropdown.getSelectedItem().getCameraId())
                .withEncodingMimeType(mMimeTypeDropdown.getSelectedItem().getMimeType())
                .withHorizontalResolution(mResolutionDropdown.getSelectedItem().getWidth())
                .withVerticalResolution(mResolutionDropdown.getSelectedItem().getHeight())
                .withCameraFacing(mCamerasDropdown.getSelectedItem().getCameraFacing())
                .withIsEncoderHardwareAccelerated(
                        mCamerasDropdown.getSelectedItem().isEndcoderHardwareAccelerated())
                .withFrameRate(FRAMERATE_20)
                .withRetentionPeriodInHours(RETENTION_PERIOD_48_HOURS)
                .withEncodingBitRate(BITRATE_384_KBPS)
                .withCameraOrientation(-mCamerasDropdown.getSelectedItem().getCameraOrientation())
                .withNalAdaptationFlags(StreamInfo.NalAdaptationFlags.NAL_ADAPTATION_ANNEXB_CPD_AND_FRAME_NALS)
                .withIsAbsoluteTimecode(false));
}
```

다음 코드 예제(`[fragment/StreamingFragment.java](https://github.com/awslabs/aws-sdk-android-samples/blob/main/AmazonKinesisVideoDemoApp/src/main/java/com/amazonaws/kinesisvideo/demoapp/fragment/StreamingFragment.java)` 파일의 예제)에서 미디어 원본이 생성됩니다.

```
mCameraMediaSource = (AndroidCameraMediaSource) mKinesisVideoClient
    .createMediaSource(mStreamName, mConfiguration);
```

## 미디어 소스 시작
<a name="producersdk-android-review-code-start-mediasource"></a>

미디어 원본이 데이터 생성 및 클라이언트로의 전송을 시작할 수 있도록 미디어 원본을 시작합니다. 다음 코드 예제는 `[fragment/StreamingFragment.java](https://github.com/awslabs/aws-sdk-android-samples/blob/main/AmazonKinesisVideoDemoApp/src/main/java/com/amazonaws/kinesisvideo/demoapp/fragment/StreamingFragment.java)` 파일의 예제입니다.

```
mCameraMediaSource.start();
```



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

Android [생산자 라이브러리에 대한 Android](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-android.html) 예제 애플리케이션을 실행하려면 다음을 수행합니다.

1. Android 디바이스에 연결합니다.

1. [**Run**], [**Run...**], [**Edit configurations...**]를 차례로 선택합니다.

1. 더하기 아이콘(**\$1**), **Android 앱을** 선택합니다. **이름** 필드에 **AmazonKinesisVideoDemoApp**을 입력합니다. [**Module**] 풀다운에서 [**AmazonKinesisVideoDemoApp**]을 선택합니다. **확인**을 선택합니다.

1. [**Run**]과 [**Run**]을 차례로 선택합니다.

1. [**Select a Deployment Target**] 화면에서 연결된 디바이스를 선택하고 [**OK**]를 선택합니다.

1. 디바이스의 [**AWSKinesisVideoDemoApp**] 애플리케이션에서 [**Create new account**]를 선택합니다.

1. [**USERNAME**], [**Password**], [**Given name**], [**Email address**] 및 [**Phone number**]의 값을 입력한 다음 [**Sign up**]을 선택합니다.
**참고**  
이러한 값의 제약 조건은 다음과 같습니다.  
**Password:** 대문자, 소문자, 숫자, 특수 문자를 포함해야 합니다. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)의 사용자 풀 페이지에서 이러한 제약 조건을 변경할 수 있습니다.
**Email address:** 확인 코드를 수신할 수 있는 유효한 주소여야 합니다.
**Phone number:** **\$1*<Country code>**<Number>*** 형식이어야 합니다(예: **\$112065551212**).

1. 이메일로 받은 코드를 입력하고 **확인을** 선택합니다. **확인**을 선택합니다.

1. 다음 페이지에서 기본값을 유지하고 **스트림**을 선택합니다.

1. 에 로그인 AWS Management Console 하고 미국 서부(오레곤) 리전에서 [Kinesis Video Streams 콘솔](https://console.aws.amazon.com//kinesisvideo/home/)을 엽니다.

   [**Manage Streams**] 페이지에서 [**demo-stream**]을 선택합니다.

1. 내장 플레이어에서 스트리밍 비디오가 재생됩니다. 프레임이 쌓여 비디오가 재생될 때까지 잠깐 기다려야 할 수 있습니다(일반적인 대역폭과 프로세서 상태에서 최대 10초).
**참고**  
디바이스의 화면이 회전하면 (예: 세로에서 가로로) 애플리케이션이 비디오 스트리밍을 중지합니다.

코드 예제는 스트림을 생성합니다. 코드에 있는 `MediaSource`가 시작되면 카메라에서 `KinesisVideoClient`로 프레임을 전송하기 시작합니다. 그런 다음 클라이언트는 **데모 스트림**이라는 Kinesis 비디오 스트림으로 데이터를 전송합니다.

# 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` 수준 로깅이 파일에 기록될 경우 로그 파일이 디바이스의 가용 저장 공간을 빠르게 소모할 수 있습니다.

# 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`.

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

# Raspberry Pi에서 C\$1\$1 생산자 SDK 사용
<a name="producersdk-cpp-rpi"></a>

Raspberry Pi는 기본 컴퓨터 프로그래밍 기술을 가르치고 학습하는 데 사용할 수 있는 저렴한 소형 컴퓨터입니다. 이 자습서에서는 Raspberry Pi 디바이스에서 Amazon Kinesis Video Streams C\$1\$1 생산자 SDK를 설정하고 사용하는 방법을 설명합니다. 또한 이러한 단계에는 GStreamer 데모 애플리케이션을 사용하여 설치를 확인하는 방법도 포함되어 있습니다.

**Topics**
+ [사전 조건](producersdk-cpp-rpi-prerequisites.md)
+ [Kinesis Video Streams에 쓸 수 있는 권한이 있는 IAM 사용자 생성](producersdk-cpp-rpi-iam.md)
+ [Raspberry Pi를 Wi-Fi 네트워크에 조인](producersdk-cpp-rpi-wifi.md)
+ [Raspberry Pi에 원격으로 연결](producersdk-cpp-rpi-connect.md)
+ [Raspberry Pi 카메라 구성](producersdk-cpp-rpi-camera.md)
+ [소프트웨어 사전 조건 설치](producersdk-cpp-rpi-software.md)
+ [Kinesis Video Streams C\$1\$1 생산자 SDK 다운로드 및 빌드](producersdk-cpp-rpi-download.md)
+ [Kinesis 비디오 스트림으로 비디오 스트리밍](producersdk-cpp-rpi-run.md)
+ [Kinesis 비디오 스트림에서 미디어 재생](producersdk-cpp-rpi-playback.md)
+ [C\$1\$1 생산자 SDK for Raspberry Pi의 빌드 문제 해결](troubleshoot-rpi.md)

# 사전 조건
<a name="producersdk-cpp-rpi-prerequisites"></a>

Raspberry Pi에서 C\$1\$1 생산자 SDK를 설정하기 전에 다음 사전 요구 사항이 있는지 확인합니다.
+ 다음과 같이 구성된 Raspberry Pi 디바이스:
  + 보드 버전: 3 모델 B 이상
  + 연결된 [카메라 모듈](https://www.raspberrypi.com/documentation/accessories/camera.html) 또는 연결된 USB 카메라(웹캠).
  + 8GB 이상의 용량이 남아 있는 SD 카드
  + 설치된 Raspbian 운영 체제(커널 버전 4.9 이상) Raspberry Pi [웹 사이트에서 최신 Raspberry Pi OS(이전에는 Raspbian](https://www.raspberrypi.com/software/)이라고 함) 이미지를 다운로드할 수 있습니다. Raspberry Pi 지침에 따라 [다운로드한 이미지를 SD 카드에 설치](https://www.raspberrypi.com/documentation/computers/getting-started.html#install-an-operating-system)합니다.
+ Kinesis 비디오 스트림이 AWS 계정 있는 . 자세한 내용은 [Kinesis 비디오 스트림 시작하기](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/getting-started.html)를 참조하십시오.

# Kinesis Video Streams에 쓸 수 있는 권한이 있는 IAM 사용자 생성
<a name="producersdk-cpp-rpi-iam"></a>

아직 설정하지 않은 경우 Kinesis 비디오 스트림에 쓸 수 있는 권한이 있는 AWS Identity and Access Management (IAM) 사용자를 설정합니다.

이 절차는 AWS 액세스 키 페어 사용을 빠르게 시작하는 데 도움이 됩니다. 디바이스는 X.509 인증서를 사용하여 연결할 수 있습니다 AWS IoT. 인증서 기반 인증을 사용하도록 디바이스를 구성하는 방법에 대한 자세한 내용은 [를 사용하여 Kinesis Video Streams 리소스에 대한 액세스 제어 AWS IoT](how-iot.md) 섹션을 참조하세요.

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) IAM 콘솔을 엽니다.

1. 왼쪽 탐색 메뉴에서 **사용자**를 클릭합니다.

1. 새 사용자를 생성하려면 **사용자 추가**를 선택합니다.

1. 사용자에 설명적 **사용자 이름**을 지정합니다(예: **kinesis-video-raspberry-pi-producer**).

1. **액세스 유형**에서 **프로그래밍 방식 액세스**를 선택합니다.

1. **다음: 권한**을 선택합니다.

1. **kinesis-video-raspberry-pi-producer에 대한 권한 설정**에서 **기존 정책 직접 연결**을 선택합니다.

1. **정책 생성**을 선택합니다. 새 웹 브라우저 탭에서 **정책 생성** 페이지가 열립니다.

1. **JSON** 탭을 선택합니다.

1. 다음 JSON 정책을 복사해 텍스트 영역에 붙여 넣습니다. 이 정책은 사용자에게 Kinesis 비디오 스트림에 데이터를 생성하고 쓸 수 있는 권한을 부여합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [{
       "Effect": "Allow",
         "Action": [
         "kinesisvideo:DescribeStream",
         "kinesisvideo:CreateStream",
         "kinesisvideo:GetDataEndpoint",
         "kinesisvideo:PutMedia"
       ],
       "Resource": [
         "*"
       ]
     }]
   }
   ```

------

1. **정책 검토**를 선택합니다.

1. 정책에 **이름**을 지정합니다(예: **kinesis-video-stream-write-policy**).

1. **정책 생성**을 선택합니다.

1. 브라우저에서**사용자 추가** 탭으로 돌아가서 **새로 고침**을 선택합니다.

1. 검색 상자에 생성한 정책 이름을 입력합니다.

1. 목록에서 새 정책 옆의 확인란을 선택합니다.

1. **다음: 검토**를 선택합니다.

1. **사용자 생성**을 선택합니다.

1. 콘솔에 새 사용자의 **액세스 키 ID**가 표시됩니다. **표시**를 선택해 **보안 액세스 키**를 표시합니다. 애플리케이션을 구성할 때 필요하므로 이러한 값을 기록해 둡니다.

# Raspberry Pi를 Wi-Fi 네트워크에 조인
<a name="producersdk-cpp-rpi-wifi"></a>

연결된 모니터와 키보드를 사용하는 경우에는 [Raspberry Pi 카메라 구성](producersdk-cpp-rpi-camera.md).

이 지침은 *헤드리스* 모드에서, 즉 연결된 키보드, 모니터 또는 네트워크 케이블 없이 실행할 때 Raspberry Pi를 설정하는 데 도움이 되도록 작성되었습니다. 아래 지침에 따라 지정된 네트워크에 자동으로 연결을 시도하도록 Raspberry Pi를 구성하여 호스트 시스템이 SSH로 연결할 수 있도록 합니다.

1. 컴퓨터에서 `wpa_supplicant.conf`라는 이름의 파일을 하나 만듭니다.

1. 다음 텍스트를 복사하여 `wpa_supplicant.conf` 파일에 붙여 넣습니다.

   ```
   country=US
   ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
   update_config=1
   
   network={
   ssid="Your Wi-Fi SSID"
   scan_ssid=1
   key_mgmt=WPA-PSK
   psk="Your Wi-Fi Password"
   }
   ```

   Wi-Fi 네트워크에 대한 정보로 `ssid` 및 `psk` 값을 바꿉니다.

1. `wpa_supplicant.conf` 파일을 SD 카드로 복사합니다. `boot` 볼륨의 루트에 복사해야 합니다.

1. SD 카드를 Raspberry Pi에 삽입하고 디바이스의 전원을 켭니다. 그러면 디바이스가 Wi-Fi 네트워크에 연결되고 SSH가 활성화됩니다.

# Raspberry Pi에 원격으로 연결
<a name="producersdk-cpp-rpi-connect"></a>

연결된 모니터와 키보드를 사용하는 경우에는 [Raspberry Pi 카메라 구성](producersdk-cpp-rpi-camera.md).

이 지침은 *헤드리스* 모드에서, 즉 연결된 키보드, 모니터 또는 네트워크 케이블 없이 실행할 때 Raspberry Pi를 설정하는 데 도움이 되도록 작성되었습니다. 아래 지침에 따라 네트워크에서 Raspberry Pi를 찾고 호스트 시스템에서 SSH를 찾습니다.

1. Raspberry Pi 디바이스에 원격으로 연결하기 전에 다음 중 하나를 수행하여 이 디바이스의 IP 주소를 확인합니다.
   + 네트워크의 Wi-Fi 라우터에 액세스할 수 있는 경우 연결된 Wi-Fi 디바이스를 찾습니다. `Raspberry Pi`라는 디바이스를 찾아 디바이스의 IP 주소를 확인합니다.
   + 네트워크의 Wi-Fi 라우터에 액세스할 수 없는 경우에는 다른 소프트웨어를 사용하여 네트워크의 디바이스를 찾을 수 있습니다. [Fing](https://www.fing.com/)은 Android 및 iOS 디바이스에서 사용할 수 있는 널리 사용되는 애플리케이션입니다. 이 애플리케이션의 무료 버전을 사용하여 네트워크에 있는 디바이스의 IP 주소를 찾을 수 있습니다.

1. Raspberry Pi 디바이스의 IP 주소를 알고 있는 경우에는 임의의 터미널 애플리케이션을 사용해 연결할 수 있습니다.
   + macOS 또는 Linux에서는 `ssh`를 사용합니다.

     ```
     ssh pi@<IP address>
     ```
   + Windows에서는 Windows용 무료 SSH 클라이언트인 [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)를 사용합니다.

   Raspbian을 새로 설치할 경우 사용자 이름은 **pi**이고 암호는 **raspberry**입니다. [기본 암호를 변경하는 것이 좋습니다](https://www.raspberrypi.com/documentation/computers/configuration.html#change-user-password-nonint).

# Raspberry Pi 카메라 구성
<a name="producersdk-cpp-rpi-camera"></a>

다음 단계에 따라 디바이스에서 Kinesis 비디오 스트림으로 비디오를 전송하도록 [Raspberry Pi 카메라 모듈을](https://www.raspberrypi.com/documentation/accessories/camera.html) 구성합니다.

**참고**  
USB 웹캠을 사용하는 경우 로 건너뜁니다[소프트웨어 사전 조건 설치](producersdk-cpp-rpi-software.md).

------
#### [ Camera module 1 ]

다음 지침에 따라 모듈 파일을 업데이트하고, 카메라 인터페이스를 활성화하고, 카메라의 기능을 확인합니다. 모듈 파일을 업데이트하면 Raspberry Pi에 부팅 시 로드할 커널 모듈을 알려줍니다. 카메라를 사용하지 않는 Raspberry Pi 디바이스의 시스템 리소스를 절약하기 위해 카메라 드라이버가 기본적으로 로드되지 않습니다.

1.  편집기를 열어 모듈 파일을 변경합니다. 터미널을 열고 다음 명령을 사용하여 `nano` 편집기를 사용하여 파일을 편집합니다.

   ```
   sudo nano /etc/modules
   ```

1. 없는 경우 이 파일의 끝에 다음 행을 추가합니다.

   ```
   bcm2835-v4l2
   ```

1. 파일을 저장하고 편집기를 종료합니다. `nano` 편집기를 사용하여 저장하고 종료하려면 Ctrl\$1X를 사용합니다.

1. Raspberry Pi를 재부팅합니다.

   ```
   sudo reboot
   ```

1. 원격으로 연결되어 있는 경우 디바이스가 재부팅되면 터미널 애플리케이션을 통해 다시 연결합니다.

1. Open `raspi-config`:

   ```
   sudo raspi-config
   ```

1. **인터페이스 옵션**, **레거시 카메라를** 선택합니다. Raspbian 운영 체제의 이전 빌드에서는이 메뉴 옵션이 **인터페이스 옵션**, **카메라** 아래에 있을 수 있습니다.

   아직 활성화되지 않은 경우 카메라를 활성화하고 메시지가 표시되면 재부팅합니다.

1. 다음 명령을 입력하여 카메라가 작동하는지 확인합니다.

   ```
   raspistill -v -o test.jpg
   ```

   카메라가 올바르게 구성된 경우이 명령은 카메라에서 이미지를 캡처하여 라는 파일에 저장`test.jpg`하고 정보 메시지를 표시합니다.

------
#### [ Camera module 2 or 3 ]

카메라 모듈 2를 사용하는 경우 `bcm2835-v4l2` (레거시) 또는 `libcamera` (현대)를 사용합니다. 그러나 지원 및 기능을 개선하려면 `libcamera` 스택을 사용하는 것이 좋습니다. 아래 단계에 따라가 시스템에서 up-to-date `libcamera` 상태인지 확인합니다.

1. [libcamera](https://www.raspberrypi.com/documentation/computers/camera_software.html#libcamera)는 Raspberry Pi에 사전 설치되어 있어야 합니다. 버그 수정 및 보안 업데이트에 대한 최신 버전 업데이트가 있는지 확인합니다. 터미널을 열고 다음 명령을 입력합니다.

   ```
   sudo apt-get update
   sudo apt-get upgrade
   ```

1. 업데이트가 적용되도록 시스템을 재부팅합니다.

   ```
   sudo reboot
   ```

1. 카메라를 테스트합니다. 이 애플리케이션은 카메라 미리 보기 스트림을 시작하고 화면에 표시합니다.

   ```
   libcamera-hello
   ```

   카메라 모듈에 문제가 있는 경우 [Raspberry Pi 설명서](https://raspberrypi.com/documentation/computers/camera_software.html#troubleshooting)에서 문제 해결을 참조하세요.

------

# 소프트웨어 사전 조건 설치
<a name="producersdk-cpp-rpi-software"></a>

C\$1\$1 생산자 SDK를 사용하려면 Raspberry Pi에 다음 소프트웨어 사전 조건을 설치해야 합니다.

1. 패키지 목록을 업데이트하고 SDK를 빌드하는 데 필요한 라이브러리를 설치합니다. 터미널을 열고 다음 명령을 입력합니다.

   ```
   sudo apt-get update
   sudo apt-get install -y \
     automake \
     build-essential \
     cmake \
     git \
     gstreamer1.0-plugins-base-apps \
     gstreamer1.0-plugins-bad \
     gstreamer1.0-plugins-good \
     gstreamer1.0-plugins-ugly \
     gstreamer1.0-tools \
     gstreamer1.0-omx-generic \
     libcurl4-openssl-dev \
     libgstreamer1.0-dev \
     libgstreamer-plugins-base1.0-dev \
     liblog4cplus-dev \
     libssl-dev \
     pkg-config
   ```

1. `libcamera` 스택을 사용하는 경우 `libcamerasrc` GStreamer 플러그인도 설치합니다. 이 GStreamer 플러그인은 기본적으로 설치되지 않습니다.

   ```
   sudo apt-get install gstreamer1.0-libcamera
   ```

1. 다음 PEM 파일을 `/etc/ssl/cert.pem`에 복사합니다.

   ```
   sudo curl https://www.amazontrust.com/repository/AmazonRootCA1.pem -o /etc/ssl/AmazonRootCA1.pem
   sudo chmod 644 /etc/ssl/AmazonRootCA1.pem
   ```

# Kinesis Video Streams C\$1\$1 생산자 SDK 다운로드 및 빌드
<a name="producersdk-cpp-rpi-download"></a>

아래 절차에 따라 [Kinesis Video Streams C\$1\$1 생산자 SDK](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp)를 다운로드하고 빌드합니다. 소프트웨어 사전 조건을 설치했는지 확인합니다. 해당 단계는 [소프트웨어 사전 조건 설치](producersdk-cpp-rpi-software.md) 섹션을 참조하세요.

1. 디렉터리 다운로드로 이동합니다. 터미널을 열고 원하는 다운로드 디렉터리로 변경합니다.

   예제:

   ```
   cd ~/Downloads
   ```

1. SDK 리포지토리를 복제합니다. `git clone` 명령을 사용하여 GitHub 리포지토리에서 SDK를 다운로드합니다. 유형: 

   ```
   git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git --single-branch -b master kvs-producer-sdk-cpp
   ```

   이 명령은 단일 브랜치(`master`브랜치)만 복제하여 다운로드 크기와 시간을 줄입니다. 또한 다운로드한 콘텐츠를 현재 디렉터리 `kvs-producer-sdk-cpp` 내에서 라는 폴더에 배치합니다.

1. 다운로드를 확인합니다. 복제 프로세스가 완료되면 `kvs-producer-sdk-cpp` 폴더의 내용을 나열하여 SDK가 다운로드되었는지 확인합니다.

   ```
   ls kvs-producer-sdk-cpp
   ```

1. 빌드 디렉터리를 준비합니다. 유형: 

   ```
   mkdir -p kvs-producer-sdk-cpp/build
   cd kvs-producer-sdk-cpp/build
   ```

1. 빌드를 구성합니다. 다음 `cmake` 명령을 실행하여 특정 옵션으로 빌드 환경을 구성합니다.

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

   [CMake](https://cmake.org/cmake/help/latest/manual/cmake.1.html)는 다음 옵션을 사용하여 적절한를 생성합니다`Makefiles`.
   + 프로젝트 폴더(`..`)를 소스 디렉터리로 사용합니다.
   + 빌드 출력에 현재 디렉터리(`.`)(`build/`)를 사용합니다.
   + `-DBUILD_GSTREAMER_PLUGIN=ON`를 사용하면 GStreamer 플러그인 kvssink를 빌드할 수 있습니다.
   + `-DBUILD_DEPENDENCIES=OFF`는 소스에서 외부 종속성 빌드를 비활성화합니다. 프로젝트는 이전 단계에서 설치된 외부 종속성을 찾아 사용합니다.
   + `-DALIGNED_MEMORY_MODEL=ON`는 정렬되지 않은 메모리 모델을 비활성화합니다. 정렬되지 않은 메모리 액세스는 특정 Raspberry Pi 디바이스에서 지원되지 않습니다.
**참고**  
CMake 인수의 전체 목록은 섹션을 참조하세요[C\$1\$1 생산자 라이브러리 코드 다운로드 및 구성](producersdk-cpp-download.md).

1. 프로젝트를 빌드합니다. 빌드를 구성한 후 `make` 명령을 사용하여에서 `Makefile` 생성된를 사용하여 컴파일합니다`cmake`.

   ```
   make -j$(nproc)
   ```

   에 대한 `-j` 인수를 `make` 사용하면 여러 컴파일 작업을 병렬로 실행할 수 있습니다. 빌드 시간을 줄이려면 `nproc` 명령을 사용하여 Raspberry Pi의 CPU 코어 수를 동적으로 계산합니다.

1. `libgstkvssink.so`이 존재하는지 확인합니다.

   현재 디렉터리의 파일을 나열합니다.

   **프롬프트:**

   ```
   ls
   ```

   **응답**:

   ```
   CMakeCache.txt       dependency                          kvs_gstreamer_sample
   CMakeFiles           kvs_gstreamer_audio_video_sample    kvssink_gstreamer_sample
   Makefile             kvs_gstreamer_file_uploader_sample  libKinesisVideoProducer.so
   cmake_install.cmake  kvs_gstreamer_multistream_sample    libgstkvssink.so
   ```

1. GStreamer가를 로드할 수 있는지 확인합니다`kvssink`.

   `GST_PLUGIN_PATH` 환경 변수를가 포함된 디렉터리로 설정합니다`libgstkvssink.so`.

   ```
   export GST_PLUGIN_PATH=`pwd`
   ```

   GStreamer 로드`kvssink`:

   ```
   gst-inspect-1.0 kvssink
   ```

   에 대한 몇 가지 설명서가 표시됩니다`kvssink`. 화살표 키를 사용하여 탐색하고를 눌러 종료`q`합니다.

1. (**선택 사항**) `GST_PLUGIN_PATH` 환경 변수 설정을 포함하도록 쉘의 시작 스크립트를 업데이트합니다. 이렇게 하면 새 터미널 세션 중에 `GST_PLUGIN_PATH`가 올바르게 설정됩니다. Raspberry Pi 디바이스에서 쉘의 시작 스크립트는 입니다`~/.bashrc`.

   다음 명령을 실행하여 셸의 시작 스크립트 끝에 명령을 추가합니다.

   ```
   echo "export GST_PLUGIN_PATH=~/Downloads/kvs-producer-sdk-cpp/build" >> ~/.bashrc
   ```

   다음을 입력하여 쉘의 시작 스크립트를 실행하거나 현재 쉘을 닫고 새 쉘을 엽니다.

   ```
   source ~/.bashrc
   ```

   가 설정`GST_PLUGIN_PATH`되었는지 확인하고를 로드할 수 있습니다`kvssink`.

   ```
   echo $GST_PLUGIN_PATH
   ```

   ```
   gst-inspect-1.0 kvssink
   ```

# Kinesis 비디오 스트림으로 비디오 스트리밍
<a name="producersdk-cpp-rpi-run"></a>

샘플 애플리케이션을 실행하려면 다음 정보가 필요합니다.
+ [사전 조건](producersdk-cpp-rpi-prerequisites.md) 단원에서 생성한 스트림 이름입니다.
+ [Kinesis Video Streams에 쓸 수 있는 권한이 있는 IAM 사용자 생성](producersdk-cpp-rpi-iam.md)에서 생성한 계정 자격 증명(액세스 키 ID 및 보안 액세스 키)입니다.
+ GStreamer는 `kvssink` 플러그인을 찾을 수 있습니다. 자세한 정보는 [Kinesis Video Streams C\$1\$1 생산자 SDK 다운로드 및 빌드](producersdk-cpp-rpi-download.md)을 참조하세요.

1. 자격 증명과 리전을 설정합니다.

   ```
   export AWS_ACCESS_KEY_ID=YourAccessKey
   export AWS_SECRET_ACCESS_KEY=YourSecretKey
   export AWS_DEFAULT_REGION=us-west-2
   ```

   다른 인증 방법은 섹션을 참조하세요[에 자격 증명 제공 `kvssink`](examples-gstreamer-plugin-parameters.md#credentials-to-kvssink).
**참고**  
C\$1\$1 생산자 SDK는 기본적으로 미국 서부(오레곤)(`us-west-2`) 리전을 사용합니다. 기본값을 사용하려면 미국 서부(오레곤) 리전에서 Kinesis 비디오 스트림을 AWS 리전 생성합니다.  
Kinesis 비디오 스트림에 다른 리전을 사용하려면 다음 환경 변수를 해당 리전(예: *us-east-1*)으로 설정합니다.  

   ```
   export AWS_DEFAULT_REGION=us-east-1 
   ```

1. 입력 미디어에 따라 다음 중 하나를 선택합니다.

------
#### [ Sample GStreamer video ]

   이 GStreamer 파이프라인은 해상도가 640x480픽셀인 초당 10프레임으로 실행되는 표준 테스트 패턴을 사용하여 라이브 테스트 비디오 스트림을 생성합니다. 현재 시스템 시간과 날짜를 표시하는 오버레이가 추가됩니다. 그런 다음 비디오가 H.264 형식으로 인코딩되고 최대 10프레임마다 키프레임이 생성되어 조각 기간(사진 그룹(GoP) 크기라고도 함)이 1초가 됩니다. kvssink는 H.264로 인코딩된 비디오 스트림을 가져와 Matroska(MKV) 컨테이너 형식으로 패키징하고 Kinesis 비디오 스트림에 업로드합니다.

   다음 명령을 실행합니다.

   ```
   gst-launch-1.0 -v videotestsrc is-live=true \
     ! video/x-raw,framerate=10/1,width=640,height=480 \
     ! clockoverlay time-format="%a %B %d, %Y %I:%M:%S %p" \
     ! x264enc bframes=0 key-int-max=10 \
     ! h264parse \
     ! kvssink stream-name="YourStreamName"
   ```

   GStreamer 파이프라인을 중지하려면 터미널 창을 선택하고 **CTRL\$1C**를 누릅니다.

   샘플 비디오 GStreamer 파이프라인은 다음과 같습니다.

![\[오버레이된 날짜 및 타임스탬프가 있는 표준 테스트 패턴의 이미지입니다.\]](http://docs.aws.amazon.com/ko_kr/kinesisvideostreams/latest/dg/images/sample-video.png)


------
#### [ USB web cam ]

   다음 명령을 실행하여 GStreamer가 USB 카메라를 자동으로 감지하도록 합니다.

   ```
   gst-launch-1.0 autovideosrc \
     ! videoconvert \
     ! video/x-raw,format=I420,width=640,height=480 \
     ! x264enc bframes=0 key-int-max=45 tune=zerolatency byte-stream=true speed-preset=ultrafast \
     ! h264parse \
     ! video/x-h264,stream-format=avc,alignment=au,profile=baseline \
     ! kvssink stream-name="YourStreamname"
   ```

   GStreamer 파이프라인을 중지하려면 터미널 창을 선택하고 **CTRL\$1C**를 누릅니다.

   GStreamer가 자동으로 감지하도록 하는 대신 특정 디바이스 식별자`v4l2src`와 함께를 사용할 수 있습니다. 다음 명령을 실행합니다.

   ```
   gst-device-monitor-1.0
   ```

   출력에는 일부 디바이스와 디바이스 사용 방법에 대한 GStreamer 파이프라인의 시작이 표시됩니다.

   ```
   Device found:
   
       name  : H264 USB Camera: USB Camera
       class : Video/Source
       caps  : video/x-h264, stream-format=(string)byte-stream, alignment=(string)au, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, colorimetry=(string){ 2:4:7:1 }, framerate=(fraction){ 30/1, 25/1, 15/1 };
               ...
       properties:
           device.path = /dev/video4
           udev-probed = false
           device.api = v4l2
           v4l2.device.driver = uvcvideo
           v4l2.device.card = "H264\ USB\ Camera:\ USB\ Camera"
           v4l2.device.bus_info = usb-3f980000.usb-1.3
           v4l2.device.version = 265767 (0x00040e27)
           v4l2.device.capabilities = 2216689665 (0x84200001)
           v4l2.device.device_caps = 69206017 (0x04200001)
       gst-launch-1.0 v4l2src device=/dev/video4 ! ...
   ```

   GStreamer 파이프라인을 중지하려면 터미널 창을 선택하고 **CTRL\$1C**를 누릅니다.

------
#### [ Raspberry Pi camera module 1 ]

   에서 Pi 카메라 모듈 1 또는 Pi 카메라 모듈 2를 사용하는 경우 다음을 `bcm2835-v4l2`사용합니다.

   ```
   gst-launch-1.0 v4l2src device=/dev/video0 \
     ! videoconvert \
     ! video/x-raw,format=I420,width=640,height=480 \
     ! x264enc bframes=0 key-int-max=45 bitrate=500 tune=zerolatency \
     ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=baseline \
     ! kvssink stream-name="YourStreamname"
   ```

   GStreamer 파이프라인을 중지하려면 터미널 창을 선택하고 **CTRL\$1C**를 누릅니다.

------
#### [ Raspberry Pi camera module 2 or 3 ]

   최신 `libcamera` 스택을 사용하는 경우 다음 GStreamer 파이프라인을 사용합니다.

   ```
   gst-launch-1.0 libcamerasrc \
     ! video/x-raw,width=640,height=480,framerate=30/1,format=I420 \
     ! videoconvert \
     ! x264enc speed-preset=ultrafast tune=zerolatency byte-stream=true key-int-max=75 \
     ! video/x-h264,level='(string)4' \
     ! h264parse \
     ! video/x-h264,stream-format=avc,alignment=au,width=640,height=480,framerate=30/1 \
     ! kvssink stream-name="YourStreamname"
   ```

   GStreamer 파이프라인을 중지하려면 터미널 창을 선택하고 **CTRL\$1C**를 누릅니다.

------
#### [ Sample RTSP camera ]

   이 예제에서는 Gst-Rtsp-Server를 사용하여 데모 RTSP 카메라 피드를 로컬로 호스팅합니다. 그런 다음 해당 RTSP 카메라 피드를 지정된 Kinesis 비디오 스트림에 업로드하는 GStreamer 파이프라인을 구성합니다.

   **Raspberry Pi에서 Gst-Rtsp-Server를 설정하려면**

   1. Gst-Rtsp-Server 프로젝트를 빌드하는 데 필요한 종속성 라이브러리를 설치합니다. 소프트웨어 사전 조건도 설치되어 있는지 확인합니다. 터미널에 다음을 입력합니다.

      ```
      sudo apt-get update
      sudo apt-get install libgstrtspserver-1.0
      ```

   1. Raspberry Pi에서 1.22 버전의 GStreamer를 다운로드합니다.

      ```
      git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.git --single-branch -b 1.22
      ```

   1. 디렉터리를 gst-rtsp-server의 예제 디렉터리로 변경합니다.

      ```
      cd gstreamer
      cd subprojects
      cd gst-rtsp-server
      cd examples
      ```

   1. gcc를 사용하여 test-launch.c를 test-launch라는 실행 파일로 컴파일합니다.

      ```
      gcc -o test-launch test-launch.c `pkg-config --cflags --libs gstreamer-rtsp-server-1.0`
      ```

   1. 다음 인수를 사용하여 실행 파일을 실행합니다. 참고: GStreamer를 처음 로드하는 데 다소 시간이 걸릴 수 있습니다.

      ```
      ./test-launch "videotestsrc is-live=true ! video/x-raw,height=480,width=640,framerate=10/1 ! videoconvert ! x264enc tune=zerolatency bitrate=512 key-int-max=25 bframes=0 ! h264parse ! rtph264pay ! name=pay0 pt=96"
      ```

      다음 결과가 표시됩니다.

      ```
      stream ready at rtsp://127.0.0.1:8554/test
      ```

   1. RTSP 비디오 스트림을 확인합니다. 모든 RTSP 뷰어를 사용할 수 있습니다. 예: VLC 미디어 플레이어. VLC 미디어 플레이어를 사용하여 라이브 스트림을 보려면 새 터미널을 열고 다음을 입력합니다.

      ```
      sudo apt-get install vlc
      ```

      VLC 미디어 플레이어를 설치합니다. 그런 다음 다음을 입력합니다.

      ```
      vlc rtsp://127.0.0.1:8554/test
      ```

      VLC 창이 라이브 스트림과 함께 팝업되어야 합니다. 그렇지 않은 경우 테스트 시작 실행 파일이 아직 실행 중인지 확인하고 출력에 오류가 있는지 확인합니다.

      RTSP 스트림을 확인하는 또 다른 방법은 gst-discoverer-1.0 유틸리티를 사용하는 것입니다. 유형: 

      ```
      gst-discoverer-1.0 "rtsp://127.0.0.1:8554/test"
      ```

      예상 출력은 다음과 같습니다.

      ```
      Analyzing rtsp://127.0.0.1:8554/test
      Done discovering rtsp://127.0.0.1:8554/test
      
      Properties:
        Duration: 99:99:99.999999999
        Seekable: no
        Live: yes
        unknown #0: application/x-rtp
          video #1: H.264 (Constrained Baseline Profile)
            Stream ID: 359314d7d4bba383223927d7e57d4244d0800e629c626be81c505055c62170e2/video:0:0:RTP:AVP:96
            Width: 640
            Height: 480
            Depth: 24
            Frame rate: 10/1
            Pixel aspect ratio: 1/1
            Interlaced: false
            Bitrate: 0
            Max bitrate: 0
      ```

   **kvssink를 사용하여 Kinesis Video Stream으로 RTSP 피드를 보내려면**

   이 GStreamer 파이프라인은 `rtspsrc`를 사용하여 RTSP 서버에 연결하여 RTP 비디오 스트림을 가져옵니다. 프레임을에 전달`rtph264depay`하여 RTP 패킷에서 H.264 인코딩 비디오 프레임을 추출합니다.는 비디오 프레임을 이해할 `kvssink` 수 있는 형식으로 `h264parse` 그룹화합니다. `kvssink`는 H.264 인코딩 비디오 스트림을 가져와 Matroska(MKV) 컨테이너 형식으로 패키징하고 Kinesis 비디오 스트림에 업로드합니다.

   다음 명령을 실행합니다.

   ```
   gst-launch-1.0 -v rtspsrc location="rtsp://127.0.0.1:8554/test" short-header=true \
     ! rtph264depay \
     ! h264parse \
     ! video/x-h264,format=avc,alignment=au \
     ! kvssink stream-name="YourStreamName"
   ```

   GStreamer 파이프라인을 중지하려면 터미널 창을 선택하고 **CTRL\$1C**를 누릅니다.

------

## 하드웨어 사용
<a name="producersdk-cpp-rpi-utilize"></a>

일부 Raspberry Pi 모델은 하드웨어 가속 H.264 인코더와 함께 제공됩니다. 소프트웨어 인코더`x264enc`인 대신 사용할 수 있습니다.

1. GStreamer 플러그인이 설치되어 있는지 확인합니다.

   ```
   sudo apt-get install gstreamer1.0-tools gstreamer1.0-plugins-bad
   ```

1. 유형: 

   ```
   gst-inspect-1.0 | grep h264
   ```

   다음 요소를 사용할 수 있는지 확인합니다.
   + omxh264enc
   + v4l2h264enc

   사용 가능한 경우 사용할 수 있습니다. 다음은 이러한 요소를 사용하는 몇 가지 파이프라인 예제입니다.

   **`omxh264enc`:**

   ```
   gst-launch-1.0 v4l2src device=/dev/video0 \
     ! videoconvert \
     ! video/x-raw,format=I420,width=640,height=480 \
     ! omxh264enc control-rate=2 target-bitrate=512000 periodicity-idr=45 inline-header=FALSE \
     ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=baseline \
     ! kvssink stream-name="raspberry"
   ```

   **`v4l2h264enc` 및 `v4l2convert`:**

   ```
   gst-launch-1.0 libcamerasrc \
     ! video/x-raw,width=640,height=480,framerate=30/1,format=I420 \
     ! v4l2convert \
     ! v4l2h264enc extra-controls="controls,repeat_sequence_header=1" \
     ! video/x-h264,level='(string)4' \
     ! h264parse \
     ! video/x-h264,stream-format=avc,alignment=au,width=640,height=480,framerate=30/1 \
     ! kvssink stream-name="test-stream"
   ```

## 런타임 문제
<a name="rpi-troubleshoot-runtime"></a>

다음은 자주 발생하는 몇 가지 런타임 문제와 이를 해결하는 방법입니다.

### 이러한 요소 "xxxxxxxxx" 없음
<a name="rpi-troubleshoot-missing-plugin"></a>

다음과 같은 오류가 발생하면 GStreamer 플러그인이 누락된 것입니다.

```
WARNING: erroneous pipeline: no element "videoconvert"
```

**​해결 방법:**

누락된 요소를 기반으로 적절한 조치를 결정합니다.
+ `kvssink`: 단원을 참조하십시오[Kinesis Video Streams C\$1\$1 생산자 SDK 다운로드 및 빌드](producersdk-cpp-rpi-download.md).
+ `libcamerasrc`: `libcamerasrc` GStreamer 요소를 설치["버퍼 풀 활성화 실패" 오류](#rpi-troubleshoot-buffer)하려면 섹션을 참조하세요.
+ `omxh264enc` 또는 `v4l2h264enc`: 

  [소프트웨어 사전 조건 설치](producersdk-cpp-rpi-software.md)에 따라 모든 GStreamer 라이브러리를 설치합니다. 모두 설치했는데 이러한 요소가 표시되지 않는 경우 Raspberry Pi에 하드웨어가 없다는 의미입니다. `x264enc` 대신 소프트웨어 인코더를 사용합니다.
+ 기타: [소프트웨어 사전 조건 설치](producersdk-cpp-rpi-software.md)에 따라 모든 GStreamer 라이브러리를 설치합니다. 다양한 GStreamer 플러그인 그룹(좋음, 나쁨, 이상)에서 다양한 GStreamer 요소가 발견되므로 모두 설치해야 합니다.

### "버퍼 풀 활성화 실패" 오류
<a name="rpi-troubleshoot-buffer"></a>

다음과 같은 오류가 발생하면 사용 중인 파이프라인이를 사용하고 `v4l2src`있지만 `libcamerasrc` 대신를 사용해야 한다는 의미입니다.

```
ERROR bufferpool gstbufferpool.c:572:gst_buffer_pool_set_active:source:pool0:src start failed
WARN v4l2src gstv4l2src.c:976:gst_v4l2src_decide_allocation: error: Failed to allocate required memory.
WARN v4l2src gstv4l2src.c:976:gst_v4l2src_decide_allocation: error: Buffer pool activation failed
WARN basesrc gstbasesrc.c:3352:gst_base_src_prepare_allocation: Subclass failed to decide allocation
Error received from element source: Failed to allocate required memory.
WARN basesrc gstbasesrc.c:3132:gst_base_src_loop: error: Internal data stream error.
Debugging information: ../sys/v4l2/gstv4l2src.c(976): gst_v4l2src_decide_allocation (): /GstPipeline:live-kinesis-pipeline/GstV4l2Src:source:
Buffer pool activation failed
WARN basesrc gstbasesrc.c:3132:gst_base_src_loop: error: streaming stopped, reason not-negotiated (-4)
```

예를 들어 카메라 모듈 2가 `libcamerasrc` 설치되지 않은 상태에서 다음 파이프라인를 사용하는 경우 GStreamer가 사용할 요소를 자동으로 감지하려고 할 때이 오류가 발생할 수 있습니다.

```
gst-launch-1.0 autovideosrc ! videoconvert ! autovideosink
```

**​해결 방법:**

`libcamerasrc`가 설치되어 있고 대신 소스 요소로 사용해야 합니다`v4l2src`. 다음을 입력하여 `libcamerasrc` GStreamer 요소를 설치합니다.

```
sudo apt-get update
sudo apt-get install gstreamer1.0-libcamera
```

`libcamerasrc`가 설치되면 `autovideosrc` 요소를 사용하는 경우 GStreamer는 `libcamerasrc` 대신 올바른 소스를 사용하도록 자동으로 전환해야 합니다`v4l2src`.

### 버스 오류
<a name="rpi-troubleshoot-bus"></a>

시작 직후 버스 오류가 발생하면`kvssink`(일반적으로에 대한 HTTP 호출이 `PutMedia`완료될 때까지) Raspberry Pi가 정렬되지 않은 메모리 액세스를 지원하지 않는다는 의미입니다. 로그는 다음과 같습니다.

```
INFO Camera camera.cpp:1197 configuring streams: (0) 640x480-YUV420
INFO RPI pisp.cpp:1450 Sensor: /base/axi/pcie@120000/rp1/i2c@88000/imx708@1a - Selected sensor format: 1536x864-SBGGR10_1X10 - Selected CFE format: 1536x864-PC1B
[INFO ] kinesisVideoStreamFormatChanged(): Stream format changed.
[DEBUG] setRequestHeader(): Appending header to request: user-agent -> AWS-SDK-KVS-CPP-CLIENT/3.4.2/1.5.3 GCC/12.2.0 Linux/6.6.51+rpt-rpi-v8 aarch64 CPPSDK
[DEBUG] setRequestHeader(): Appending header to request: x-amzn-stream-name -> demo-stream
[DEBUG] setRequestHeader(): Appending header to request: x-amzn-producer-start-timestamp -> 1732012345.678
[DEBUG] setRequestHeader(): Appending header to request: x-amzn-fragment-acknowledgment-required -> 1
[DEBUG] setRequestHeader(): Appending header to request: x-amzn-fragment-timecode-type -> ABSOLUTE
[DEBUG] setRequestHeader(): Appending header to request: transfer-encoding -> chunked
[DEBUG] setRequestHeader(): Appending header to request: connection -> keep-alive
[INFO ] putStreamResultEvent(): Put stream result event. New upload handle 0
[WARN ] notifyDataAvailable(): [demo-stream] Failed to un-pause curl with error: 43. Curl object 0xe2f6f418
Bus error
```

Kinesis Video Streams PIC는 정렬되지 않은 메모리 액세스를 사용하여 모든 디바이스에서 지원되지 않는 메모리 사용량을 최적화합니다.

**​해결 방법:**

정렬된 메모리 액세스 모드에서 SDK를 사용하려면 기본적으로 로 `kvssink`설정되므로 컴파일 `ON` 시 `ALIGNED_MEMORY_MODEL` CMake 플래그를 로 명시적으로 설정해야 합니다`OFF`. 자세한 지침은 [Kinesis Video Streams C\$1\$1 생산자 SDK 다운로드 및 빌드](producersdk-cpp-rpi-download.md) 단원을 참조하십시오.

### 타임스탬프가 고정되고 파이프라인이 정지됩니다.
<a name="rpi-troubleshoot-pipeline"></a>

GStreamer 파이프라인`x264enc`에서를 사용할 때 파이프라인의 타임라인이 몇 초 내에 크게 또는 완전히 멈출 수 있는 상황이 발생할 수 있습니다.

이는 `x264enc` 기본 설정에서 기본 입력 버퍼의 용량을 초과하는 높은 인코딩 지연 시간이 발생할 수 있기 때문입니다. 따라서 입력 버퍼가 채워져 업스트림 요소가 차단되고 파이프라인이 중지됩니다.

자세한 내용은 [GStreamer 설명서를](https://gstreamer.freedesktop.org/documentation/x264/index.html?gi-language=c) 참조하세요.

**​해결 방법:**

튜닝 옵션으로 `zerolatency` `x264enc`를 구성합니다. 이렇게 하면 실시간 시나리오에 맞게 최적화하여 프레임을 더 빠르게 처리하고 출력하여 인코딩 지연 시간을 크게 줄일 수 있습니다.

구성 예제:

```
... ! x264enc tune=zerolatency byte-stream=true speed-preset=ultrafast bframes=0 key-int-max=60 ! ...
```

**참고**  
이 솔루션은 파이프라인 가동 중지를 효과적으로 방지하지만 인코딩 효율성과 품질에 영향을 미칠 수 있습니다. 짧은 지연 시간과 고품질이 모두 필요한 시나리오의 경우 하드웨어 최적화를 사용하거나 H.264를 직접 출력하는 웹캠을 찾는 등이 인코딩 단계를 건너뛰는 등 대체 접근 방식을 고려하세요.  
자세한 내용은 [하드웨어 사용](#producersdk-cpp-rpi-utilize) 단원을 참조하십시오.

### 동일한 `v4l2` 디바이스에서 동시에 여러 파이프라인을 실행할 수 없음
<a name="rpi-troubleshoot-multiple-pipelines"></a>

와 같은 디바이스는 한 번에 한 프로세스만 액세스할 `/dev/video0` 수 있습니다. 여러 프로세스가 동시에 액세스하려고 하면 두 번째 프로세스가 첫 번째 프로세스가 완료될 때까지 대기합니다.

**​해결 방법:**

루프백 디바이스를 생성하여 여러 프로세스가 루프백 인터페이스를 동시에 사용할 수 있도록 합니다. 자세한 내용은 [스택 교환](https://raspberrypi.stackexchange.com/questions/19630/take-picam-image-while-motion-is-running/19897#19897)을 참조하세요.

### 내부 데이터 스트림 오류
<a name="rpi-troubleshoot-internal-error"></a>

GStreamer 파이프라인을 생성할 때 한 요소의 소스 패드를 다른 요소의 싱크 패드에 연결하여 요소를 연결합니다. 이 연결 프로세스를 통해 소스 요소에서 싱크 요소로 데이터를 흐르게 하여 데이터 파이프라인을 구성할 수 있습니다.

로그의 "Pad link failed" 오류 메시지는 GStreamer가 파이프라인에 있는 두 요소의 패드 간에 연결(링크)을 설정하려고 할 때 문제가 발생했음을 나타냅니다.

```
Pad link failed
Error received from element udpsrc0: Internal data stream error.
```

**​해결 방법:**

어떤 요소가 서로 연결되지 않는지 결정합니다. 파이프라인 범위를 좁히려면 파이프라인에서 요소를 제거합니다. 가장 오른쪽 요소를 로 바꾸`fakesink`고 한 번에 하나씩 요소를 제거합니다.

[capsfilter](https://gstreamer.freedesktop.org/documentation/coreelements/capsfilter.html?gi-language=c) 요소를 조정하거나 파이프라인에서 사용하는 요소를 변경해야 할 수 있습니다.

일반적인 경우는 카메라가 지원하지 않는 `framerate` 또는를 요청하는 `resolution` 것입니다. 터미널`gst-device-monitor-1.0`에서를 사용하여 지원되는 `framerates`, `resolutions`및를 가져옵니다`formats`. [비디오스케일](https://gstreamer.freedesktop.org/documentation/videoconvertscale/videoscale.html?gi-language=c) GStreamer 요소를 사용하여 비디오 해상도를 조정하고 [비디오 속도를](https://gstreamer.freedesktop.org/documentation/videorate/?gi-language=c) 조정하여 비디오 프레임 속도를 조정할 수 있습니다.

개별 GStreamer 요소에 대해 지원되는 형식을 검사하려면 터미널`gst-inspect-1.0 element-name`에를 입력합니다.

# Kinesis 비디오 스트림에서 미디어 재생
<a name="producersdk-cpp-rpi-playback"></a>

[Kinesis Video Streams 콘솔](https://console.aws.amazon.com//kinesisvideo/home/)을 열고 생성한 스트림의 스트림 **이름을** 선택합니다.

Raspberry Pi에서 전송된 비디오 스트림이 콘솔에 나타납니다.

**참고**  
콘솔에 비디오가 표시되기까지 몇 초 정도 걸릴 수 있습니다.

스트림이 재생되면 콘솔에서 다음 기능을 실험할 수 있습니다.
+ **Video preview**(비디오 미리 보기) 섹션에서 탐색 컨트롤을 사용하여 스트림을 되감거나 앞으로 빨리 재생합니다.
+ **스트림 정보** 섹션에서 스트림의 코덱, 해상도 및 비트레이트를 검토합니다. 해상도 및 비트 전송률 값은이 자습서의 대역폭 사용량을 최소화하기 위해 Raspberry Pi에서 의도적으로 낮게 설정됩니다.

  스트림에 대해 생성 중인 Amazon CloudWatch 지표를 보려면 ** CloudWatch에서 스트림 지표 보기를** 선택합니다.
+ **데이터 보존 기간**에서는 비디오 스트림이 1일 동안 보존된다고 표시되어 있습니다. 이 값을 편집해 **No data retention**(데이터 보존 안 함)으로 설정하거나 이 값을 1일\$1며칠로 설정할 수 있습니다.
+ **서버 측 암호화**에서 데이터가 AWS Key Management Service ()에서 유지 관리하는 키를 사용하여 저장 시 암호화됩니다AWS KMS.

## 재생 문제
<a name="rpi-troubleshoot-playback"></a>

다음은 자주 발생하는 재생 문제와 이를 해결하는 방법입니다.

### 미디어는 없지만 로그에 PERSISTED Acks가 있음
<a name="rpi-troubleshoot-no-media"></a>

로그에 PERSISTED Acks가 표시되면 Kinesis Video Streams가에서 업로드한 미디어를 성공적으로 수집하고 저장한 것입니다`kvssink`. Kinesis Video Streams에서 받은 승인은 다음과 같습니다. JSON에서 `"EventType"` 키의 값을 확인합니다.

```
{"EventType":"RECEIVED","FragmentTimecode":252200,"FragmentNumber":"12345678901234567890123456724587702494771079511"}
{"EventType":"BUFFERING","FragmentTimecode":252467,"FragmentNumber":"12345678901234567890123456781729223736853277017"}
{"EventType":"RECEIVED","FragmentTimecode":252467,"FragmentNumber":"12345678901234567890123456781729223736853277017"}
{"EventType":"BUFFERING","FragmentTimecode":253000,"FragmentNumber":"12345678901234567890123456738870744847093249408"}
{"EventType":"PERSISTED","FragmentTimecode":252200,"FragmentNumber":"12345678901234567890123456724587702494771079511"}
{"EventType":"PERSISTED","FragmentTimecode":252467,"FragmentNumber":"1234567890123456789012345671729223736853277017"}
```

**​해결 방법:**

Kinesis Video Streams 콘솔에서 1\$12분 정도 기다린 다음 이중 오른쪽 화살표를 사용합니다. 미디어가 표시되지 않으면 스트림이 올바른 리전으로 전송되고 있는지 확인하고 스트림 이름의 철자를 검토합니다. 로그에서이 정보를 찾을 수 있습니다.

kvssink가 사용할 리전을 결정하는 방법에 [에 리전 제공 `kvssink`](examples-gstreamer-plugin-parameters.md#kvssink-region) 대한 자세한 내용은 섹션을 참조하세요.

### 미디어를에 로드하는 데 시간이 오래 걸립니다. AWS Management Console
<a name="rpi-troubleshoot-load-time"></a>

**중요**  
콘솔 재생 환경은 HLS 및 DASH 재생 환경과 다릅니다. GitHub의 샘플 미디어 플레이어 [호스팅 웹 페이지를](https://aws-samples.github.io/amazon-kinesis-video-streams-media-viewer/) 사용하여 재생도 테스트합니다. 웹 페이지의 소스 코드는 [여기에서](https://github.com/aws-samples/amazon-kinesis-video-streams-media-viewer) 찾을 수 있습니다.

네트워크 대역폭이 좋지 않거나 디바이스가 제한되어 콘솔에서 미디어가 느리게 로드될 수 있지만 비디오 인코딩 및 조각화와 관련이 있을 수도 있습니다.

**비디오 인코딩 기본 사항:**
+ H.264 및 H.265 인코더는 효율적인 압축을 위해 키 프레임(I-프레임)과 예측 프레임(P-프레임)을 사용합니다.
+ 키 프레임에는 전체 이미지 데이터가 포함된 반면, P 프레임에는 이전 프레임의 변경 사항만 포함됩니다.
+ “키 프레임 간격”은 비디오 스트림에서 키 프레임이 발생하는 빈도를 결정합니다.

**스트리밍의 조각화:**
+ Kinesis Video Streams에서 새 조각은 각 키 프레임으로 시작됩니다. 자세한 내용은 [Kinesis Video Streams 데이터 모델](how-data.md) 단원을 참조하십시오.
+ 조각 길이(초)는 다음과 같이 추정할 수 있습니다. *키 프레임 간격* ÷ *프레임 속도*

  **예:**

  키 프레임 간격이 30이고 프레임 속도가 15fps인 스트림의 경우: 

  조각 길이 = 30 ÷ 15 = 2초

키 프레임 간격이 클수록 조각이 길수록 스트리밍 미디어의 지연 시간이 증가합니다.

**​해결 방법:**

로드 시간을 개선하려면 키 프레임 간격을 줄이는 것이 좋습니다. 이렇게 하면 조각이 짧아져 지연 시간이 줄어들지만 비디오 파일의 크기도 늘어납니다.

`x264enc` GStreamer 요소의 경우 `key-int-max` 속성을 통해 키 프레임 간격을 명시적으로 설정할 수 있습니다.

```
x264enc bframes=0 key-int-max=60
```

로그 출력을 검토할 때 업로드 클라이언트가 Kinesis Video Streams로부터 ACKs 수신하는 빈도를 기록해 둡니다. 키프레임이 더 많이 생성될수록 ACKs 더 많이 반환됩니다.

### 미디어가 왜곡되었거나 아티팩트가 있음
<a name="rpi-troubleshoot-distortion"></a>

이 문제를 해결하려면 모든 케이블이 단단히 연결되어 있어야 합니다. 카메라 모듈에 대한 `libcamera-hello` (또는 레거시 Pi 카메라의 `raspistill` 경우)의 출력을 검토합니다.

GStreamer 파이프라인에서를 `autovideosink` 또는 `matroskamux` 및 `kvssink`로 바꿉니다`filesink`. 예제:

```
... x264enc tune=zerolatency speed-preset=ultrafast bframes=0 key-int-max=60 byte-stream=true ! h264parse ! matroskamux ! filesink location=output.mkv 
```

의 출력 파일 `filesink` 또는를 사용할 때 열리는 미디어 플레이어를 검토하여 아티팩트도 있는지 `autovideosink` 확인합니다.

또한 다음 파이프라인의 출력도 검토합니다.

```
gst-launch-1.0 autovideosrc ! videoconvert ! autovideosink
```

[디워프](https://gstreamer.freedesktop.org/documentation/opencv/dewarp.html?gi-language=c)와 같은 요소를 파이프라인에 추가하면 어안 카메라 출력을 수정할 수 있습니다.

카메라에 대해 지원되는 출력 코덱을 검토하고 필요에 따라 요소를 조정합니다.

예를 들어 USB 카메라가 JPEG 출력만 지원하는 경우를 사용하여 미디어를 H.264로 인코딩하기 전에 `jpegparse` 및 `jpegdec` 요소를 사용하여 미디어를 변환해야 합니다`x264enc`. 유사한 파이프라인 및/또는 웹캠 설정을 가진 다른 사용자를 위해 GStreamer 포럼에서 지원을 검색합니다.

# C\$1\$1 생산자 SDK for Raspberry Pi의 빌드 문제 해결
<a name="troubleshoot-rpi"></a>

빌드 문제가 발생하여 다른 CMake 인수를 시도하려면 깨끗한 빌드를 수행해야 합니다. 다시 시도하기 전에 `open-source``dependency`, 및 `build` 폴더를 삭제합니다.

## OpenSSL 관련 빌드 문제
<a name="troubleshoot-rpi-build"></a>

다음과 비슷한 출력이 수신되면 OpenSSL이 시스템 아키텍처를 잘못 감지했음을 나타냅니다.

```
crypto/md5/md5-aarch64.S: Assembler messages:
crypto/md5/md5-aarch64.S:3: Error: unrecognized symbol type ""
crypto/md5/md5-aarch64.S:6: Error: bad instruction `stp x19,x20,[sp,#-80]!'
crypto/md5/md5-aarch64.S:7: Error: bad instruction `stp x21,x22,[sp,#16]'
crypto/md5/md5-aarch64.S:8: Error: bad instruction `stp x23,x24,[sp,#32]'
crypto/md5/md5-aarch64.S:9: Error: bad instruction `stp x25,x26,[sp,#48]'
```

이 예제에서는이 Raspberry Pi가 실제로 32비트일 때 64비트 버전(`linux-aarch64`)을 빌드하려고 합니다. 일부 Raspberry Pi 디바이스에는 64비트 커널이 있지만 32비트 사용자 공간이 있습니다.

OpenSSL이 빌드하려는 아키텍처를 결정합니다. OpenSSL `configure` 단계 중에 로그 줄을 찾을 수 있습니다.

```
[ 33%] Performing update step for 'project_libopenssl'
-- Already at requested tag: OpenSSL_1_1_1t
[ 44%] No patch step for 'project_libopenssl'
[ 55%] Performing configure step for 'project_libopenssl'
Operating system: x86_64-whatever-linux2
Configuring OpenSSL version 1.1.1t (0x1010114fL) for linux-x86_64
Using os-specific seed configuration
Creating configdata.pm
Creating Makefile
```

시스템의 아키텍처를 확인합니다.
+ 커널 비트 상태 검토: 실행 `uname -m`
+ 사용자 공간 비트 상태 검토: 실행 `getconf LONG_BIT`

`cat /proc/cpuinfo` 또는 `lscpu` 명령을 사용하여 CPU 정보를 검토할 수도 있습니다.

**​해결 방법:**

이 문제를 해결하려면 빌드 시 다음 CMake 인수를 추가하여 OpenSSL이 32비트 ARM 아키텍처에 맞게 올바르게 빌드되도록 합니다.

```
-DBUILD_OPENSSL_PLATFORM=linux-armv4 
```

## GStreamer의 `kvssink` 로드 문제 해결
<a name="troubleshoot-rpi-kvssink"></a>

확인 `GST_PLUGIN_PATH`

현재 쉘 세션의 `GST_PLUGIN_PATH` 환경 변수가가 포함된 디렉터리를 가리키는지 확인합니다`kvssink`. 환경 변수는 세션별로 다르므로 새 세션마다 설정해야 합니다. 이 변경 사항을 영구적으로 적용하려면 “GST\$1PLUGIN\$1PATH 환경 변수 설정을 포함하도록 셸의 시작 스크립트 업데이트”를 참조하세요.

**오류: 공유 객체 파일을 열 수 없음: 해당 파일 또는 디렉터리가 없음**

오류가 발생하면 다음 명령을 `Cannot open shared object file: No such file or directory`실행합니다.

```
gst-inspect-1.0 /path/to/libgstkvssink.so
```

다음 출력을 수신하면 동적 링커가에 필요한 라이브러리를 찾을 수 없음을 나타냅니다`kvssink`. 이는 일반적으로 다음과 같은 이유로 발생합니다.
+ 빌드된 위치와 `kvssink` 다른 위치로 이동합니다.
+ 잘못된 CPU 아키텍처에 대한 교차 컴파일입니다.
+ 필수 종속성이 누락되었습니다.

**출력:**

```
WARNING: erroneous pipeline: no element "kvssink"
error while loading shared libraries: libcproducer.so: cannot open shared object file: No such file or directory
```

**​해결 방법:**

**이동된 라이브러리**의 경우 누락된 라이브러리가 포함된 디렉터리를에 추가합니다`LD_LIBRARY_PATH`.

원래 리포지토리의 루트 디렉터리에서 `find` 유틸리티를 사용하여 누락된 라이브러리를 찾을 수 있습니다. 터미널에서 다음을 입력합니다.

```
find . -name "*libcproducer*" 
```

**출력:**

```
./build/dependency/libkvscproducer/kvscproducer-src/libcproducer.so
```

Linux 디바이스의 파일 경로 구분자는 입니다`:`. 아래 명령은 기존 `LD_LIBRARY_PATH` 환경 변수에 새 폴더 경로를 추가하여 이전 값을 보존합니다.

터미널에 다음을 입력합니다.

```
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/build/dependency/libkvscproducer/kvscproducer-src
```

**중요**  
환경 변수는 세션별로 다릅니다. 세션 간에 변경 사항을 유지하려면 쉘의 시작 스크립트를 수정합니다.

에를 추가해야 `open-source/local/lib`할 수도 있습니다`$LD_LIBRARY_PATH`.

**오류: ./path/to/libcproducer.so.1: 잘못된 ELF 헤더**

**공유 라이브러리**를 로드하는 동안이 오류가 발생하면 심볼 링크()가 손상되었기 때문일 수 있습니다`symlinks`. 호스트 시스템의 운영 체제가 대상 시스템의 운영 체제와 일치하지 않으면 Symlink가 중단될 수 있습니다. Raspberry Pi용 MacBook에서 교차 컴파일을 예로 들 수 있습니다.

또 다른 가능한 원인은 빌드된 바이너리가 잘못된 아키텍처 때문이었다는 것입니다. 예를 들어 바이너리가 x86용으로 빌드된 경우(Raspberry Pi는 ARM CPUs).

오류 및 유형:에 지정된 라이브러리 위치로 이동하여 라이브러리를 `ls -la` 검사합니다`symlinks`.

**응답**:

```
drwxr-xr-x  16 me  staff      512 Sep 10 17:16 .
drwxr-xr-x   7 me  staff      224 Jan  6 23:46 ..
drwxr-xr-x   4 me  staff      128 Sep 10 17:16 engines-1.1
-rwxr-xr-x   1 me  staff  2294496 Sep 10 17:16 libcrypto.1.1.so
-rw-r--r--   1 me  staff  4002848 Sep 10 17:16 libcrypto.a
lrwxr-xr-x   1 me  staff       19 Sep 10 17:16 libcrypto.so -> libcrypto.1.1.so
-rwxr-xr-x   1 me  staff   631176 Sep 10 17:12 liblog4cplus-2.0.3.so
lrwxr-xr-x   1 me  staff       24 Sep 10 17:12 liblog4cplus.so -> liblog4cplus-2.0.3.so
-rwxr-xr-x   1 me  staff     1012 Sep 10 17:12 liblog4cplus.a
-rwxr-xr-x   1 me  staff   694328 Sep 10 17:12 liblog4cplusU-2.0.3.so
lrwxr-xr-x   1 me  staff       25 Sep 10 17:12 liblog4cplusU.dylib -> liblog4cplusU-2.0.3.so
-rwxr-xr-x   1 me  staff     1017 Sep 10 17:12 liblog4cplusU.a
-rwxr-xr-x   1 me  staff   536416 Sep 10 17:16 libssl.1.1.so
-rw-r--r--   1 me  staff   795184 Sep 10 17:16 libssl.a
lrwxr-xr-x   1 me  staff       16 Sep 10 17:16 libssl.so -> libssl.1.1.so
drwxr-xr-x   6 me  staff      192 Sep 10 17:16 pkgconfig
```

위의 샘플 출력에서 `symlinks`는 손상되지 않습니다. 손상된 `symlinks` 에는 대상을 가리키는 화살표가 없습니다.

**​해결 방법:**

심볼 링크를 수정하는 두 가지 옵션이 있습니다.
+ **권장 사항:** `ln` 명령을 `symlink` 사용하여를 다시 생성합니다. 유형: 

  ```
  ln -s /path/to/actual/library /path/to/symlink
  ```
+ 실제 라이브러리 파일을 복사하고와 일치하도록 이름을 바꿉니다`symlink`.
**참고**  
이 옵션을 사용하면 스토리지 사용량이 증가합니다.

교차 컴파일 문제를 방지하려면 Docker와 같은 도구를 사용하여 동일한 운영 체제에서 컴파일하는 것이 가장 좋습니다.

**누락된 종속성:**

누락된 라이브러리 이름이 로 시작하는 경우 위의 "이동된 라이브러리" 섹션을 `libkvs`참조하여 호스트 디바이스에서 대상 디바이스로 Kinesis Video Streams 라이브러리를 설치합니다.

그렇지 않으면 [소프트웨어 사전 조건 설치](producersdk-cpp-rpi-software.md)에 따라 모든 오픈 소스 소프트웨어 사전 조건이 대상 디바이스에 설치되어 있는지 확인합니다.

# 오류 코드 참조
<a name="producer-sdk-errors"></a>

이 섹션에는 [Kinesis Video Streams에 업로드](producer-sdk.md)에 대한 오류 및 상태 코드 정보가 포함되어 있습니다.

공통 문제 해결 방법에 대한 자세한 내용은 [Kinesis Video Streams 문제 해결](troubleshooting.md) 단원을 참조하십시오.

**Topics**
+ [PutFrame 콜백에서 반환한 오류 및 상태 코드 - 플랫폼 독립 코드(PIC)](#producer-sdk-errors-putframe)
+ [PutFrame 콜백에서 반환한 오류 및 상태 코드 - C 생산자 라이브러리](#producer-sdk-errors-putframe-c)

## PutFrame 콜백에서 반환한 오류 및 상태 코드 - 플랫폼 독립 코드(PIC)
<a name="producer-sdk-errors-putframe"></a>

다음 섹션에는 플랫폼 독립 코드(PIC) 내의 `PutFrame` 작업에 대한 콜백에서 반환되는 오류 및 상태 정보가 포함되어 있습니다.

**Topics**
+ [클라이언트 라이브러리에서 반환한 오류 및 상태 코드](#producer-sdk-errors-client)
+ [기간 라이브러리에서 반환한 오류 및 상태 코드](#producer-sdk-errors-duration)
+ [공통 라이브러리에서 반환된 오류 및 상태 코드](#producer-sdk-errors-common)
+ [힙 라이브러리에서 반환한 오류 및 상태 코드](#producer-sdk-errors-heap)
+ [MKVGen 라이브러리에서 반환한 오류 및 상태 코드](#producer-sdk-errors-mkvgen)
+ [추적 라이브러리에서 반환한 오류 및 상태 코드](#producer-sdk-errors-trace)
+ [Utils 라이브러리에서 반환한 오류 및 상태 코드](#producer-sdk-errors-utils)
+ [보기 라이브러리에서 반환된 오류 및 상태 코드](#producer-sdk-errors-view)

### 클라이언트 라이브러리에서 반환한 오류 및 상태 코드
<a name="producer-sdk-errors-client"></a>

다음 표에는 Kinesis Video Streams `Client` 라이브러리의 메서드에서 반환되는 오류 및 상태 정보가 나와 있습니다.


****  

| 코드 | 메시지 | 설명 | 권장 조치 | 
| --- | --- | --- | --- | 
| 0x52000001 | STATUS\$1MAX\$1STREAM\$1COUNT | 최대 스트림 수에 도달함. | [생산자 SDK 할당량](limits.md#producer-sdk-limits)에 지정된 대로 DeviceInfo에서 최대 스트림 개수를 늘려 지정합니다.. | 
| 0x52000002 | STATUS\$1MIN\$1STREAM\$1COUNT | 최소 스트림 수 오류. | 에서 0보다 큰 최대 스트림 수를 지정합니다DeviceInfo. | 
| 0x52000003 | STATUS\$1INVALID\$1DEVICE\$1NAME\$1LENGTH | 잘못된 디바이스 이름 길이. | 에 지정된 문자의 최대 디바이스 이름 길이를 참조하세요[생산자 SDK 할당량](limits.md#producer-sdk-limits). | 
| 0x52000004 | STATUS\$1INVALID\$1DEVICE\$1INFO\$1VERSION | 잘못된 DeviceInfo 구조 버전. | 구조의 올바른 현재 버전을 지정합니다. | 
| 0x52000005 | STATUS\$1MAX\$1TAG\$1COUNT | 최대 태그 개수에 도달함. | 에 지정된 현재 최대 태그 수를 참조하세요[생산자 SDK 할당량](limits.md#producer-sdk-limits). | 
| 0x52000006 | STATUS\$1DEVICE\$1FINGERPRINT\$1LENGTH | 
| 0x52000007 | STATUS\$1INVALID\$1CALLBACKS\$1VERSION | 잘못된 Callbacks 구조 버전. | 구조의 올바른 현재 버전을 지정합니다. | 
| 0x52000008 | STATUS\$1INVALID\$1STREAM\$1INFO\$1VERSION | 잘못된 StreamInfo 구조 버전. | 구조의 올바른 현재 버전을 지정합니다. | 
| 0x52000009 | STATUS\$1INVALID\$1STREAM\$1NAME\$1LENGTH | 잘못된 스트림 이름 길이. | 에 지정된 최대 스트림 이름 길이를 문자로 참조하세요[생산자 SDK 할당량](limits.md#producer-sdk-limits). | 
| 0x5200000a | STATUS\$1INVALID\$1STORAGE\$1SIZE | 잘못된 스토리지 크기가 지정됨. | 바이트 단위의 스토리지 크기는 [생산자 SDK 할당량](limits.md#producer-sdk-limits)에 지정된 제한을 벗어나면 안 됩니다. | 
| 0x5200000b | STATUS\$1INVALID\$1ROOT\$1DIRECTORY\$1LENGTH | 잘못된 루트 디렉터리 문자열 길이. | 에 지정된 최대 루트 디렉터리 경로 길이를 참조하세요[생산자 SDK 할당량](limits.md#producer-sdk-limits). | 
| 0x5200000c | STATUS\$1INVALID\$1SPILL\$1RATIO | 잘못된 유출 비율. | 유출 비율을 0\$1100의 백분율로 표현합니다. | 
| 0x5200000d | STATUS\$1INVALID\$1STORAGE\$1INFO\$1VERSION | 잘못된 StorageInfo 구조 버전. | 구조의 올바른 현재 버전을 지정합니다. | 
| 0x5200000e | STATUS\$1INVALID\$1STREAM\$1STATE | 스트림이 현재 작업을 허용하지 않는 상태입니다. | 가장 일반적으로이 오류는 SDK가 요청된 작업을 수행하는 데 필요한 상태에 도달하지 못할 때 발생합니다. 예를 들어 GetStreamingEndpoint API 호출이 실패했는데 클라이언트 애플리케이션이 이를 무시하고 스트림에 프레임을 계속 넣으려고 할 경우 이 오류가 발생합니다. | 
| 0x5200000f | STATUS\$1SERVICE\$1CALL\$1CALLBACKS\$1MISSING | Callbacks 구조에 일부 필수 함수에 대한 함수 진입점이 누락됨. | 클라이언트 애플리케이션에서 필수 콜백이 구현되었는지 확인합니다. 이 오류는 플랫폼 독립 코드(PIC) 클라이언트에만 표시됩니다. C\$1\$1 및 기타 더 높은 수준의 래퍼는 이러한 호출을 충족합니다. | 
| 0x52000010 | STATUS\$1SERVICE\$1CALL\$1NOT\$1AUTHORIZED\$1ERROR | 인증되지 않음. | 보안 토큰, 인증서, 보안 토큰 통합 및 만료를 확인합니다. 토큰에 올바른 관련 권한이 있는지 확인합니다. Kinesis Video Streams 샘플 애플리케이션의 경우 환경 변수가 올바르게 설정되었는지 확인합니다. | 
| 0x52000011 | STATUS\$1DESCRIBE\$1STREAM\$1CALL\$1FAILED | DescribeStreamAPI 실패. | 이 오류는 DescribeStream API 재시도 실패 후 반환됩니다. PIC 클라이언트는 재시도를 중지한 후이 오류를 반환합니다. | 
| 0x52000012 | STATUS\$1INVALID\$1DESCRIBE\$1STREAM\$1RESPONSE | 잘못된 DescribeStreamResponse 구조. | DescribeStreamResultEvent에 전달된 구조가 null이거나 null인 Amazon 리소스 이름(ARN)과 같이 잘못된 항목을 포함하고 있습니다. | 
| 0x52000013 | STATUS\$1STREAM\$1IS\$1BEING\$1DELETED\$1ERROR | 스트림 삭제 중 | 삭제 중인 스트림으로 인해 API 실패가 발생했습니다. 스트림을 사용하는 동안 스트림을 삭제하려는 다른 프로세스가 없는지 확인합니다. | 
| 0x52000014 | STATUS\$1SERVICE\$1CALL\$1INVALID\$1ARG\$1ERROR | 서비스 호출에 대해 잘못된 인수가 지정됨. | 백엔드는 서비스 호출 인수가 유효하지 않거나 SDK에서 해석할 수 없는 오류가 발생할 때이 오류를 반환합니다. | 
| 0x52000015 | STATUS\$1SERVICE\$1CALL\$1DEVICE\$1NOT\$1FOUND\$1ERROR | 디바이스를 찾을 수 없음. | 사용 중에 디바이스가 삭제되지 않았는지 확인합니다. | 
| 0x52000016 | STATUS\$1SERVICE\$1CALL\$1DEVICE\$1NOT\$1PROVISIONED\$1ERROR | 디바이스가 프로비저닝되지 않음. | 디바이스가 프로비저닝되었는지 확인합니다. | 
| 0x52000017 | STATUS\$1SERVICE\$1CALL\$1RESOURCE\$1NOT\$1FOUND\$1ERROR | 서비스에서 반환된 일반 리소스가 없음. | 이 오류는 서비스에서 리소스(예: 스트림)를 찾을 수 없는 경우 발생합니다. 이 오류는 상황마다 의미하는 바가 다를 수 있지만 스트림을 생성하기 전에 API를 사용한 것이 원인일 수 있습니다. SDK를 사용하면 스트림이 먼저 생성되었는지 확인합니다. | 
| 0x52000018 | STATUS\$1INVALID\$1AUTH\$1LEN | 잘못된 인증 정보 길이. | [생산자 SDK 할당량](limits.md#producer-sdk-limits)에 지정된 현재 값을 참조하십시오. | 
| 0x52000019 | STATUS\$1CREATE\$1STREAM\$1CALL\$1FAILED | CreateStream API 호출에 실패했습니다. | 작업 실패 이유에 대한 자세한 정보는 오류 문자열을 참조하십시오. | 
| 0x5200002a | STATUS\$1GET\$1STREAMING\$1TOKEN\$1CALL\$1FAILED | GetStreamingToken 호출 실패. | 작업 실패 이유에 대한 자세한 정보는 오류 문자열을 참조하십시오. | 
| 0x5200002b | STATUS\$1GET\$1STREAMING\$1ENDPOINT\$1CALL\$1FAILED | GetStreamingEndpoint API 호출에 실패했습니다. | 작업 실패 이유에 대한 자세한 정보는 오류 문자열을 참조하십시오. | 
| 0x5200002c | STATUS\$1INVALID\$1URI\$1LEN | GetStreamingEndpoint API에서 잘못된 URI 문자열 길이가 반환됨. | [생산자 SDK 할당량](limits.md#producer-sdk-limits)에 지정된 현재 최댓값을 참조하십시오. | 
| 0x5200002d | STATUS\$1PUT\$1STREAM\$1CALL\$1FAILED | PutMedia API 호출에 실패했습니다. | 작업 실패 이유에 대한 자세한 정보는 오류 문자열을 참조하십시오. | 
| 0x5200002e | STATUS\$1STORE\$1OUT\$1OF\$1MEMORY | 콘텐츠 저장소에 메모리가 부족함. | 콘텐츠 스토어는 스트림 간에 공유되기 때문에 모든 스트림에 대한 최대 기간을 저장할 수 있는 충분한 공간에 (조각 모음을 처리하기 위한) \$120%의 충분한 용량이 필요합니다. 스토리지를 오버플로우를 방지해야 합니다. 누적된 스토리지 크기 및 지연 시간 허용 오차에 해당하는 스트림당 최대 기간 값을 선택합니다. 프레임이 콘텐츠 보기 창에서 벗어날 때 프레임을 삭제하는 것이 좋습니다(콘텐츠 스토어 메모리 압력). 이는 프레임을 삭제하면 스트림 압력 알림 콜백이 시작되기 때문입니다. 그러면 애플리케이션이 업스트림 미디어 구성 요소(예: 인코더)를 조정하여 비트 전송률 또는 프레임 수를 줄이거나 적절히 작동합니다. | 
| 0x5200002f | STATUS\$1NO\$1MORE\$1DATA\$1AVAILABLE | 현재 스트림에 사용 가능한 데이터가 없음. | 미디어 파이프라인이 서비스로 전송하기 위해 네트워킹 스레드에서 프레임을 소비하는 것보다 훨씬 더 느리게 생성하는 경우 이는 잠재적으로 유효한 결과입니다. 상위 수준 클라이언트(예: C\$1\$1, Java 또는 Android)는 내부적으로 처리되므로이 경고가 표시되지 않습니다. | 
| 0x52000030 | STATUS\$1INVALID\$1TAG\$1VERSION | 잘못된 Tag 구조 버전. | 구조의 올바른 현재 버전을 지정합니다. | 
| 0x52000031 | STATUS\$1SERVICE\$1CALL\$1UNKNOWN\$1ERROR | 네트워킹 스택에서 알 수 없는 오류 또는 일반 오류가 반환됨. | 자세한 내용은 로그를 참조하십시오. | 
| 0x52000032 | STATUS\$1SERVICE\$1CALL\$1RESOURCE\$1IN\$1USE\$1ERROR | 리소스 사용 중. | 서비스에서 반환됩니다. 자세한 내용은 Kinesis Video Streams API 참조를 참조하세요. | 
| 0x52000033 | STATUS\$1SERVICE\$1CALL\$1CLIENT\$1LIMIT\$1ERROR | 클라이언트 제한. | 서비스에서 반환됩니다. 자세한 내용은 Kinesis Video Streams API 참조를 참조하세요. | 
| 0x52000034 | STATUS\$1SERVICE\$1CALL\$1DEVICE\$1LIMIT\$1ERROR | 디바이스 제한. | 서비스에서 반환됩니다. 자세한 내용은 Kinesis Video Streams API 참조를 참조하세요. | 
| 0x52000035 | STATUS\$1SERVICE\$1CALL\$1STREAM\$1LIMIT\$1ERROR | 스트림 제한. | 서비스에서 반환됩니다. 자세한 내용은 Kinesis Video Streams API 참조를 참조하세요. | 
| 0x52000036 | STATUS\$1SERVICE\$1CALL\$1RESOURCE\$1DELETED\$1ERROR | 리소스가 삭제되었거나 삭제 중임. | 서비스에서 반환됩니다. 자세한 내용은 Kinesis Video Streams API 참조를 참조하세요. | 
| 0x52000037 | STATUS\$1SERVICE\$1CALL\$1TIMEOUT\$1ERROR | 서비스 호출 시간 초과. | 특정 서비스 API 호출로 인해 시간 초과가 발생했습니다. 유효한 네트워크 연결이 있는지 확인합니다. PIC에서는 이 작업을 자동으로 다시 시도합니다. | 
| 0x52000038 | STATUS\$1STREAM\$1READY\$1CALLBACK\$1FAILED | 스트림 준비 상태 알림. | 이 알림은 PIC에서 클라이언트로 전송되어 비동기 스트림이 생성되었는지를 나타냅니다. | 
| 0x52000039 | STATUS\$1DEVICE\$1TAGS\$1COUNT\$1NON\$1ZERO\$1TAGS\$1NULL | 잘못된 태그가 지정됨. | 태그 수는 0이 아니지만 태그는 비어 있습니다. 태그가 지정되었거나 개수가 0인지 확인합니다. | 
| 0x5200003a | STATUS\$1INVALID\$1STREAM\$1DESCRIPTION\$1VERSION | 잘못된 StreamDescription 구조 버전. | 구조의 올바른 현재 버전을 지정합니다. | 
| 0x5200003b | STATUS\$1INVALID\$1TAG\$1NAME\$1LEN | 잘못된 태그 이름 길이. | [생산자 SDK 할당량](limits.md#producer-sdk-limits)에 지정된 태그 이름에 대한 제한 사항을 참조하십시오. | 
| 0x5200003c | STATUS\$1INVALID\$1TAG\$1VALUE\$1LEN | 잘못된 태그 값 길이. | [생산자 SDK 할당량](limits.md#producer-sdk-limits)에 지정된 태그 값에 대한 제한 사항을 참조하십시오. | 
| 0x5200003d | STATUS\$1TAG\$1STREAM\$1CALL\$1FAILED | TagResource API 실패. | TagResource API 호출에 실패했습니다. 유효한 네트워크 연결이 있는지 확인하십시오. 실패에 대한 자세한 내용은 로그를 참조하십시오. | 
| 0x5200003e | STATUS\$1INVALID\$1CUSTOM\$1DATA | PIC API를 호출하는 잘못된 사용자 지정 데이터. | PIC API에 대한 호출에 잘못된 사용자 지정 데이터가 지정되었습니다. 이 오류는 PIC를 직접 사용하는 클라이언트에서만 발생할 수 있습니다. | 
| 0x5200003f | STATUS\$1INVALID\$1CREATE\$1STREAM\$1RESPONSE | 잘못된 CreateStreamResponse 구조. | 구조 또는 멤버 필드가 잘못되었습니다(즉, ARN이 null이거나 [생산자 SDK 할당량](limits.md#producer-sdk-limits)에 지정된 값보다 큼). | 
| 0x52000040 | STATUS\$1CLIENT\$1AUTH\$1CALL\$1FAILED  | 클라이언트 인증 실패. | PIC가 여러 번 재시도한 후 적절한 인증 정보(AccessKeyId 또는 SecretAccessKey)를 가져오지 못했습니다. 인증 통합을 확인하십시오. 샘플 애플리케이션에서는 환경 변수를 사용하여 C\$1\$1 생산자 라이브러리로 자격 증명 정보를 전달합니다. | 
| 0x52000041 | STATUS\$1GET\$1CLIENT\$1TOKEN\$1CALL\$1FAILED | 보안 토큰 호출 실패. | 이러한 상황은 PIC를 직접 사용하는 클라이언트에서 발생할 수 있습니다. 여러 번의 재시도 후 호출에 실패하고 이 오류가 발생합니다. | 
| 0x52000042 | STATUS\$1CLIENT\$1PROVISION\$1CALL\$1FAILED | 프로비저닝 오류. | 프로비저닝이 구현되지 않았습니다. | 
| 0x52000043 | STATUS\$1CREATE\$1CLIENT\$1CALL\$1FAILED | 생산자 클라이언트 생성 실패. | 클라이언트 생성에 실패한 경우 여러 번의 재시도 후 PIC에서 일반 오류를 반환합니다. | 
| 0x52000044 | STATUS\$1CLIENT\$1READY\$1CALLBACK\$1FAILED | 생산자 클라이언트 준비 상태 실패. | PIC가 준비 상태로 되지 못한 경우 PIC 상태 시스템에서 반환합니다. 근본 원인에 대한 자세한 내용은 로그를 참조하십시오. | 
| 0x52000045 | STATUS\$1TAG\$1CLIENT\$1CALL\$1FAILED | 생산자 클라이언트에 대한 TagResource에 실패. | 생산자 클라이언트에 대한 TagResource API 호출에 실패했습니다. 근본 원인에 대한 자세한 내용은 로그를 참조하십시오. | 
| 0x52000046 | STATUS\$1INVALID\$1CREATE\$1DEVICE\$1RESPONSE | 디바이스/생산자 생성 실패. | 상위 수준 SDKs(예: C\$1\$1 또는 Java)는 아직 디바이스 또는 생산자 생성 API를 구현하지 않습니다. PIC를 사용하는 클라이언트는 결과 알림을 사용해 직접 실패를 나타낼 수 있습니다. | 
| 0x52000047 | STATUS\$1ACK\$1TIMESTAMP\$1NOT\$1IN\$1VIEW\$1WINDOW | 수신된 ACK의 타임스탬프가 보기에 없음. | 수신된 ACK에 해당하는 프레임이 콘텐츠 보기 창을 벗어나는 경우 이 오류가 발생합니다. 일반적으로 이 오류는 ACK 전송이 느린 경우 발생합니다. 이 오류는 다운링크가 느리다는 경고 및 표시로 해석할 수 있습니다. | 
| 0x52000048 | STATUS\$1INVALID\$1FRAGMENT\$1ACK\$1VERSION | 잘못된 FragmentAck 구조 버전. | FragmentAck 구조의 올바른 현재 버전을 지정합니다. | 
| 0x52000049 | STATUS\$1INVALID\$1TOKEN\$1EXPIRATION | 잘못된 보안 토큰 만료. | 보안 토큰 만료에는 유예 기간과 함께 현재 타임스탬프보다 큰 향후 절대 타임스탬프가 있어야 합니다. 유예 기간에 대한 제한 사항은 [생산자 SDK 할당량](limits.md#producer-sdk-limits) 단원을 참조하십시오. | 
| 0x5200004a | STATUS\$1END\$1OF\$1STREAM | EOS(스트림 끝) 표시기. | GetStreamData API 호출에서 현재 업로드 처리 세션이 종료되었음을 나타냅니다. 세션이 종료되었으나 오류가 발생한 경우 또는 세션 토큰이 만료되어 세션이 교체 중인 경우 이 오류가 발생합니다. | 
| 0x5200004b | STATUS\$1DUPLICATE\$1STREAM\$1NAME | 중복 스트림 이름. | 여러 스트림이 동일한 스트림 이름을 가질 수 없습니다. 스트림에 대해 고유한 이름을 선택하십시오. | 
| 0x5200004c | STATUS\$1INVALID\$1RETENTION\$1PERIOD | 잘못된 보존 기간. | StreamInfo 구조에 잘못된 보존 기간이 지정되어 있습니다. 보존 기간에 유효한 값의 범위에 대한 자세한 내용은 [생산자 SDK 할당량](limits.md#producer-sdk-limits) 단원을 참조하십시오. | 
| 0x5200004d | STATUS\$1INVALID\$1ACK\$1KEY\$1START | 잘못된 FragmentAck. | 조각 ACK 문자열을 구문 분석하지 못했습니다. 잘못된 키 시작 표시기입니다. 조각 ACK 문자열이 손상되었을 수 있습니다. 자동 수정이 가능하므로 이 오류는 경고로 처리될 수 있습니다. | 
| 0x5200004e | STATUS\$1INVALID\$1ACK\$1DUPLICATE\$1KEY\$1NAME | 잘못된 FragmentAck. | 조각 ACK 문자열을 구문 분석하지 못했습니다. 여러 키의 이름이 동일합니다. 조각 ACK 문자열이 손상되었을 수 있습니다. 자동 수정이 가능하므로 이 오류는 경고로 처리될 수 있습니다. | 
| 0x5200004f | STATUS\$1INVALID\$1ACK\$1INVALID\$1VALUE\$1START | 잘못된 FragmentAck. | 키 값 시작 표시기가 잘못되어 조각 ACK 문자열을 구문 분석하지 못했습니다. 조각 ACK 문자열이 손상되었을 수 있습니다. 자동 수정이 가능하므로 이 오류는 경고로 처리될 수 있습니다. | 
| 0x52000050 | STATUS\$1INVALID\$1ACK\$1INVALID\$1VALUE\$1END | 잘못된 FragmentAck. | 키 값 종료 표시기가 잘못되어 조각 ACK 문자열을 구문 분석하지 못했습니다. 조각 ACK 문자열이 손상되었을 수 있습니다. 자동 수정이 가능하므로 이 오류는 경고로 처리될 수 있습니다. | 
| 0x52000051 | STATUS\$1INVALID\$1PARSED\$1ACK\$1TYPE | 잘못된 FragmentAck. | ACK 유형이 잘못 지정되어 조각 ACK 문자열을 구문 분석하지 못했습니다. | 
| 0x52000052 | STATUS\$1STREAM\$1HAS\$1BEEN\$1STOPPED | 스트림이 중지됨. | 스트림이 중지되었으나 프레임이 스트림에 계속 들어가고 있습니다. | 
| 0x52000053 | STATUS\$1INVALID\$1STREAM\$1METRICS\$1VERSION | 잘못된 StreamMetrics 구조 버전. | StreamMetrics 구조의 올바른 현재 버전을 지정합니다. | 
| 0x52000054 | STATUS\$1INVALID\$1CLIENT\$1METRICS\$1VERSION | 잘못된 ClientMetrics 구조 버전. | ClientMetrics 구조의 올바른 현재 버전을 지정합니다. | 
| 0x52000055 | STATUS\$1INVALID\$1CLIENT\$1READY\$1STATE | 생산자 초기화가 준비 상태에 도달하지 못함. | 생산자 클라이언트 초기화 중 준비 상태에 도달하지 못했습니다. 자세한 내용은 로그를 참조하십시오. | 
| 0x52000056 | STATUS\$1STATE\$1MACHINE\$1STATE\$1NOT\$1FOUND | 내부 상태 시스템 오류. | 공개적으로 표시되는 오류가 아닙니다. | 
| 0x52000057 | STATUS\$1INVALID\$1FRAGMENT\$1ACK\$1TYPE | 잘못된 ACK 유형이 FragmentAck 구조에 지정됨. | FragmentAck 구조에는 퍼블릭 헤더에 정의된 ACK 유형이 포함되어 있어야 합니다. | 
| 0x52000058 | STATUS\$1INVALID\$1STREAM\$1READY\$1STATE | 내부 상태 시스템 전환 오류. | 공개적으로 표시되는 오류가 아닙니다. | 
| 0x52000059 | STATUS\$1CLIENT\$1FREED\$1BEFORE\$1STREAM | 생산자를 비운 후 스트림 객체를 비움. | 생산자 객체를 비운 후 스트림 객체를 비우려는 시도가 있었습니다. 이 오류는 PIC를 직접 사용하는 클라이언트에서만 발생할 수 있습니다. | 
| 0x5200005a | STATUS\$1ALLOCATION\$1SIZE\$1SMALLER\$1THAN\$1REQUESTED | 내부 스토리지 오류. | 콘텐츠 스토어의 실제 할당 크기가 패키징된 프레임 및 조각의 크기보다 작음을 나타내는 내부 오류입니다. | 
| 0x5200005b | STATUS\$1VIEW\$1ITEM\$1SIZE\$1GREATER\$1THAN\$1ALLOCATION | 내부 스토리지 오류. | 콘텐츠 보기에서 할당에 저장된 크기가 콘텐츠 스토어의 할당 크기보다 큽니다. | 
| 0x5200005c | STATUS\$1ACK\$1ERR\$1STREAM\$1READ\$1ERROR | 스트림 읽기 오류 ACK. | 스트림 읽기 또는 구문 분석 오류를 나타내는 ACK가 백엔드에서 반환한 오류입니다. 이 오류는 일반적으로 백엔드에서 스트림을 검색하지 못한 경우 발생합니다. 일반적으로 자동 다시 스트리밍이 수행되면 이 오류가 해결될 수 있습니다. | 
| 0x5200005d | STATUS\$1ACK\$1ERR\$1FRAGMENT\$1SIZE\$1REACHED | 최대 조각 크기에 도달함. | 바이트 단위의 최대 조각 크기는 [생산자 SDK 할당량](limits.md#producer-sdk-limits)에 정의되어 있습니다. 이 오류는 매우 큰 프레임이 있거나 관리 가능한 크기 조각을 생성하는 키 프레임이 없음을 나타냅니다. 인코더 설정을 확인하고 키 프레임이 제대로 생성되고 있는지 확인합니다. 밀도가 매우 높은 스트림의 경우 최대 크기를 관리하려면 보다 짧은 기간에 조각을 생성하도록 인코더를 구성합니다. | 
| 0x5200005e | STATUS\$1ACK\$1ERR\$1FRAGMENT\$1DURATION\$1REACHED | 최대 조각 기간에 도달함. | 최대 조각 기간은 [생산자 SDK 할당량](limits.md#producer-sdk-limits)에 정의되어 있습니다. 이 오류는 초당 프레임 속도가 매우 낮거나 관리 가능한 기간 조각을 생성하는 키 프레임이 없음을 나타냅니다. 인코더 설정을 확인하고 정기적으로 키 프레임이 제대로 생성되고 있는지 확인합니다. | 
| 0x5200005f | STATUS\$1ACK\$1ERR\$1CONNECTION\$1DURATION\$1REACHED | 최대 연결 기간에 도달함. | Kinesis Video Streams는에 지정된 최대 연결 기간을 적용합니다[생산자 SDK 할당량](limits.md#producer-sdk-limits). 생산자 SDK는 최대에 도달하기 전에 스트림 또는 토큰을 자동으로 교체합니다. SDK를 사용하는 클라이언트는이 오류를 수신하지 않아야 합니다. | 
| 0x52000060 | STATUS\$1ACK\$1ERR\$1FRAGMENT\$1TIMECODE\$1NOT\$1MONOTONIC | 타임코드가 단조 증가하지 않음. | 생산자 SDK는 타임스탬프를 적용하므로 SDK를 사용하는 클라이언트는이 오류를 수신하지 않아야 합니다. | 
| 0x52000061 | STATUS\$1ACK\$1ERR\$1MULTI\$1TRACK\$1MKV | MKV에 추적이 여러 개 있음. | 생산자 SDK는 단일 트랙 스트림을 적용하므로 SDK를 사용하는 클라이언트는이 오류를 수신하지 않아야 합니다. | 
| 0x52000062 | STATUS\$1ACK\$1ERR\$1INVALID\$1MKV\$1DATA | MKV 데이터가 잘못됨. | 백엔드 MKV 구문 분석기에서 스트림을 구문 분석하는 중 오류가 발생했습니다. 전환 중에 스트림이 손상된 경우 SDK를 사용하는 클라이언트에게이 오류가 발생할 수 있습니다. 이는 버퍼 압력으로 인해 SDK가 부분적으로 전송되는 테일 프레임을 삭제하는 경우에도 발생할 수 있습니다. 후자의 경우 FPS 및 해상도를 줄이거나 압축률을 높이거나 ('버스트' 네트워크가 있는 경우) 임시 압력을 수용할 수 있도록 더 큰 콘텐츠 스토어 및 버퍼 기간을 허용하는 것이 좋습니다. | 
| 0x52000063 | STATUS\$1ACK\$1ERR\$1INVALID\$1PRODUCER\$1TIMESTAMP | 생산자 타임스탬프가 잘못됨. | 생산자 클록에 미래에 대해 큰 드리프트가 발생하면 서비스에서 이러한 오류 ACK를 반환합니다. 더 높은 수준의 SDK(예: Java 또는 C\$1\$1)에서는 몇 가지 시스템 클록 버전을 사용하여 PIC의 현재 시간 콜백을 충족합니다. 시스템 클럭이 올바르게 설정되었는지 확인합니다. PIC를 직접 사용하는 클라이언트는 콜백 함수가 올바른 타임스탬프를 반환하는지 확인해야 합니다. | 
| 0x52000064 | STATUS\$1ACK\$1ERR\$1STREAM\$1NOT\$1ACTIVE | 비활성 스트림. | 스트림이 "활성" 상태가 아닌데 백엔드 API가 호출되었습니다. 클라이언트가 스트림을 생성한 후 즉시 해당 스트림에 프레임을 집어 넣으려고 하면 이 오류가 발생합니다. SDK에서는 상태 시스템 및 복구 시스템을 통해 이러한 시나리오를 처리합니다. | 
| 0x52000065 | STATUS\$1ACK\$1ERR\$1KMS\$1KEY\$1ACCESS\$1DENIED | AWS KMS 액세스 거부 오류입니다. | 계정에 지정된 키에 대한 액세스 권한이 없는 경우 반환됩니다. | 
| 0x52000066 | STATUS\$1ACK\$1ERR\$1KMS\$1KEY\$1DISABLED | AWS KMS 키가 비활성화되었습니다. | 지정된 키가 비활성화되었습니다. | 
| 0x52000067 | STATUS\$1ACK\$1ERR\$1KMS\$1KEY\$1VALIDATION\$1ERROR  | AWS KMS 키 검증 오류입니다. | 일반적인 확인 오류입니다. 자세한 내용은 [AWS Key Management Service API 참조](https://docs.aws.amazon.com/kms/latest/APIReference/)를 참조하세요. | 
| 0x52000068 | STATUS\$1ACK\$1ERR\$1KMS\$1KEY\$1UNAVAILABLE | AWS KMS key 사용할 수 없습니다. | 이 키를 사용할 수 없습니다. 자세한 내용은 [AWS Key Management Service API 참조](https://docs.aws.amazon.com/kms/latest/APIReference/)를 참조하세요. | 
| 0x52000069 | STATUS\$1ACK\$1ERR\$1KMS\$1KEY\$1INVALID\$1USAGE | KMS 키의 잘못된 사용. |  AWS KMS key 는이 컨텍스트에서 사용하도록 구성되지 않았습니다. 자세한 내용은 [AWS Key Management Service API 참조](https://docs.aws.amazon.com/kms/latest/APIReference/)를 참조하세요. | 
| 0x5200006a | STATUS\$1ACK\$1ERR\$1KMS\$1KEY\$1INVALID\$1STATE | AWS KMS 잘못된 상태입니다. | 자세한 내용은 [AWS Key Management Service API 참조](https://docs.aws.amazon.com/kms/latest/APIReference/)를 참조하세요. | 
| 0x5200006b | STATUS\$1ACK\$1ERR\$1KMS\$1KEY\$1NOT\$1FOUND | KMS 키를 찾을 수 없습니다. | 이 키를 찾을 수 없습니다. 자세한 내용은 [AWS Key Management Service API 참조](https://docs.aws.amazon.com/kms/latest/APIReference/)를 참조하세요. | 
| 0x5200006c | STATUS\$1ACK\$1ERR\$1STREAM\$1DELETED | 스트림이 삭제되었거나 삭제 중임. | 다른 애플리케이션 또는 AWS Management Console을 통해 스트림이 삭제 중입니다. | 
| 0x5200006d | STATUS\$1ACK\$1ERR\$1ACK\$1INTERNAL\$1ERROR | 내부 오류. | 일반적인 서비스 내부 오류  | 
| 0x5200006e | STATUS\$1ACK\$1ERR\$1FRAGMENT\$1ARCHIVAL\$1ERROR | 조각 보관 오류. | 서비스에서 조각을 지속적으로 유지하고 인덱싱하지 못한 경우 반환됩니다. 드문 경우이긴 하지만 이 오류는 다양한 이유로 발생할 수 있습니다. 기본적으로 SDK에서는 조각 전송을 다시 시도합니다. | 
| 0x5200006f | STATUS\$1ACK\$1ERR\$1UNKNOWN\$1ACK\$1ERROR | 알 수 없는 오류. | 서비스에서 알 수 없는 오류를 반환했습니다. | 
| 0x52000070 | STATUS\$1MISSING\$1ERR\$1ACK\$1ID | ACK 정보 누락. | ACK 구문 분석기가 구문 분석을 완료했지만 FragmentAck 정보가 누락되었습니다. | 
| 0x52000071 | STATUS\$1INVALID\$1ACK\$1SEGMENT\$1LEN | 잘못된 ACK 세그먼트 길이. | ACK 구문 분석기에 대해 길이가 잘못된 ACK 세그먼트 문자열이 지정되었습니다. 자세한 내용은 [생산자 SDK 할당량](limits.md#producer-sdk-limits) 단원을 참조하십시오. | 
| 0x52000074 | STATUS\$1MAX\$1FRAGMENT\$1METADATA\$1COUNT | 메타데이터 항목의 최대 수가 조각에 추가되었습니다. | Kinesis 비디오 스트림은 조각에 비영구 항목을 추가하거나 메타데이터 대기열에 영구 항목을 추가하여 조각에 최대 10개의 메타데이터 항목을 추가할 수 있습니다. 자세한 내용은 [Kinesis Video Streams에서 스트리밍 메타데이터 사용](how-meta.md) 단원을 참조하십시오. | 
| 0x52000075 | STATUS\$1ACK\$1ERR\$1FRAGMENT\$1METADATA\$1LIMIT\$1REACHED | 한도(최대 메타데이터 개수, 메타데이터 이름 길이 또는 메타데이터 값 길이)에 도달했습니다. | 생산자 SDK는 메타데이터 항목의 개수와 크기를 제한합니다. 생산자 SDK 코드의 제한이 변경되지 않는 한이 오류는 발생하지 않습니다. 자세한 내용은 [Kinesis Video Streams에서 스트리밍 메타데이터 사용](how-meta.md) 단원을 참조하십시오. | 
| 0x52000076 | STATUS\$1BLOCKING\$1PUT\$1INTERRUPTED\$1STREAM\$1TERMINATED | 구현되지 않음. |  | 
| 0x52000077 | STATUS\$1INVALID\$1METADATA\$1NAME | 메타데이터 이름이 잘못되었습니다. | 메타데이터 이름은 문자열 "AWS"로 시작할 수 없습니다. 이 오류가 발생하면 메타데이터 항목이 조각 또는 메타데이터 대기열에 추가되지 않습니다. 자세한 내용은 [Kinesis Video Streams에서 스트리밍 메타데이터 사용](how-meta.md) 단원을 참조하십시오. | 
| 0x52000078 | STATUS\$1END\$1OF\$1FRAGMENT\$1FRAME\$1INVALID\$1STATE | 한 조각 프레임의 끝부분이 잘못된 상태에 있습니다. | 조각의 끝은 non-key-frame 조각화된 스트림으로 전송해서는 안 됩니다. | 
| 0x52000079 | STATUS\$1TRACK\$1INFO\$1MISSING | 트랙 정보가 누락되었습니다. | 트랙 번호는 0보다 크고 트랙 ID와 일치해야 합니다. | 
| 0x5200007a | STATUS\$1MAX\$1TRACK\$1COUNT\$1EXCEEDED | 최대 트랙 수를 초과했습니다. | 스트림당 최대 3개의 트랙을 가질 수 있습니다. | 
| 0x5200007b | STATUS\$1OFFLINE\$1MODE\$1WITH\$1ZERO\$1RETENTION | 오프라인 스트리밍 모드 보관 기간이 0으로 설정되어 있습니다. | 오프라인 스트리밍 모드 보존 시간은 0으로 설정해서는 안 됩니다. | 
| 0x5200007c | STATUS\$1ACK\$1ERR\$1TRACK\$1NUMBER\$1MISMATCH | 오류 ACK의 트랙 번호가 일치하지 않습니다. |  | 
| 0x5200007d | STATUS\$1ACK\$1ERR\$1FRAMES\$1MISSING\$1FOR\$1TRACK | 트랙에 대한 프레임이 누락되었습니다. |  | 
| 0x5200007e | STATUS\$1ACK\$1ERR\$1MORE\$1THAN\$1ALLOWED\$1TRACKS\$1FOUND | 허용되는 최대 트랙 수를 초과했습니다. |  | 
| 0x5200007f | STATUS\$1UPLOAD\$1HANDLE\$1ABORTED | 업로드 처리가 중단됩니다. |  | 
| 0x52000080 | STATUS\$1INVALID\$1CERT\$1PATH\$1LENGTH | 잘못된 인증서 경로 길이입니다. |  | 
| 0x52000081 | STATUS\$1DUPLICATE\$1TRACK\$1ID\$1FOUND | 중복된 트랙 ID가 확인되었습니다. |  | 
| 0x52000082 | STATUS\$1INVALID\$1CLIENT\$1INFO\$1VERSION |  |  | 
| 0x52000083 | STATUS\$1INVALID\$1CLIENT\$1ID\$1STRING\$1LENGTH |  |  | 
| 0x52000084 | STATUS\$1SETTING\$1KEY\$1FRAME\$1FLAG\$1WHILE\$1USING\$1EOFR |  |  | 
| 0x52000085 | STATUS\$1MAX\$1FRAME\$1TIMESTAMP\$1DELTA\$1BETWEEN\$1TRACKS\$1EXCEEDED |  |  | 
| 0x52000086 | STATUS\$1STREAM\$1SHUTTING\$1DOWN |  |  | 
| 0x52000087 | STATUS\$1CLIENT\$1SHUTTING\$1DOWN |  |  | 
| 0x52000088 | STATUS\$1PUTMEDIA\$1LAST\$1PERSIST\$1ACK\$1NOT\$1RECEIVED |  |  | 
| 0x52000089 | STATUS\$1NON\$1ALIGNED\$1HEAP\$1WITH\$1IN\$1CONTENT\$1STORE\$1ALLOCATORS |  |  | 
| 0x5200008a | STATUS\$1MULTIPLE\$1CONSECUTIVE\$1EOFR |  |  | 
| 0x5200008b | STATUS\$1DUPLICATE\$1STREAM\$1EVENT\$1TYPE |  |  | 
| 0x5200008c | STATUS\$1STREAM\$1NOT\$1STARTED |  |  | 
| 0x5200008d | STATUS\$1INVALID\$1IMAGE\$1PREFIX\$1LENGTH |  |  | 
| 0x5200008e | STATUS\$1INVALID\$1IMAGE\$1METADATA\$1KEY\$1LENGTH |  |  | 
| 0x5200008f | STATUS\$1INVALID\$1IMAGE\$1METADATA\$1VALUE\$1LENGTH |  |  | 

### 기간 라이브러리에서 반환한 오류 및 상태 코드
<a name="producer-sdk-errors-duration"></a>

다음 표에는 `Duration` 라이브러리의 메서드에서 반환되는 오류 및 상태 정보가 나와 있습니다.


****  

| 코드 | 메시지 | 
| --- | --- | 
| 0xFFFFFFFFFFFFFFFF | INVALID\$1DURATION\$1VALUE | 

### 공통 라이브러리에서 반환된 오류 및 상태 코드
<a name="producer-sdk-errors-common"></a>

다음 표에는 `Common` 라이브러리의 메서드에서 반환되는 오류 및 상태 정보가 나와 있습니다.

**참고**  
이러한 오류 및 상태 정보 코드는 다수의 API에 대해 공통적으로 적용됩니다.


****  

| 코드 | 선행 0이 없는 코드 | 메시지 | 설명 | 
| --- | --- | --- | --- | 
| 0x00000001  | 0x1 | STATUS\$1NULL\$1ARG | 필수 인수에 NULL이 전달되었습니다. | 
| 0x00000002  | 0x2 | STATUS\$1INVALID\$1ARG  | 인수에 대해 잘못된 값이 지정되었습니다. | 
| 0x00000003  | 0x3 | STATUS\$1INVALID\$1ARG\$1LEN  | 잘못된 인수 길이가 지정되었습니다. | 
| 0x00000004  | 0x4 | STATUS\$1NOT\$1ENOUGH\$1MEMORY  | 충분한 메모리를 할당할 수 없습니다. | 
| 0x00000005  | 0x5 | STATUS\$1BUFFER\$1TOO\$1SMALL  | 지정된 버퍼 크기가 너무 작습니다. | 
| 0x00000006  | 0x6 | STATUS\$1UNEXPECTED\$1EOF  | 예기치 않게 파일 끝에 도달했습니다. | 
| 0x00000007  | 0x7 | STATUS\$1FORMAT\$1ERROR  | 잘못된 형식이 발생했습니다. | 
| 0x00000008  | 0x8 | STATUS\$1INVALID\$1HANDLE\$1ERROR  | 잘못된 핸들 값입니다. | 
| 0x00000009  | 0x9 | STATUS\$1OPEN\$1FILE\$1FAILED  | 파일을 열지 못했습니다. | 
| 0x0000000a  | 0xa | STATUS\$1READ\$1FILE\$1FAILED | 파일에서 읽지 못했습니다. | 
| 0x0000000b  | 0xb | STATUS\$1WRITE\$1TO\$1FILE\$1FAILED  | 파일에 쓰지 못했습니다. | 
| 0x0000000c  | 0xc | STATUS\$1INTERNAL\$1ERROR  | 일반적으로 발생하지 않지만 SDK 또는 서비스 API 버그를 나타낼 수 있는 내부 오류입니다. | 
| 0x0000000d  | 0xd | STATUS\$1INVALID\$1OPERATION  | 잘못된 작업이 있거나 작업이 허용되지 않습니다. | 
| 0x0000000e  | 0xe | STATUS\$1NOT\$1IMPLEMENTED  | 기능이 구현되지 않았습니다. | 
| 0x0000000f  | 0xf | STATUS\$1OPERATION\$1TIMED\$1OUT  | 작업 시간이 초과되었습니다. | 
| 0x00000010  | 0x10 | STATUS\$1NOT\$1FOUND  | 필요한 리소스가 없습니다. | 
| 0x00000011 | 0x11 | STATUS\$1CREATE\$1THREAD\$1FAILED  | 스레드를 생성하지 못했습니다. | 
| 0x00000012 | 0x12 | STATUS\$1THREAD\$1NOT\$1ENOUGH\$1RESOURCES  | 리소스가 부족하여 다른 스레드를 만들 수 없거나 스레드 수에 시스템 부과 제한이 발생했습니다. | 
| 0x00000013  | 0x13 | STATUS\$1THREAD\$1INVALID\$1ARG  | 잘못된 스레드 속성이 지정되었거나 다른 스레드가 이미이 스레드와 조인을 기다리고 있습니다. | 
| 0x00000014  | 0x14 | STATUS\$1THREAD\$1PERMISSIONS  | 스레드 속성에 지정된 예약 정책 및 파라미터를 설정할 수 있는 권한이 없습니다. | 
| 0x00000015  | 0x15 | STATUS\$1THREAD\$1DEADLOCKED  | 교착 상태가 감지되었거나 조인 스레드가 호출 스레드를 지정합니다. | 
| 0x00000016  | 0x16 | STATUS\$1THREAD\$1DOES\$1NOT\$1EXIST  | 지정된 스레드 ID로 스레드를 찾을 수 없습니다. | 
| 0x00000017  | 0x17 | STATUS\$1JOIN\$1THREAD\$1FAILED  | 스레드 조인 작업에서 알 수 없거나 일반적인 오류가 반환되었습니다. | 
| 0x00000018  | 0x18 | STATUS\$1WAIT\$1FAILED  | 조건부 변수를 기다리는 최대 시간을 초과했습니다. | 
| 0x00000019  | 0x19 | STATUS\$1CANCEL\$1THREAD\$1FAILED  | 스레드 취소 작업에서 알 수 없거나 일반적인 오류가 반환되었습니다. | 
| 0x0000001a  | 0x1a | STATUS\$1THREAD\$1IS\$1NOT\$1JOINABLE  | 스레드 조인 작업은 조인할 수 없는 스레드에서 요청됩니다. | 
| 0x0000001b  | 0x1b | STATUS\$1DETACH\$1THREAD\$1FAILED   | 스레드 분리 작업에서 알 수 없거나 일반적인 오류가 반환되었습니다. | 
| 0x0000001c  | 0x1c | STATUS\$1THREAD\$1ATTR\$1INIT\$1FAILED  | 스레드 속성 객체를 초기화하지 못했습니다. | 
| 0x0000001d  | 0x1d | STATUS\$1THREAD\$1ATTR\$1SET\$1STACK\$1SIZE\$1FAILED  | 스레드 속성 객체의 스택 크기를 설정하지 못했습니다. | 
| 0x0000001e  | 0x1e | STATUS\$1MEMORY\$1NOT\$1FREED  | 테스트에만 사용됩니다. 요청된 메모리가 모두 해제되지 않았음을 나타냅니다. | 
| 0x0000001f | 0x1f | STATUS\$1INVALID\$1THREAD\$1PARAMS\$1VERSION  | 잘못된 "ThreadParams" 구조 버전입니다. 구조의 올바른 현재 버전을 지정합니다. | 

### 힙 라이브러리에서 반환한 오류 및 상태 코드
<a name="producer-sdk-errors-heap"></a>

다음 표에는 `Heap` 라이브러리의 메서드에서 반환되는 오류 및 상태 정보가 나와 있습니다.


****  

| 코드 | 메시지 | 설명 | 
| --- | --- | --- | 
| 0x10000001  | STATUS\$1HEAP\$1FLAGS\$1ERROR  | 플래그의 잘못된 조합이 지정되었습니다. | 
| 0x10000002  | STATUS\$1HEAP\$1NOT\$1INITIALIZED  | 힙이 초기화되기 전에 작업이 시도되었습니다. | 
| 0x10000003  | STATUS\$1HEAP\$1CORRUPTED  | 힙이 손상되었거나 (디버그 모드의) 보호 대역을 덮어 썼습니다. 클라이언트 코드의 버퍼 오버플로우가 힙 손상으로 이어질 수 있습니다. | 
| 0x10000004  | STATUS\$1HEAP\$1VRAM\$1LIB\$1MISSING  | VRAM(비디오 RAM) 사용자 또는 커널 모드 라이브러리를 로드할 수 없거나 누락되었습니다. 기본 플랫폼에서 VRAM 할당을 지원하는지 확인하십시오. | 
| 0x10000005  | STATUS\$1HEAP\$1VRAM\$1LIB\$1REOPEN  | VRAM 라이브러리를 열지 못했습니다. | 
| 0x10000006  | STATUS\$1HEAP\$1VRAM\$1INIT\$1FUNC\$1SYMBOL  | INIT 함수 내보내기를 로드하지 못했습니다. | 
| 0x10000007  | STATUS\$1HEAP\$1VRAM\$1ALLOC\$1FUNC\$1SYMBOL  | ALLOC 함수 내보내기를 로드하지 못했습니다. | 
| 0x10000008  | STATUS\$1HEAP\$1VRAM\$1FREE\$1FUNC\$1SYMBOL  | FREE 함수 내보내기를 로드하지 못했습니다. | 
| 0x10000009  | STATUS\$1HEAP\$1VRAM\$1LOCK\$1FUNC\$1SYMBOL  | LOCK 함수 내보내기를 로드하지 못했습니다. | 
| 0x1000000a  | STATUS\$1HEAP\$1VRAM\$1UNLOCK\$1FUNC\$1SYMBOL  | UNLOCK 함수 내보내기를 로드하지 못했습니다. | 
| 0x1000000b  | STATUS\$1HEAP\$1VRAM\$1UNINIT\$1FUNC\$1SYMBOL  | UNINIT 함수 내보내기를 로드하지 못했습니다. | 
| 0x1000000c  | STATUS\$1HEAP\$1VRAM\$1GETMAX\$1FUNC\$1SYMBOL  | GETMAX 함수 내보내기를 로드하지 못했습니다. | 
| 0x1000000d  | STATUS\$1HEAP\$1DIRECT\$1MEM\$1INIT  | 하이브리드 힙에서 기본 힙 풀을 초기화하지 못했습니다. | 
| 0x1000000e  | STATUS\$1HEAP\$1VRAM\$1INIT\$1FAILED  | VRAM 동적 초기화에 실패했습니다. | 
| 0x1000000f  | STATUS\$1HEAP\$1LIBRARY\$1FREE\$1FAILED  | VRAM 라이브러리의 할당을 취소해 해당 라이브러리를 비우지 못했습니다. | 
| 0x10000010  | STATUS\$1HEAP\$1VRAM\$1ALLOC\$1FAILED  | VRAM 할당에 실패했습니다. | 
| 0x10000011  | STATUS\$1HEAP\$1VRAM\$1FREE\$1FAILED  | VRAM 비우기에 실패했습니다. | 
| 0x10000012  | STATUS\$1HEAP\$1VRAM\$1MAP\$1FAILED  | VRAM 매핑에 실패했습니다. | 
| 0x10000013  | STATUS\$1HEAP\$1VRAM\$1UNMAP\$1FAILED  | VRAM 매핑 해제에 실패했습니다. | 
| 0x10000014  | STATUS\$1HEAP\$1VRAM\$1UNINIT\$1FAILED  | VRAM 초기화 취소에 실패했습니다. | 
| 0x10000015 | STATUS\$1INVALID\$1ALLOCATION\$1SIZE |  | 
| 0x10000016 | STATUS\$1HEAP\$1REALLOC\$1ERROR |  | 
| 0x10000017 | STATUS\$1HEAP\$1FILE\$1HEAP\$1FILE\$1CORRUPT |  | 

### MKVGen 라이브러리에서 반환한 오류 및 상태 코드
<a name="producer-sdk-errors-mkvgen"></a>

다음 표에는 `MKVGen` 라이브러리의 메서드에서 반환되는 오류 및 상태 정보가 나와 있습니다.


****  

| 코드 | 메시지 | 설명/권장 작업 | 
| --- | --- | --- | 
| 0x32000001  | STATUS\$1MKV\$1INVALID\$1FRAME\$1DATA  | Frame 데이터 구조의 멤버가 잘못되었습니다. 기간, 크기 및 프레임 데이터가 유효하고에 지정된 제한 내에 있는지 확인합니다[생산자 SDK 할당량](limits.md#producer-sdk-limits). | 
| 0x32000002  | STATUS\$1MKV\$1INVALID\$1FRAME\$1TIMESTAMP  | 프레임 타임스탬프가 잘못되었습니다. 계산된 PTS(프레젠테이션 타임스탬프) 및 DTS(디코딩 타임스탬프)가 조각의 시작 프레임에 대한 타임스탬프보다 크거나 같습니다. 이는 미디어 파이프라인 다시 시작 가능성 또는 인코더 안정성 문제를 나타냅니다. 문제 해결 정보는 [오류: "Kinesis 비디오 클라이언트에 프레임을 제출하지 못 함"](troubleshooting.md#troubleshooting-producer-failed-frame-client)를 참조하십시오. | 
| 0x32000003  | STATUS\$1MKV\$1INVALID\$1CLUSTER\$1DURATION  | 잘못된 조각 기간이 지정되었습니다. 자세한 내용은 [생산자 SDK 할당량](limits.md#producer-sdk-limits) 단원을 참조하십시오. | 
| 0x32000004  | STATUS\$1MKV\$1INVALID\$1CONTENT\$1TYPE\$1LENGTH  | 잘못된 콘텐츠 유형 문자열 길이. 자세한 내용은 [생산자 SDK 할당량](limits.md#producer-sdk-limits) 단원을 참조하십시오. | 
| 0x32000005  | STATUS\$1MKV\$1NUMBER\$1TOO\$1BIG  | EBML(Extensible Binary Meta Language) 형식으로 표시하기에는 너무 큰 숫자를 인코딩하려고 했습니다. 이 숫자가 SDK 클라이언트에 노출되면 안 됩니다. | 
| 0x32000006  | STATUS\$1MKV\$1INVALID\$1CODEC\$1ID\$1LENGTH  | 코덱 ID 문자열 길이가 잘못되었습니다. 자세한 내용은 [생산자 SDK 할당량](limits.md#producer-sdk-limits) 단원을 참조하십시오. | 
| 0x32000007  | STATUS\$1MKV\$1INVALID\$1TRACK\$1NAME\$1LENGTH  | 추적 이름 문자열 길이가 잘못되었습니다. 자세한 내용은 [생산자 SDK 할당량](limits.md#producer-sdk-limits) 단원을 참조하십시오. | 
| 0x32000008  | STATUS\$1MKV\$1INVALID\$1CODEC\$1PRIVATE\$1LENGTH  | 코덱 프라이빗 데이터 길이가 잘못되었습니다. 자세한 내용은 [생산자 SDK 할당량](limits.md#producer-sdk-limits) 단원을 참조하십시오. | 
| 0x32000009  | STATUS\$1MKV\$1CODEC\$1PRIVATE\$1NULL  | 코덱 프라이빗 데이터(CPD)는 NULL인 반면 CPD 크기는 0보다 큽니다. | 
| 0x3200000a  | STATUS\$1MKV\$1INVALID\$1TIMECODE\$1SCALE  | 타임코드 스케일 값이 잘못되었습니다. 자세한 내용은 [생산자 SDK 할당량](limits.md#producer-sdk-limits) 단원을 참조하십시오. | 
| 0x3200000b  | STATUS\$1MKV\$1MAX\$1FRAME\$1TIMECODE  | 프레임 타임코드가 최댓값보다 큽니다. 자세한 내용은 [생산자 SDK 할당량](limits.md#producer-sdk-limits) 단원을 참조하십시오. | 
| 0x3200000c  | STATUS\$1MKV\$1LARGE\$1FRAME\$1TIMECODE  | 최대 프레임 타임코드에 도달했습니다. MKV 형식에서는 서명된 16비트를 사용하여 클러스터 시작에 대한 프레임의 상대 타임코드를 나타냅니다. 프레임 타임코드를 표시할 수 없는 경우 오류가 생성됩니다. 이 오류는 타임코드 스케일 선택이 잘못되었거나 클러스터 기간이 너무 길어 프레임 타임코드가 서명된 16비트 공간에서 넘침을 나타냅니다. | 
| 0x3200000d  | STATUS\$1MKV\$1INVALID\$1ANNEXB\$1NALU\$1IN\$1FRAME\$1DATA  | 잘못된 Annex-B 시작 코드가 발생했습니다. 예를 들어 Annex-B 적응 플래그가 지정되었으나 코드에서 0이 3개보다 많은 잘못된 시작 시퀀스가 발생했습니다. 잘못된 Annex-B 형식에는 바이트 스트림에서 0이 3개 이상인 시퀀스를 이스케이프하기 위한 "에뮬레이션 방지" 시퀀스가 있어야 합니다. 자세한 내용은 MPEG 사양을 참조하십시오. Android에서의 이 오류에 대한 자세한 내용은 [Android에서 STATUS\$1MKV\$1INVALID\$1ANNEXB\$1NALU\$1IN\$1FRAME\$1DATA(0x3200000d) 오류 발생](troubleshooting.md#troubleshooting-producer-android-invalid-annexb) 단원을 참조하십시오. | 
| 0x3200000e  | STATUS\$1MKV\$1INVALID\$1AVCC\$1NALU\$1IN\$1FRAME\$1DATA  | 조정 AVCC 플래그를 지정할 때 잘못된 AVCC NALU 패키징입니다. 바이트스트림이 유효한 AVCC 형식인지 확인합니다. 자세한 내용은 MPEG 사양을 참조하십시오. | 
| 0x3200000f  | STATUS\$1MKV\$1BOTH\$1ANNEXB\$1AND\$1AVCC\$1SPECIFIED  | AVCC 및 Annex-B NALUs 모두 지정되었습니다. 둘 중 하나만 지정하거나 아무 것도 지정하지 마십시오. | 
| 0x32000010  | STATUS\$1MKV\$1INVALID\$1ANNEXB\$1NALU\$1IN\$1CPD  | Annex-B 적응 플래그 지정 시 CPD의 Annex-B 형식이 잘못되었습니다. CPD가 유효한 Annex-B 형식인지 확인합니다. 그렇지 않은 경우 CPD Annex-B 적응 플래그를 제거합니다. | 
| 0x32000011  | STATUS\$1MKV\$1PTS\$1DTS\$1ARE\$1NOT\$1SAME  | Kinesis Video Streams는 PTS(프레젠테이션 타임스탬프)와 DTS(디코딩 타임스탬프)를 조각 시작 프레임에 대해 동일하게 적용합니다. 둘 다 조각을 시작하는 키 프레임입니다. | 
| 0x32000012  | STATUS\$1MKV\$1INVALID\$1H264\$1H265\$1CPD  | H264/H265 코덱 프라이빗 데이터를 구문 분석하지 못했습니다. | 
| 0x32000013  | STATUS\$1MKV\$1INVALID\$1H264\$1H265\$1SPS\$1WIDTH  | 코덱 프라이빗 데이터에서 너비를 추출하지 못했습니다. | 
| 0x32000014  | STATUS\$1MKV\$1INVALID\$1H264\$1H265\$1SPS\$1HEIGHT  | 코덱 프라이빗 데이터에서 높이를 추출하지 못했습니다. | 
| 0x32000015  | STATUS\$1MKV\$1INVALID\$1H264\$1H265\$1SPS\$1NALU  | 잘못된 H264/H265 SPS NALU입니다. | 
| 0x32000016  | STATUS\$1MKV\$1INVALID\$1BIH\$1CPD  | 코덱 프라이빗 데이터의 비트맵 정도 헤더 형식이 잘못되었습니다. | 
| 0x32000017  | STATUS\$1MKV\$1INVALID\$1HEVC\$1NALU\$1COUNT  | 잘못된 HEVC(High Efficiency Video Coding) NALU(Network Abstraction Layer Units) 수입니다. | 
| 0x32000018  | STATUS\$1MKV\$1INVALID\$1HEVC\$1FORMAT  | 잘못된 HEVC 형식입니다. | 
| 0x32000019  | STATUS\$1MKV\$1HEVC\$1SPS\$1NALU\$1MISSING  | SPS(Sequence Parameter Set)에 HEVC NALU가 누락되었습니다. | 
| 0x3200001a  | STATUS\$1MKV\$1INVALID\$1HEVC\$1SPS\$1NALU\$1SIZE   | 잘못된 HEVC SPS NALU 크기입니다. | 
| 0x3200001b  | STATUS\$1MKV\$1INVALID\$1HEVC\$1SPS\$1CHROMA\$1FORMAT\$1IDC   | 잘못된 채도 형식 IDC입니다. | 
| 0x3200001c  | STATUS\$1MKV\$1INVALID\$1HEVC\$1SPS\$1RESERVED   | 잘못된 HEVC 예약 SPS입니다. | 
| 0x3200001d  | STATUS\$1MKV\$1MIN\$1ANNEX\$1B\$1CPD\$1SIZE   | 최소 AnnexBb 코덱 프라이빗 베타 값 크기입니다. H264의 경우, 이 값이 11보다 크거나 같아야 합니다. H265의 경우, 이 값이 15보다 크거나 같아야 합니다. | 
| 0x3200001e  | STATUS\$1MKV\$1ANNEXB\$1CPD\$1MISSING\$1NALUS  | Annex-B NALU의 코덱 프라이빗 데이터가 누락되었습니다. | 
| 0x3200001f  | STATUS\$1MKV\$1INVALID\$1ANNEXB\$1CPD\$1NALUS  | Annex-B NALU의 코덱 프라이빗 베타가 잘못되었습니다. | 
| 0x32000020  | STATUS\$1MKV\$1INVALID\$1TAG\$1NAME\$1LENGTH   | 잘못된 태그 이름 길이. 유효한 값의 범위는 0보다 크고 128보다 작아야 합니다. | 
| 0x32000021  | STATUS\$1MKV\$1INVALID\$1TAG\$1VALUE\$1LENGTH   | 잘못된 태그 값 길이. 유효한 값은 0보다 크고 256보다 작습니다. | 
| 0x32000022  | STATUS\$1MKV\$1INVALID\$1GENERATOR\$1STATE\$1TAGS   | 잘못된 생성기 상태 태그입니다. | 
| 0x32000023  | STATUS\$1MKV\$1INVALID\$1AAC\$1CPD\$1SAMPLING\$1FREQUENCY\$1INDEX   | 빈도 인덱스를 샘플링하는 AAC 코덱 프라이빗 데이터가 잘못되었습니다. | 
| 0x32000024  | STATUS\$1MKV\$1INVALID\$1AAC\$1CPD\$1CHANNEL\$1CONFIG   | AAC 코덱 프라이빗 데이터 채널 구성이 잘못되었습니다. | 
| 0x32000025  | STATUS\$1MKV\$1INVALID\$1AAC\$1CPD   | 잘못된 AAC 코덱 프라이빗 데이터입니다. | 
| 0x32000026  | STATUS\$1MKV\$1TRACK\$1INFO\$1NOT\$1FOUND   | 트랙 정보를 찾을 수 없습니다. | 
| 0x32000027  | STATUS\$1MKV\$1INVALID\$1SEGMENT\$1UUID   | 잘못된 세그먼트 UUID입니다. | 
| 0x32000028  | STATUS\$1MKV\$1INVALID\$1TRACK\$1UID   | 잘못된 트랙 UID입니다. | 
| 0x32000029 | STATUS\$1MKV\$1INVALID\$1CLIENT\$1ID\$1LENGTH |  | 
| 0x3200002a | STATUS\$1MKV\$1INVALID\$1AMS\$1ACM\$1CPD |  | 
| 0x3200002b | STATUS\$1MKV\$1MISSING\$1SPS\$1FROM\$1H264\$1CPD |  | 
| 0x3200002c | STATUS\$1MKV\$1MISSING\$1PPS\$1FROM\$1H264\$1CPD |  | 
| 0x3200002d | STATUS\$1MKV\$1INVALID\$1PARENT\$1TYPE |  | 

### 추적 라이브러리에서 반환한 오류 및 상태 코드
<a name="producer-sdk-errors-trace"></a>

다음 표에는 `Trace` 라이브러리의 메서드에서 반환되는 오류 및 상태 정보가 나와 있습니다.


****  

| 코드 | 메시지 | 
| --- | --- | 
| 0x10100001 | STATUS\$1MIN\$1PROFILER\$1BUFFER  | 

### Utils 라이브러리에서 반환한 오류 및 상태 코드
<a name="producer-sdk-errors-utils"></a>

다음 표에는 `Utils` 라이브러리의 메서드에서 반환되는 오류 및 상태 정보가 나와 있습니다.


****  

| 코드 | 메시지 | 
| --- | --- | 
| 0x40000001 | STATUS\$1INVALID\$1BASE64\$1ENCODE  | 
| 0x40000002 | STATUS\$1INVALID\$1BASE  | 
| 0x40000003 | STATUS\$1INVALID\$1DIGIT  | 
| 0x40000004 | STATUS\$1INT\$1OVERFLOW  | 
| 0x40000005 | STATUS\$1EMPTY\$1STRING  | 
| 0x40000006 | STATUS\$1DIRECTORY\$1OPEN\$1FAILED  | 
| 0x40000007 | STATUS\$1PATH\$1TOO\$1LONG  | 
| 0x40000008 | STATUS\$1UNKNOWN\$1DIR\$1ENTRY\$1TYPE  | 
| 0x40000009 | STATUS\$1REMOVE\$1DIRECTORY\$1FAILED  | 
| 0x4000000a | STATUS\$1REMOVE\$1FILE\$1FAILED  | 
| 0x4000000b | STATUS\$1REMOVE\$1LINK\$1FAILED  | 
| 0x4000000c | STATUS\$1DIRECTORY\$1ACCESS\$1DENIED  | 
| 0x4000000d | STATUS\$1DIRECTORY\$1MISSING\$1PATH  | 
| 0x4000000e | STATUS\$1DIRECTORY\$1ENTRY\$1STAT\$1ERROR  | 
| 0x4000000f | STATUS\$1STRFTIME\$1FALIED | 
| 0x40000010 | STATUS\$1MAX\$1TIMESTAMP\$1FORMAT\$1STR\$1LEN\$1EXCEEDED | 
| 0x40000011 | STATUS\$1UTIL\$1MAX\$1TAG\$1COUNT | 
| 0x40000012 | STATUS\$1UTIL\$1INVALID\$1TAG\$1VERSION | 
| 0x40000013 | STATUS\$1UTIL\$1TAGS\$1COUNT\$1NON\$1ZERO\$1TAGS\$1NULL | 
| 0x40000014 | STATUS\$1UTIL\$1INVALID\$1TAG\$1NAME\$1LEN | 
| 0x40000015 | STATUS\$1UTIL\$1INVALID\$1TAG\$1VALUE\$1LEN | 
| 0x4000002a | STATUS\$1EXPONENTIAL\$1BACKOFF\$1INVALID\$1STATE | 
| 0x4000002b | STATUS\$1EXPONENTIAL\$1BACKOFF\$1RETRIES\$1EXHAUSTED | 
| 0x4000002c | STATUS\$1THREADPOOL\$1MAX\$1COUNT | 
| 0x4000002d | STATUS\$1THREADPOOL\$1INTERNAL\$1ERROR | 
| 0x40100001 | STATUS\$1HASH\$1KEY\$1NOT\$1PRESENT | 
| 0x40100002 | STATUS\$1HASH\$1KEY\$1ALREADY\$1PRESENT | 
| 0x40100003 | STATUS\$1HASH\$1ENTRY\$1ITERATION\$1ABORT | 
| 0x41000001 | STATUS\$1BIT\$1READER\$1OUT\$1OF\$1RANGE | 
| 0x41000002 | STATUS\$1BIT\$1READER\$1INVALID\$1SIZE | 
| 0x41100001 | STATUS\$1TIMER\$1QUEUE\$1STOP\$1SCHEDULING | 
| 0x41100002 | STATUS\$1INVALID\$1TIMER\$1COUNT\$1VALUE | 
| 0x41100003 | STATUS\$1INVALID\$1TIMER\$1PERIOD\$1VALUE | 
| 0x41100004 | STATUS\$1MAX\$1TIMER\$1COUNT\$1REACHED | 
| 0x41100005 | STATUS\$1TIMER\$1QUEUE\$1SHUTDOWN | 
| 0x41200001 | STATUS\$1SEMAPHORE\$1OPERATION\$1AFTER\$1SHUTDOWN | 
| 0x41200002 | STATUS\$1SEMAPHORE\$1ACQUIRE\$1WHEN\$1LOCKED | 
| 0x41300001 | STATUS\$1FILE\$1LOGGER\$1INDEX\$1FILE\$1INVALID\$1SIZE | 

### 보기 라이브러리에서 반환된 오류 및 상태 코드
<a name="producer-sdk-errors-view"></a>

다음 표에는 `View` 라이브러리의 메서드에서 반환되는 오류 및 상태 정보가 나와 있습니다.


****  

| 코드 | 메시지 | 설명 | 
| --- | --- | --- | 
| 0x30000001  | STATUS\$1MIN\$1CONTENT\$1VIEW\$1ITEMS  | 잘못된 콘텐츠 보기 항목 수가 지정되었습니다. 자세한 내용은 [생산자 SDK 할당량](limits.md#producer-sdk-limits) 단원을 참조하십시오. | 
| 0x30000002  | STATUS\$1INVALID\$1CONTENT\$1VIEW\$1DURATION  | 잘못된 콘텐츠 보기 지속 시간이 지정되었습니다. 자세한 내용은 [생산자 SDK 할당량](limits.md#producer-sdk-limits) 단원을 참조하십시오. | 
| 0x30000003  | STATUS\$1CONTENT\$1VIEW\$1NO\$1MORE\$1ITEMS  | 헤더 위치를 지나치려는 시도가 있었습니다. | 
| 0x30000004  | STATUS\$1CONTENT\$1VIEW\$1INVALID\$1INDEX  | 잘못된 인덱스가 지정되어 있습니다. | 
| 0x30000005  | STATUS\$1CONTENT\$1VIEW\$1INVALID\$1TIMESTAMP  | 타임스탬프 또는 타임스탬프 중첩이 잘못되었습니다. 프레임 디코딩 타임스탬프는 이전 프레임 타임스탬프에 이전 프레임 기간을 더한 값보다 크거나 같아야 합니다`DTS(n) >= DTS(n-1) \$1 Duration(n-1)`. 일반적으로 이 오류는 "불안정한" 인코더를 나타냅니다. 인코더는 인코딩된 프레임의 버스트를 생성하는데 이러한 프레임의 타임스탬프는 인트라 프레임 지속 시간보다 작아야 합니다. 또는 스트림이 SDK 타임스탬프를 사용하도록 구성되어 있고 프레임이 프레임 기간보다 빠르게 전송됩니다. StreamInfo.StreamCaps 구조에서 프레임 기간을 더 짧게 지정하면 인코더의 일부 "지터"와 관련해 도움이 됩니다. 예를 들어 스트림이 25FPS인 경우 각 프레임의 지속 시간은 40ms입니다. 그러나 인코더 "지터"를 처리하려면 해당 프레임 기간의 절반(20ms)을 사용하는 것이 좋습니다. 일부 스트림의 경우 오류를 감지하기 위해 보다 정확하게 타이밍을 제어해야 합니다. | 
| 0x30000006  | STATUS\$1INVALID\$1CONTENT\$1VIEW\$1LENGTH  | 잘못된 콘텐츠 보기 항목 데이터 길이가 지정되었습니다. | 

## PutFrame 콜백에서 반환한 오류 및 상태 코드 - C 생산자 라이브러리
<a name="producer-sdk-errors-putframe-c"></a>

다음 섹션에는 C 생산자 라이브러리 내의 `PutFrame` 작업에 대한 콜백에서 반환되는 오류 및 상태 정보가 포함되어 있습니다.


****  

| 코드 | 메시지 | 설명 | 권장 조치 | 
| --- | --- | --- | --- | 
| 0x15000001 | STATUS\$1STOP\$1CALLBACK\$1CHAIN | 콜백 체인이 중지되었습니다. |  | 
| 0x15000002 | STATUS\$1MAX\$1CALLBACK\$1CHAIN | 최대 콜백 체인에 도달했습니다. |  | 
| 0x15000003 | STATUS\$1INVALID\$1PLATFORM\$1CALLBACKS\$1VERSION | 잘못된 PlatformCallbacks 구조 버전. | 구조의 올바른 현재 버전을 지정합니다. | 
| 0x15000004 | STATUS\$1INVALID\$1PRODUCER\$1CALLBACKS\$1VERSION | 잘못된 ProducerCallbacks 구조 버전. | 구조의 올바른 현재 버전을 지정합니다. | 
| 0x15000005 | STATUS\$1INVALID\$1STREAM\$1CALLBACKS\$1VERSION | 잘못된 StreamCallbacks 구조 버전. | 구조의 올바른 현재 버전을 지정합니다. | 
| 0x15000006 | STATUS\$1INVALID\$1AUTH\$1CALLBACKS\$1VERSION | 잘못된 AuthCallbacks 구조 버전. | 구조의 올바른 현재 버전을 지정합니다. | 
| 0x15000007 | STATUS\$1INVALID\$1API\$1CALLBACKS\$1VERSION | 잘못된 ApiCallbacks 구조 버전. | 구조의 올바른 현재 버전을 지정합니다. | 
| 0x15000008 | STATUS\$1INVALID\$1AWS\$1CREDENTIALS\$1VERSION | 잘못된 AwsCredentials 구조 버전. | 구조의 올바른 현재 버전을 지정합니다. | 
| 0x15000009 | STATUS\$1MAX\$1REQUEST\$1HEADER\$1COUNT | 최대 요청 헤더 수에 도달했습니다. |  | 
| 0x1500000a | STATUS\$1MAX\$1REQUEST\$1HEADER\$1NAME\$1LEN | 최대 요청 헤더 이름 길이에 도달했습니다. |  | 
| 0x1500000b | STATUS\$1MAX\$1REQUEST\$1HEADER\$1VALUE\$1LEN | 최대 요청 헤더 값 길이에 도달했습니다. |  | 
| 0x1500000c | STATUS\$1INVALID\$1API\$1CALL\$1RETURN\$1JSON | API 호출에 대한 잘못된 반환 JSON입니다. |  | 
| 0x1500000d | STATUS\$1CURL\$1INIT\$1FAILED | Curl 초기화에 실패했습니다. |  | 
| 0x1500000e | STATUS\$1CURL\$1LIBRARY\$1INIT\$1FAILED | Curl lib 초기화에 실패했습니다. |  | 
| 0x1500000f | STATUS\$1INVALID\$1DESCRIBE\$1STREAM\$1RETURN\$1JSON | DescribeStream에 대한 잘못된 반환 JSON입니다. |  | 
| 0x15000010 | STATUS\$1HMAC\$1GENERATION\$1ERROR | HMAC 생성 오류입니다. |  | 
| 0x15000011 | STATUS\$1IOT\$1FAILED | IoT 권한 부여에 실패했습니다. |  | 
| 0x15000012 | STATUS\$1MAX\$1ROLE\$1ALIAS\$1LEN\$1EXCEEDED | 최대 역할 별칭 길이에 도달했습니다. | 더 짧은 별칭 길이를 지정하십시오. | 
| 0x15000013 | STATUS\$1MAX\$1USER\$1AGENT\$1NAME\$1POSTFIX\$1LEN\$1EXCEEDED | 최대 에이전트 이름 접미사 길이에 도달했습니다. |  | 
| 0x15000014 | STATUS\$1MAX\$1CUSTOM\$1USER\$1AGENT\$1LEN\$1EXCEEDED | 최대 고객 사용자 에이전트 길이에 도달했습니다. |  | 
| 0x15000015 | STATUS\$1INVALID\$1USER\$1AGENT\$1LENGTH | 잘못된 사용자 에이전트 길이입니다. |  | 
| 0x15000016 | STATUS\$1INVALID\$1ENDPOINT\$1CACHING\$1PERIOD | 잘못된 엔드포인트 캐싱 기간입니다. | 24시간 미만의 캐싱 기간을 지정하십시오. | 
| 0x15000017 | STATUS\$1IOT\$1EXPIRATION\$1OCCURS\$1IN\$1PAST | IoT 만료 타임스탬프는 과거에 발생합니다. |  | 
| 0x15000018 | STATUS\$1IOT\$1EXPIRATION\$1PARSING\$1FAILED | IoT 만료 구문 분석이 실패했습니다. |  | 
| 0x15000019 | STATUS\$1DUPLICATE\$1PRODUCER\$1CALLBACK\$1FREE\$1FUNC |  |  | 
| 0x1500001a | STATUS\$1DUPLICATE\$1STREAM\$1CALLBACK\$1FREE\$1FUNC |  |  | 
| 0x1500001b | STATUS\$1DUPLICATE\$1AUTH\$1CALLBACK\$1FREE\$1FUNC |  |  | 
| 0x1500001c | STATUS\$1DUPLICATE\$1API\$1CALLBACK\$1FREE\$1FUNC |  |  | 
| 0x1500001d | STATUS\$1FILE\$1LOGGER\$1INDEX\$1FILE\$1TOO\$1LARGE |  |  | 
| 0x1500001e | STATUS\$1MAX\$1IOT\$1THING\$1NAME\$1LENGTH |  |  | 
| 0x1500001f | STATUS\$1IOT\$1CREATE\$1LWS\$1CONTEXT\$1FAILED |  |  | 
| 0x15000020 | STATUS\$1INVALID\$1CA\$1CERT\$1PATH |  |  | 
| 0x15000022 | STATUS\$1FILE\$1CREDENTIAL\$1PROVIDER\$1OPEN\$1FILE\$1FAILED |  |  | 
| 0x15000023 | STATUS\$1FILE\$1CREDENTIAL\$1PROVIDER\$1INVALID\$1FILE\$1LENGTH |  |  | 
| 0x15000024 | STATUS\$1FILE\$1CREDENTIAL\$1PROVIDER\$1INVALID\$1FILE\$1FORMAT |  |  | 
| 0x15000026 | STATUS\$1STREAM\$1BEING\$1SHUTDOWN |  |  | 
| 0x15000027 | STATUS\$1CLIENT\$1BEING\$1SHUTDOWN |  |  | 
| 0x15000028 | STATUS\$1CONTINUOUS\$1RETRY\$1RESET\$1FAILED |  |  | 
| 0x16000001 | STATUS\$1CURL\$1PERFORM\$1FAILED |  CURL이 성공하지 못한 코드를 반환했습니다.  |  로그에서 추가 정보를 검토합니다. 일반적인 CURL 오류는 "호스트 이름을 확인할 수 없습니다."입니다. 디바이스의 인터넷 연결을 확인합니다. 또 다른 일반적인 오류는 403 오류 코드입니다. 이는 IoT 인증서가 올바르게 생성되거나 지정되지 않았음을 나타냅니다. IoT 인증서의 파일 경로와 권한이 올바르게 설정되었는지 확인합니다. 자세한 정보는 [를 사용하여 Kinesis Video Streams 리소스에 대한 액세스 제어 AWS IoT](how-iot.md)을 참조하세요.  | 
| 0x16000002 | STATUS\$1IOT\$1INVALID\$1RESPONSE\$1LENGTH |  IoT 자격 증명을 가져올 때 0 길이의 응답을 수신했습니다.  |   AWS 상태 대시보드를 검토하고 나중에 다시 시도하세요.  | 
| 0x16000003 | STATUS\$1IOT\$1NULL\$1AWS\$1CREDS |  IoT 자격 증명 엔드포인트에서 반환된 JSON에 자격 증명 객체가 포함되어 있지 않습니다.  |  자세한 내용은 JSON의 "메시지" 항목을 검토하세요.  | 
| 0x16000004 | STATUS\$1IOT\$1INVALID\$1URI\$1LEN |  가져오기 IoT 자격 증명 함수에 전달되는 URL의 길이는 1\$110,000이 아닙니다.  |  이 함수에 전달된 URL을 검토합니다.  | 
| 0x16000005 | STATUS\$1TIMESTAMP\$1STRING\$1UNRECOGNIZED\$1FORMAT |  IoT 자격 증명을 가져오는 JSON의 "만료" 항목이 형식이 아닙니다`YYYY-MM-DDTHH:mm:SSZ`.  |   AWS 상태 대시보드를 검토하고 나중에 다시 시도하세요.  | 

# NAL(Network Abstraction Layer) 적응 플래그 참조
<a name="producer-reference-nal"></a>

이 단원에는 `StreamInfo.NalAdaptationFlags` 열거에 사용할 수 있는 플래그에 대한 정보가 포함되어 있습니다.

애플리케이션의 [기본 스트림](https://en.wikipedia.org/wiki/Elementary_stream)은 **Annex-B** 또는 **AVCC** 형식일 수 있습니다.
+ **Annex-B** 형식은 [NALUs(네트워크 추상화 계층 단위)](https://en.wikipedia.org/wiki/Network_Abstraction_Layer#NAL_units)를 0의 2바이트, 0의 1\$13바이트, 숫자 *1*(예****: 00000001)로 구분합니다.
+ **AVCC** 형식도 NALU를 줄 바꿈하지만 각각의 NALU 앞에 NALU의 크기를 나타내는 값이 옵니다(일반적으로 4바이트).

많은 인코더가 Annex-B 비트스트림 형식을 생성합니다. 일부 상위 수준 비트스트림 프로세서(예: 재생 엔진 또는의 [Media Source Extensions(MSE)](https://en.wikipedia.org/wiki/Media_Source_Extensions) 플레이어 AWS Management Console)는 프레임에 AVCC 형식을 사용합니다.

H.264용 SPS/PPS(Sequence Parameter Set/Picture Parameter Set)인 CPD(Codec Private Data)도 Annex-B 또는 AVCC 형식일 수 있습니다. 하지만 CPD의 경우, 앞서 설명한 것과 형식이 다릅니다.

플래그는 다음과 같이 NALU를 프레임 데이터와 CPD를 위한 AVCC 또는 Annex-B에 적응시키라고 SDK에게 지시합니다.


****  

| 플래그 | 적응 | 
| --- | --- | 
| NAL\$1ADAPTATION\$1FLAG\$1NONE | 적응 없음. | 
| NAL\$1ADAPTATION\$1ANNEXB\$1NALS | Annex-B NALUs AVCC NALUs에 맞게 조정합니다. | 
| NAL\$1ADAPTATION\$1AVCC\$1NALS | AVCC NALUs Annex-B NALUs에 맞게 조정합니다. | 
| NAL\$1ADAPTATION\$1ANNEXB\$1CPD\$1NALS | 코덱 프라이빗 데이터에 대한 Annex-B NALUs를 AVCC 형식 NALUs로 조정합니다. | 
| NAL\$1ADAPTATION\$1ANNEXB\$1CPD\$1AND\$1FRAME\$1NALS | 코덱에 대한 Annex-B NALUs를 조정하고 프라이빗 데이터를 AVCC 형식 NALUs. | 

NALU 유형에 대한 자세한 내용은 [RFC](https://www.ietf.org/rfc/rfc3984.txt) **3984의 섹션 1.3: 네트워크 추상화 계층 단위 유형을 참조하세요**.

# 생산자 SDK 구조
<a name="producer-reference-structures-producer"></a>

이 섹션에는 Kinesis Video Streams 생산자 객체에 데이터를 제공하는 데 사용할 수 있는 구조에 대한 정보가 포함되어 있습니다.

**Topics**
+ [DeviceInfo/ DefaultDeviceInfoProvider](#producer-reference-structures-producer-deviceinfo)
+ [StorageInfo](#producer-reference-structures-producer-storageinfo)

## DeviceInfo/ DefaultDeviceInfoProvider
<a name="producer-reference-structures-producer-deviceinfo"></a>

**DeviceInfo** 및 **DefaultDeviceInfoProvider** 객체는 Kinesis Video Streams Producer 객체의 동작을 제어합니다.

### 멤버 필드
<a name="producer-reference-structures-producer-deviceinfo-fields"></a>
+ **version** - 올바른 버전의 구조가 코드 베이스의 현재 버전과 함께 사용되는지 확인하는 데 사용되는 정수 값입니다. 현재 버전은 `DEVICE_INFO_CURRENT_VERSION` 매크로를 사용하여 지정됩니다.
+ **name** - 사람이 읽을 수 있는 디바이스의 이름입니다.
+ **tagCount/tags** – 현재 사용되지 않습니다.
+ **streamCount** - 디바이스가 처리할 수 있는 최대 스트림 수입니다. 이 값은 초기에 포인터를 위한 스토리지를 스트림 객체에 미리 할당하지만 실제 스트림 객체는 나중에 생성됩니다. 기본값은 16스트림이지만 `DefaultDeviceInfoProvider.cpp` 파일에서 이 수를 변경할 수 있습니다.
+ **storageInfo**: 기본 스토리지 구성을 설명하는 객체입니다. 자세한 내용은 [StorageInfo](#producer-reference-structures-producer-storageinfo) 단원을 참조하십시오.

## StorageInfo
<a name="producer-reference-structures-producer-storageinfo"></a>

Kinesis Video Streams의 기본 스토리지 구성을 지정합니다.

기본 구현은 스트리밍에 최적화된 빠른 힙의 낮은 조각화를 기반으로 합니다. 주어진 플랫폼에 중복 기재가 가능한 `MEMALLOC` 할당자를 사용합니다. 어떤 플랫폼은 피지컬 페이지로 할당을 지원하지 않아도 가상 메모리가 할당됩니다. 메모리가 사용될 때 가상 페이지는 피지컬 페이지로 지원됩니다. 결과적으로 스토리지가 충분히 사용되지 않을 때에도 전체 시스템에 메모리 부족 압력이 발생합니다.

다음 수식을 기반으로 기본 스토리지 크기를 계산합니다. `DefragmentationFactor`를 1.2(20퍼센트)로 설정해야 합니다.

```
Size = NumberOfStreams * AverageFrameSize * FramesPerSecond * BufferDurationInSeconds * DefragmentationFactor
```

다음 예제에서는 디바이스에 오디오 및 비디오 스트림이 있습니다. 오디오 스트림의 초당 샘플 수는 512이며 샘플은 평균 100바이트입니다. 비디오 스트림의 초당 프레임 수는 25이며 평균 10,000바이트입니다. 각 스트림의 버퍼 지속 시간은 3분입니다.

```
Size = (512 * 100 * (3 * 60) + 25 * 10000 * (3 * 60)) * 1.2 = (9216000 + 45000000) * 1.2 = 65059200 = ~ 66MB.
```

디바이스에 사용 가능한 메모리가 더 있는 경우 심각한 조각화를 방지하기 위해 스토리지에 메모리를 더 추가하는 것이 좋습니다.

높은 인코딩 복잡성(높은 모션으로 인해 프레임 크기가 더 큰 경우) 또는 대역폭이 낮은 경우 스토리지 크기가 모든 스트림의 전체 버퍼를 수용하기에 적합한지 확인합니다. 생산자가 메모리 압력에 도달하면 스토리지 오버플로 압력 콜백()을 내보냅니다`StorageOverflowPressureFunc`. 그러나 콘텐츠 스토어에서 메모리를 사용할 수 없는 경우 오류()와 함께 Kinesis Video Streams로 푸시되는 프레임을 삭제합니다`STATUS_STORE_OUT_OF_MEMORY = 0x5200002e`. 자세한 내용은 [클라이언트 라이브러리에서 반환한 오류 및 상태 코드](producer-sdk-errors.md#producer-sdk-errors-client) 단원을 참조하십시오. 애플리케이션 승인(ACK)을 사용할 수 없거나 지속적인 ACK가 표시되는 경우에도 이 결과가 발생할 수 있습니다. 이 경우 버퍼는 이전 프레임이 삭제되기 전에 "버퍼 기간" 용량으로 채워집니다.

### 멤버 필드
<a name="producer-reference-structures-producer-storageinfo-fields"></a>
+ **version** - 올바른 버전의 구조가 코드 베이스의 현재 버전과 함께 사용되는지 확인하는 데 사용되는 정수 값입니다.
+ **storageType** - 스토리지의 기본 백업 및 구현을 지정하는 `DEVICE_STORAGE_TYPE` 열거입니다. 현재 지원되는 값은 `DEVICE_STORAGE_TYPE_IN_MEM`입니다. 향후 구현에서는 `DEVICE_STORAGE_TYPE_HYBRID_FILE`이 지원되어, 스토리지가 파일 지원 콘텐츠 저장소로 다시 돌아갈 예정입니다.
+ **storageSize** - 사전 할당할 스토리지 크기입니다. 최소 할당은 10MB이고, 최대 할당은 10GB입니다. (이 값은 파일 지원 콘텐츠 스토어의 향후 구현에서 변경됩니다.)
+ **spillRatio** - 보조 오버플로 스토리지(파일 스토리지)와 달리 직접 메모리 스토리지 유형(RAM)에서 할당할 스토리지의 백분율을 나타내는 정수 값입니다. 현재 사용 중이지 않습니다.
+ **rootDirectory**: 파일 지원 콘텐츠 저장소가 있는 디렉터리의 경로입니다. 현재 사용 중이지 않습니다.

# Kinesis 비디오 스트림 구조
<a name="producer-reference-structures-stream"></a>

다음 구조를 사용하여 Kinesis 비디오 스트림의 인스턴스에 데이터를 제공할 수 있습니다.

**Topics**
+ [StreamDefinition/StreamInfo](#producer-reference-structures-stream-streaminfo)
+ [ClientMetrics](#producer-reference-structures-stream-clientmetrics)
+ [StreamMetrics](#producer-reference-structures-stream-streammetrics)

## StreamDefinition/StreamInfo
<a name="producer-reference-structures-stream-streaminfo"></a>

C\$1\$1 계층의 `StreamDefinition` 객체는 PIC(Platform Independent Code)의 `StreamInfo` 객체를 래핑하고 생성자의 몇 가지 기본값을 제공합니다.

### 멤버 필드
<a name="producer-reference-structures-stream-streaminfo-fields"></a>


****  

| 필드 | 데이터 유형 | 설명 | 기본값  | 
| --- | --- | --- | --- | 
| stream\$1name | string | 선택적 스트림 이름. 스트림 이름 길이에 대한 자세한 내용은 [생산자 SDK 할당량](limits.md#producer-sdk-limits) 단원을 참조하십시오. 각 스트림은 고유한 이름을 지녀야 합니다. | 이름을 지정하지 않으면 임의로 이름이 생성됩니다. | 
| retention\$1period | duration<uint64\$1t, ratio<3600>> | 스트림 보존 기간(초)입니다. 0을 지정하면 보관하지 않음을 나타냅니다. | 3600(1시간) | 
| tags | const map<string, string>\$1  | 사용자 정보가 포함된 키/값 페어의 맵입니다. 스트림에 태그 세트가 이미 있는 경우 새 태그는 기존 태그 세트에 추가됩니다. | 태그 없음 | 
| kms\$1key\$1id | string | 스트림을 암호화하는 데 사용할 AWS KMS 키 ID입니다. 자세한 내용은 [Kinesis Video Streams의 데이터 보호](how-kms.md) 단원을 참조하십시오. | 기본 KMS 키(aws/kinesisvideo)입니다. | 
| streaming\$1type | STREAMING\$1TYPE 열거 | 지원되는 유일한 값은 STREAMING\$1TYPE\$1REALTIME입니다. |  | 
| content\$1type | string | 스트림의 콘텐츠 형식. Kinesis Video Streams 콘솔은 video/h264 형식으로 콘텐츠를 재생할 수 있습니다. | video/h264 | 
| max\$1latency | duration<uint64\$1t, milli> | 천분의 1초 단위의 스트림 최대 지연 시간. 버퍼 지속 시간이 이 시간을 초과하면 스트림 지연 시간 압력 콜백(지정된 경우)이 호출됩니다. 0을 지정하면 스트림 지연 시간 압력 콜백이 회신되지 않습니다. | milliseconds::zero() | 
| fragment\$1duration | duration<uint64\$1t>  | 원하는 조각 지속 시간(초)입니다. 이 값은 key\$1frame\$1fragmentation 값과 함께 사용됩니다. 이 값이 이면 falseKinesis Video Streams는이 기간이 경과한 후 키 프레임에 조각을 생성합니다. 예를 들어, AAC(Advanced Audio Coding) 오디오 스트림의 각 프레임은 키 프레임입니다. key\$1frame\$1fragmentation = false를 지정하면 이 시간이 만료된 후 키 프레임에서 조각화가 수행되어 2초 조각이 생성됩니다. | 2 | 
| timecode\$1scale | duration<uint64\$1t, milli>  | MKV 클러스터 내 프레임에 대한 타임코드 세부 수준을 지정하는 MKV 타임코드 척도(밀리초)입니다. MKV 프레임 타임코드는 언제나 클러스터의 시작과 연관됩니다. MKV는 서명된 16비트 값(0-32767)을 사용하여 클러스터(조각) 내 타임코드를 표시합니다. 프레임 타임코드를 지정된 타임코드 스케일로 표시할 수 있는지 확인합니다. 기본 타임코드 척도 값인 1ms를 지정할 경우 표시할 수 있는 최대 프레임은 32767ms \$1= 32초입니다. 이 값은 [Amazon Kinesis Video Streams 서비스 할당량](limits.md)에 지정된 최대 조각 지속 시간인 10초를 초과합니다. | 1 | 
| key\$1frame\$1fragmentation | bool | 키 프레임에서 조각을 생성할지 여부입니다. true이면 SDK는 키 프레임이 있을 때마다 조각의 시작을 생성합니다. false인 경우 Kinesis Video Streams는 최소한를 기다리고 그 뒤에 오는 키 프레임에 새 조각을 fragment\$1duration 생성합니다. | true | 
| frame\$1timecodes | bool | 현재 시간 콜백을 사용하여 프레임 타임코드를 사용할지 타임스탬프를 생성할지 여부. 대부분의 인코더는 프레임과 함께 타임스탬프를 생성하지 않습니다. 따라서이 파라미터에 false를 지정하면 프레임이 Kinesis Video Streams에 들어갈 때 타임스탬프가 지정됩니다. | true | 
| absolute\$1fragment\$1times | bool | Kinesis Video Streams는 MKV를 기본 패키징 메커니즘으로 사용합니다. MKV 사양에서는 엄격히 프레임 타임코드가 클러스터(조각)의 시작에 상대적입니다. 하지만 클러스터 타임코드는 스트림 시작 시간에 절대적이거나 상대적일 수 있습니다. 타임스탬프가 상대적이면 PutMedia 서비스 API 호출은 선택적 스트림 시작 타임스탬프를 사용하고 클러스터 타임스탬프를 조정합니다. 서비스는 항상 조각을 조각의 절대적 타임스탬프와 함께 저장합니다. | true | 
| fragment\$1acks | bool | 애플리케이션 수준 조각 ACKs(인정)를 수신할지 여부입니다. | true는 SDK가 ACK를 수신하고 이에 따라 실행된다는 의미입니다. | 
| restart\$1on\$1error | bool | 특정 오류에 따라 재시작할지 여부. | true를 지정하면 SDK는 오류가 발생할 경우 스트리밍을 다시 시작하려고 합니다. | 
| recalculate\$1metrics | bool | 지표를 다시 계산할지 여부입니다. 각 호출에 따라 지표를 검색하고 최신 "실행"값을 다시 계산하여 CPU에 영향을 적게 줍니다. 매우 낮은 전력/풋프린트 디바이스에서는 CPU 주기를 절약하기 위해 이 값을 false로 설정해야 할 수 있습니다. 그렇지 않으면이 값에 false를 사용하지 않는 것이 좋습니다. | true | 
| nal\$1adaptation\$1flags | uint32\$1t  |  NALU(Network Abstraction Layer Unit) 적응 플래그를 지정합니다. 비트스트림이 H.264로 암호화되면 NALU에서 원시 또는 패키징된 상태로 처리될 수 있습니다. 이러한 비트스트림은 Annex-B 또는 AVCC 형식일 수 있습니다. 대부분의 기본 스트림 생산자 및 소비자(읽기 인코더 및 디코더)는 오류 복구와 같은 이점이 있으므로 Annex-B 형식을 사용합니다. 더 높은 수준의 시스템은 MPEG, HLS, DASH 등의 기본 형식인 AVCC 형식을 사용합니다. 콘솔 재생은 브라우저의 MSE(미디어 소스 확장)를 사용하여 AVCC 형식을 사용하는 스트림을 디코딩하고 재생합니다. H.264의 경우(그리고 M-JPEG 및 H.265의 경우) SDK는 적응 기능을 제공합니다. 대부분의 초기 스트림은 다음 형식입니다. 이 예제에서 `Ab`는 Annex-B 시작 코드(001 또는 0001)입니다. <pre>Ab(Sps)Ab(Pps)Ab(I-frame)Ab(P/B-frame) Ab(P/B-frame)…. Ab(Sps)Ab(Pps)Ab(I-frame)Ab(P/B-frame) Ab(P/B-frame)</pre> H.264의 경우 코덱 프라이빗 데이터(CPD)는 SPS(시퀀스 파라미터 세트) 및 PPS(픽처 파라미터 세트) 파라미터에 있으며 AVCC 형식에 맞게 조정할 수 있습니다. 미디어 파이프라인이 CPD를 별도로 제공하지 않는 한, 애플리케이션은 프레임에서 CPD를 추출할 수 있습니다. 첫 번째 IDR 프레임(SPS 및 PPS를 포함해야 함)을 찾고, 두 NALUs()를 추출`Ab(Sps)Ab(Pps)`하고,의 CPD에 설정하여이 작업을 수행할 수 있습니다`StreamDefinition`. 자세한 내용은 [NAL(Network Abstraction Layer) 적응 플래그 참조](producer-reference-nal.md) 단원을 참조하십시오.  | 기본값은 프레임 데이터와 CPD(코덱 프라이빗 데이터) 모두에 대해 Annex-B 형식을 AVCC 형식으로 조정하는 것입니다. | 
| frame\$1rate | uint32\$1t  | 예상 프레임 속도입니다. 이 값은 버퍼링 니즈를 계산하는 데 사용됩니다. | 25 | 
| avg\$1bandwidth\$1bps | uint32\$1t  | 스트림용 예상 평균 대역폭. 이 값은 버퍼링 니즈를 계산하는 데 사용됩니다. | 4 \$1 1024 \$1 1024  | 
| buffer\$1duration | duration<uint64\$1t>  | 스트림 버퍼 지속 시간(초)입니다. SDK는 최대 까지 프레임을 콘텐츠 스토어에 유지하며buffer\$1duration, 그 이후에는 창이 앞으로 이동함에 따라 이전 프레임이 삭제됩니다. 삭제되는 프레임이 백엔드로 전송되지 않은 경우 삭제된 프레임 콜백이 호출됩니다. 현재 버퍼 지속 시간이 max\$1latency보다 크면 스트림 지연 시간 압력 콜백이 호출됩니다. 조각 지속 ACK가 수신되면 버퍼가 다음 조각 시작에 맞게 잘립니다. 따라서 콘텐츠가 클라우드에 내구성 있게 지속되므로 더 이상 로컬 디바이스에 콘텐츠를 저장할 필요가 없습니다. | 120 | 
| replay\$1duration | duration<uint64\$1t> | 재시작이 활성화된 경우 오류 발생 시 재생하기 위해 현재 리더를 뒤로 굴리는 초 단위의 기간입니다. 버퍼가 시작되면 롤백이 중지됩니다(스트리밍이 막 시작되었거나 지속적인 ACK가 나타나는 경우). 롤백은 조각화 시작을 나타내는 키 프레임에 랜딩하려고 합니다. 다시 시작을 유발하는 ' 오류가 데드 호스트(호스트가 여전히 활성 상태이고 내부 버퍼에 프레임 데이터가 포함되어 있음)를 나타내지 않는 경우 롤백은 마지막으로 수신된 ACK 프레임에서 중지됩니다. 그런 다음 전체 조각이 호스트 메모리에 이미 저장되어 있으므로 다음 키 프레임으로 앞으로 롤합니다. | 40 | 
| connection\$1staleness | duration<uint64\$1t> | SDK가 버퍼링 ACK를 수신하지 않는 경우 스트림 기한 경과 콜백이 호출되는 초 단위의 시간입니다. 프레임이 디바이스에서 전송되고 있지만 백엔드가 프레임을 승인하고 있지 않음을 나타냅니다. 이 조건은 중간 홉 또는 로드 밸런서에서 연결이 끊어졌음을 나타냅니다. | 30 | 
| codec\$1id | string | MKV 트랙의 Codec ID | V\$1MPEG4/ISO/AVC | 
| track\$1name | string | MKV 트랙 이름 | kinesis\$1video | 
| codecPrivateData | unsigned char\$1  | CPD(코덱 프라이빗 데이터) 버퍼입니다. 미디어 파이프라인이 스트림이 시작되기 전 CPD에 대한 정보를 가지고 있다면 미디어 파이프라인은 StreamDefinition.codecPrivateData에 설정됩니다. 비트가 복사되며, 스트림을 생성하기 위한 호출 후에 버퍼를 재사용하거나 비울 수 있습니다. 그러나 스트림이 생성될 때 데이터를 사용할 수 없는 경우 KinesisVideoStream.start(cpd) 함수의 오버로드 중 하나로 설정할 수 있습니다. | null | 
| codecPrivateDataSize | uint32\$1t  | 코덱 프라이빗 데이터 버퍼 크기입니다. | 0 | 

## ClientMetrics
<a name="producer-reference-structures-stream-clientmetrics"></a>

**ClientMetrics** 객체는 `getKinesisVideoMetrics`를 호출하여 채워지게 됩니다.

### 멤버 필드
<a name="producer-reference-structures-stream-clientmetrics-fields"></a>


****  

| 필드 | 데이터 유형 | 설명 | 
| --- | --- | --- | 
| version | UINT32 | 구조의 버전은 CLIENT\$1METRICS\$1CURRENT\$1VERSION 매크로에 정의되어 있습니다. | 
| contentStoreSize  | UINT64 | 바이트 단위의 전체 콘텐츠 스토어 크기. DeviceInfo.StorageInfo.storageSize에서 이 값을 지정합니다. | 
| contentStoreAvailableSize  | UINT64 | 현재 사용 가능한 스토리지 크기는 바이트입니다. | 
| contentStoreAllocatedSize  | UINT64 | 현재 할당된 크기입니다. 내부 기록 및 콘텐츠 저장소 구현으로 인해 할당된 크기 더하기 사용 가능한 크기는 전체 스토리지 크기보다 약간 작아야 합니다. | 
| totalContentViewsSize  | UINT64 | 모든 스트림에 대한 모든 콘텐츠에 할당된 메모리 크기. 이는 스토리지 크기에 포함되지 않습니다. 이 메모리는 MEMALLOC 매크로를 사용하여 할당되고 덮어 쓰여 사용자 지정 할당기를 제공합니다. | 
| totalFrameRate | UINT64 | 모든 스트림의 관측된 총 프레임 속도. | 
| totalTransferRate | UINT64 | 초당 바이트 단위의 모든 스트림의 관측된 총 스트림 속도. | 

## StreamMetrics
<a name="producer-reference-structures-stream-streammetrics"></a>

**StreamMetrics** 객체는 `getKinesisVideoMetrics`를 호출하여 채워지게 됩니다.

### 멤버 필드
<a name="producer-reference-structures-stream-clientmetrics-fields"></a>


****  

| 필드 | 데이터 유형 | 설명 | 
| --- | --- | --- | 
| version | UINT32 | 구조의 버전은 STREAM\$1METRICS\$1CURRENT\$1VERSION 매크로에 정의되어 있습니다. | 
| currentViewDuration  | UINT64 | 축척된 프레임 지속 시간. 빠른 네트워킹의 경우이 지속 시간은 0이거나 프레임 지속 시간(프레임이 전송 중일 때)입니다. 지속 시간이에 max\$1latency 지정된 것보다 길어지면 StreamDefinition스트림 지연 시간 콜백이 지정된 경우 호출됩니다. 지속 시간은 PIC 계층의 기본 시간 단위인 100ns 단위로 지정됩니다. | 
| overallViewDuration  | UINT64 | 총 보기 지속 시간. 스트림이 ACKs 또는 지속성 없이 구성된 경우 프레임이 Kinesis 비디오 스트림에 들어가면이 값이 커지고 buffer\$1duration의와 동일하게 됩니다StreamDefinition. ACKs 활성화되고 지속된 ACK가 수신되면 버퍼가 다음 키 프레임으로 잘립니다. 이는 ACK 타임스탬프가 전체 조각의 시작을 나타내기 때문입니다. 지속 시간은 PIC 계층의 기본 시간 단위인 100-ns 단위로 지정됩니다. | 
| currentViewSize  | UINT64 | 바이트 단위의 현재 버퍼 크기. | 
| overallViewSize  | UINT64 | 바이트 단위의 전체 보기 크기. | 
| currentFrameRate  | UINT64 | 현재 스트림의 관측된 총 프레임 속도. | 
| currentTransferRate | UINT64 | 초당 바이트 단위의 현재 스트림의 관측된 전송 속도. | 

# 생산자 SDK 콜백
<a name="producer-reference-callbacks"></a>

Amazon Kinesis Video Streams 생산자 SDK의 클래스 및 메서드는 자체 프로세스를 유지하지 않습니다. 그 대신, 수신 함수 호출 및 이벤트를 사용하여 애플리케이션과 통신할 콜백을 예약합니다.

애플리케이션이 SDK와 상호 작용하는 데 사용할 수 있는 두 개의 콜백 패턴이 있습니다.
+ `CallbackProvider` -이 객체는 플랫폼 독립적 코드(PIC) 구성 요소의 모든 콜백을 애플리케이션에 노출합니다. 이 패턴은 전체 기능을 허용하지만, 이 경우 구현은 C\$1\$1 계층에 있는 모든 퍼블릭 API 메서드 및 서명을 처리해야 합니다.
+ [StreamCallbackProvider](#producer-reference-callbacks-streamcallbackprovider) 및 [ClientCallbackProvider](#producer-reference-callbacks-clientcallbackprovider) - 이러한 객체는 스트림별 및 클라이언트별 콜백을 노출하고 SDK의 C\$1\$1 계층은 나머지 콜백을 노출합니다. 이것은 생산자 SDK와 상호 작용하기 위한 기본 콜백 패턴입니다.

다음 다이어그램은 콜백 객체의 객체 모델을 보여줍니다.

![\[Kinesis Video Streams에서 생산자와 소비자의 상호 작용을 보여주는 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/kinesisvideostreams/latest/dg/images/callbacks-10.png)


위의 다이어그램에서 `DefaultCallbackProvider`는 `CallbackProvider`(PIC에 있는 모든 콜백을 공개)에서 파생되며 `StreamCallbackProvider` 및 `ClientCallbackProvider`를 포함합니다.

**Topics**
+ [ClientCallbackProvider](#producer-reference-callbacks-clientcallbackprovider)
+ [StreamCallbackProvider](#producer-reference-callbacks-streamcallbackprovider)
+ [ClientCallbacks 구조](#producer-reference-callbacks-clientcallbacks)
+ [스트리밍을 재시도하기 위한 콜백 구현](#producer-reference-callbacks-retry)

## ClientCallbackProvider
<a name="producer-reference-callbacks-clientcallbackprovider"></a>

`ClientCallbackProvider` 객체는 클라이언트 수준 콜백 함수를 공개합니다. 이 함수의 세부 정보는 [ClientCallbacks 구조](#producer-reference-callbacks-clientcallbacks) 단원에서 설명합니다.

**콜백 메서드:**
+ `getClientReadyCallback` - 클라이언트의 준비 상태를 보고합니다.
+ `getStorageOverflowPressureCallback` - 스토리지 오버플로 또는 압력을 보고합니다. 스토리지 활용도가 전체 스토리지 크기의 5%인 `STORAGE_PRESSURE_NOTIFICATION_THRESHOLD` 값 밑으로 떨어지면 이 콜백이 호출됩니다. 자세한 내용은 [StorageInfo](producer-reference-structures-producer.md#producer-reference-structures-producer-storageinfo) 단원을 참조하십시오.

## StreamCallbackProvider
<a name="producer-reference-callbacks-streamcallbackprovider"></a>

`StreamCallbackProvider` 객체는 스트림 수준 콜백 함수를 공개합니다.

**콜백 메서드:**
+ `getDroppedFragmentReportCallback`: 드롭된 조각을 보고합니다.
+ `getDroppedFrameReportCallback` - 삭제된 프레임을 보고합니다.
+ `getFragmentAckReceivedCallback` - 스트림에 대해 조각 ACK가 수신되었음을 보고합니다.
+ `getStreamClosedCallback` - 스트림 닫힘 조건을 보고합니다.
+ `getStreamConnectionStaleCallback` - 오래된 연결 조건을 보고합니다. 이 조건에서 생산자는 서비스에 데이터를 전송하지만 승인을 받지 않습니다.
+ `getStreamDataAvailableCallback` - 스트림에서 데이터를 사용할 수 있음을 보고합니다.
+ `getStreamErrorReportCallback` - 스트림 오류 조건을 보고합니다.
+ `getStreamLatencyPressureCallback` - 누적된 버퍼 크기가 `max_latency` 값보다 큰 스트림 지연 시간 조건을 보고합니다. 자세한 내용은 [StreamDefinition/StreamInfo](producer-reference-structures-stream.md#producer-reference-structures-stream-streaminfo) 단원을 참조하십시오.
+ `getStreamReadyCallback`: - 스트림 준비 조건을 보고합니다.
+ `getStreamUnderflowReportCallback` - 스트림 언더플로우 조건을 보고합니다. 이 함수는 현재 사용되지 않으며 향후 사용을 위해 예약되어 있습니다.

`StreamCallbackProvider`의 소스 코드는 [StreamCallbackProvider.h](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/d1684599a141785752582c16264e3123866f3cf8/kinesis-video-producer/src/StreamCallbackProvider.h)를 참조하십시오.

## ClientCallbacks 구조
<a name="producer-reference-callbacks-clientcallbacks"></a>

`ClientCallbacks` 구조에는 특정 이벤트가 발생할 때 PIC가 호출하는 콜백 함수 엔트리 포인트가 포함됩니다. 구조에는 `CALLBACKS_CURRENT_VERSION` 필드에 있는 버전 정보, 및 개별 콜백 함수를 통해 반환되는 사용자 정의 데이터에 대한 `customData` 필드도 포함됩니다.

다음 코드 예와 같이, 클라이언트 애플리케이션은 `this` 포인터를 `custom_data` 필드에 사용하여 멤버 함수를 정적 `ClientCallback` 함수에 실행 시간에 매핑합니다.

```
STATUS TestStreamCallbackProvider::streamClosedHandler(UINT64 custom_data, STREAM_HANDLE stream_handle, UINT64 stream_upload_handle) {
    LOG_INFO("Reporting stream stopped.");

TestStreamCallbackProvider* streamCallbackProvider = reinterpret_cast<TestStreamCallbackProvider*> (custom_data);
streamCallbackProvider->streamClosedHandler(...);
```


**이벤트**  

| 함수 | 설명 | 형식 | 
| --- | --- | --- | 
| CreateDeviceFunc | 백엔드에서 현재 구현되지 않습니다. Java 또는 C\$1\$1에서 호출되면 이 호출이 실패합니다. 다른 클라이언트는 플랫폼별 초기화를 수행합니다. | 백엔드 API | 
| CreateStreamFunc | 스트림이 생성될 때 호출됩니다. | 백엔드 API | 
| DescribeStreamFunc | DescribeStream이 호출될 때 호출됩니다. | 백엔드 API | 
| GetStreamingEndpointFunc | GetStreamingEndpoint이 호출될 때 호출됩니다. | 백엔드 API | 
| GetStreamingTokenFunc | GetStreamingToken이 호출될 때 호출됩니다. | 백엔드 API | 
| PutStreamFunc | PutStream이 호출될 때 호출됩니다. | 백엔드 API | 
| TagResourceFunc | TagResource이 호출될 때 호출됩니다. | 백엔드 API | 
|   |   |   | 
| CreateMutexFunc | 동기화 뮤텍스를 생성합니다. | 동기화 | 
| FreeMutexFunc | 뮤텍스를 비웁니다. | 동기화 | 
| LockMutexFunc | 동기화 뮤텍스를 잠급니다. | 동기화 | 
| TryLockMutexFunc | 뮤텍스를 잠그려고 시도합니다. 현재 구현되지 않습니다. | 동기화 | 
| UnlockMutexFunc | 뮤텍스 잠금을 해제합니다. | 동기화 | 
|   |   |   | 
| ClientReadyFunc | 클라이언트가 준비 상태에 들어갈 때 호출됩니다. | Notification | 
| DroppedFrameReportFunc | 프레임이 드롭될 때 보고합니다. | Notification | 
| DroppedFragmentReportFunc | 조각이 드롭될 때 보고합니다. 이 함수는 현재 사용되지 않으며 향후 사용을 위해 예약되어 있습니다. | Notification | 
| FragmentAckReceivedFunc | 조각 ACK(버퍼링, 수신, 지속 및 오류)가 수신될 때 호출됩니다. | Notification | 
| StorageOverflowPressureFunc | 스토리지 활용도가 전체 스토리지 크기의 5%로 정의되는 STORAGE\$1PRESSURE\$1NOTIFICATION\$1THRESHOLD 값 밑으로 떨어지면 호출됩니다. | Notification | 
| StreamClosedFunc | 나머지 프레임의 마지막 비트가 스트리밍될 때 호출됩니다. | Notification | 
| StreamConnectionStaleFunc | 스트림이 기한 경과 연결 상태에 들어갈 때 호출됩니다. 이 조건에서 생산자는 서비스에 데이터를 전송하지만 승인을 받지 않습니다. | Notification | 
| StreamDataAvailableFunc | 스트림 데이터를 사용할 수 있을 때 호출됩니다. | Notification | 
| StreamErrorReportFunc | 스트림 오류가 발생할 경우 호출됩니다. 스트림이 이 조건에 있으면 PIC는 스트림을 자동으로 닫습니다. | Notification | 
| StreamLatencyPressureFunc | 스트림이 지연 시간 조건에 들어갈 때 호출됩니다. 이 조건은 누적된 버퍼 크기가 max\$1latency 값보다 큰 경우입니다. 자세한 내용은 [StreamDefinition/StreamInfo](producer-reference-structures-stream.md#producer-reference-structures-stream-streaminfo) 단원을 참조하십시오. | Notification | 
| StreamReadyFunc | 스트림이 준비 상태에 들어갈 때 호출됩니다. | Notification | 
| StreamUnderflowReportFunc | 이 함수는 현재 사용되지 않으며 향후 사용을 위해 예약되어 있습니다. | Notification | 
|   |   |   | 
| DeviceCertToTokenFunc | 연결 인증서를 토큰으로 반환합니다. | 플랫폼 통합 | 
| GetCurrentTimeFunc | 현재 시간을 반환합니다. | 플랫폼 통합 | 
| GetDeviceCertificateFunc | 디바이스 인증서를 반환합니다. 이 함수는 현재 사용되지 않으며 향후 사용을 위해 예약되어 있습니다. | 플랫폼 통합 | 
| GetDeviceFingerprintFunc | 디바이스 지문을 반환합니다. 이 함수는 현재 사용되지 않으며 향후 사용을 위해 예약되어 있습니다. | 플랫폼 통합 | 
| GetRandomNumberFunc | 0과 RAND\$1MAX 사이의 임의 숫자를 반환합니다. | 플랫폼 통합 | 
| GetSecurityTokenFunc | 백엔드 API와 통신하는 함수에 전달되는 보안 토큰을 반환합니다. 구현은 직렬화된 AccessKeyId, SecretKeyId 및 세션 토큰을 지정할 수 있습니다. | 플랫폼 통합 | 
| LogPrintFunc | 태그와 로그 수준을 사용하여 텍스트 줄을 기록합니다. 자세한 내용은 PlatformUtils.h 단원을 참조하십시오. | 플랫폼 통합 | 

위의 표에 있는 플랫폼 통합 함수의 경우 마지막 파라미터는 `ServiceCallContext` 구조이며, 이 구조에는 다음 필드가 있습니다.
+ `version`: 구조의 버전입니다.
+ `callAfter`: 함수를 호출할 때까지의 절대 시간입니다.
+ `timeout`: 작업 제한 시간입니다(100나노초 단위).
+ `customData`: 다시 클라이언트에게 전달할 사용자 정의 값입니다.
+ `pAuthInfo`: 호출에 대한 자격 증명입니다. 자세한 내용은 다음(`__AuthInfo`) 구조를 참조하십시오.

권한 부여 정보는 `__AuthInfo` 구조를 사용하여 제공되며, 이 구조는 직렬화된 자격 증명 또는 공급자별 인증 토큰일 수 있습니다. 이 구조에는 다음 필드가 있습니다.
+ `version`: `__AuthInfo` 구조의 버전입니다.
+ `type`: 자격 증명의 유형(인증서 또는 보안 토큰)을 정의하는 `AUTH_INFO_TYPE` 값입니다.
+ `data`: 인증 정보가 포함된 바이트 배열입니다.
+ `size`: `data` 파라미터의 크기입니다.
+ `expiration`: 100나노초 단위로 표시되는 자격 증명의 만료입니다.

## 스트리밍을 재시도하기 위한 콜백 구현
<a name="producer-reference-callbacks-retry"></a>

Kinesis Video Producer SDK는 콜백 기능을 통해 스트리밍 상태를 알려 줍니다. 스트리밍 중에 발생하는 일시적인 네트워크 문제를 복구하려면 다음 콜백 메커니즘을 구현하는 것이 좋습니다.
+ **스트림 지연 시간 압력 콜백** -이 콜백 메커니즘은 SDK에 스트림 지연 시간 조건이 발생하면 시작됩니다. 누적된 버퍼 크기가 MAX\$1LATENCY 값보다 커지면 이러한 현상이 발생합니다. 스트리밍 애플리케이션은 스트림을 생성할 때 MAX\$1LATENCY를 기본값인 60초로 설정합니다. 이 콜백의 일반적인 구현 방법은 연결을 재설정하는 것입니다. 필요한 경우 [https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/kinesis-video-c-producer/src/source/StreamLatencyStateMachine.c](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c/blob/master/src/source/StreamLatencyStateMachine.c)에 있는 샘플 구현을 사용할 수 있습니다. 네트워크 중단으로 인해 전송되지 않은 프레임을 채우기 위해 보조 스토리지에 저장할 수 있는 옵션은 없습니다.
+ **스트림 기한 경과 콜백** -이 콜백은 생산자가 Amazon Kinesis Data Streams 서비스(업링크)로 데이터를 전송할 수 있지만 승인(버퍼링된 ACK)을 제시간에 다시 가져올 수 없는 경우(기본값은 60초) 시작됩니다. 네트워크 설정에 따라 스트림 지연 시간 압력 콜백 또는 스트림 기한 경과 콜백 또는 둘 다 시작될 수 있습니다. 스트림 지연 시간 압력 콜백의 재시도 구현과 마찬가지로, 일반적인 구현 방법은 연결을 재설정하고 스트리밍을 위한 연결을 새로 시작하는 것입니다. 필요한 경우 [https://github.com/awslabs/amazon-kinesis-video-streams-producer-c/blob/master/src/source/ConnectionStaleStateMachine.c](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c/blob/master/src/source/ConnectionStaleStateMachine.c)에 있는 샘플 구현을 사용할 수 있습니다.
+ **스트림 오류 콜백** -이 콜백은 SDK에서 네트워크 연결 제한 시간이 발생하거나 KVS API 서비스 호출 중에 다른 오류가 발생할 때 시작됩니다.
+ **프레임 콜백 중단** -이 콜백은 느린 네트워크 속도 또는 스트림 오류로 인해 스토리지 크기가 가득 차면 시작됩니다. 네트워크 속도로 인해 프레임이 삭제되는 경우 스토리지 크기를 늘리거나, 비디오 프레임 크기를 줄이거나, 네트워크 속도에 맞게 프레임 속도를 줄일 수 있습니다.

# Kinesis Video Streams에서 스트리밍 메타데이터 사용
<a name="how-meta"></a>

Amazon Kinesis Video Streams 생산자 SDK를 사용하여 Kinesis 비디오 스트림의 개별 조각 수준에서 메타데이터를 포함할 수 있습니다. Kinesis Video Streams의 메타데이터는 변경 가능한 키-값 페어입니다. 이를 사용하여 조각의 내용을 설명하거나, 실제 조각과 함께 전송해야 하는 연결된 센서 판독값을 포함하거나, 다른 사용자 지정 요구 사항을 충족할 수 있습니다. 메타데이터는 [GetMedia](API_dataplane_GetMedia.md) 또는 [GetMediaForFragmentList](API_reader_GetMediaForFragmentList.md) API 작업의 일부로 사용 가능합니다. 스트림 보존 기간의 전체 기간 동안 조각과 함께 저장됩니다. 소비 애플리케이션은를 사용하여 메타데이터를 기반으로 읽고 처리하고 대응할 수 있습니다[파서 라이브러리를 사용하여 카메라의 출력 보기](parser-library.md).

다음과 같은 두 가지 모드를 통해 스트림의 조각과 함께 메타데이터를 포함할 수 있습니다.
+ **비영구** - 발생한 비즈니스별 기준에 따라 스트림의 조각에 메타데이터를 일회성 또는 임시로 첨부할 수 있습니다. 예를 들어, 모션을 감지하고 Kinesis 비디오 스트림으로 조각을 보내기 전에 모션이 포함된 해당 조각에 메타데이터를 추가하는 스마트 카메라가 있습니다. 다음 형식으로 메타데이터를 조각에 적용할 수 있습니다. `Motion = true` 
+ **영구** - 지속적인 필요에 따라 스트림의 연속적이고 연속적인 조각에 메타데이터를 첨부할 수 있습니다. 예를 들어 Kinesis 비디오 스트림으로 전송하는 모든 조각과 연결된 현재 위도 및 경도 좌표를 전송하는 스마트 카메라가 있습니다. `Lat = 47.608013N , Long = -122.335167W` 형식으로 메타데이터를 모든 조각에 적용할 수 있습니다.

애플리케이션의 요구 사항에 따라 이 두 가지 모드의 메타데이터를 동일한 조각에 동시에 부착할 수 있습니다. 포함된 메타데이터에는 감지된 객체, 추적된 활동, GPS 좌표 또는 스트림의 조각에 연결하려는 기타 사용자 지정 데이터가 포함될 수 있습니다. 메타데이터는 키-값 문자열 페어로 인코딩됩니다.

## Kinesis 비디오 스트림에 메타데이터 추가
<a name="how-meta-add"></a>

Kinesis 비디오 스트림에 추가하는 메타데이터는 키-값 페어로 구현되는 MKV 태그로 모델링됩니다.

메타데이터는 스트림 내에서 이벤트를 표시하는 것처럼 *일시적*일 수도 있고 특정 이벤트가 발생하는 조각을 식별하는 것처럼 *지속적*일 수도 있습니다. 영구 메타데이터 항목은 취소될 때까지 남아 있으며 각 연속 조각에 적용됩니다.

**참고**  
[Kinesis Video Streams에 업로드](producer-sdk.md)을(를) 사용하여 추가되는 메타데이터 항목은 [TagStream](API_TagStream.md), [UntagStream](API_UntagStream.md) 및 [ListTagsForStream](API_ListTagsForStream.md)와(과) 함께 실행되는 스트림 수준 태깅 API와는 구별됩니다.

### 스트리밍 메타데이터 API
<a name="how-meta-api"></a>

생산자 SDK에서 다음 작업을 사용하여 스트리밍 메타데이터를 구현할 수 있습니다.

**Topics**
+ [PIC](#how-meta-api-pic)
+ [C\$1\$1 생산자 SDK](#how-meta-api-cpp)
+ [Java 생산자 SDK](#how-meta-api-java)
+ [영구 및 비영구 메타데이터](#how-meta-api-persistence)

#### PIC
<a name="how-meta-api-pic"></a>

```
PUBLIC_API STATUS putKinesisVideoFragmentMetadata(STREAM_HANDLE streamHandle, 
    PCHAR name, 
    PCHAR value, 
    BOOL persistent);
```

#### C\$1\$1 생산자 SDK
<a name="how-meta-api-cpp"></a>

```
/**
 * Appends a "tag" or metadata - a key/value string pair into the stream.
 */
bool putFragmentMetadata(const std::string& name, const std::string& value, bool persistent = true);
```

#### Java 생산자 SDK
<a name="how-meta-api-java"></a>

Java 생산자 SDK를 사용하여를 `MediaSource` 사용하여 메타데이터를에 추가할 수 있습니다`MediaSourceSink.onCodecPrivateData`.

```
void onFragmentMetadata(final @Nonnull String metadataName, final @Nonnull String metadataValue, final boolean persistent)
throws KinesisVideoException;
```

#### 영구 및 비영구 메타데이터
<a name="how-meta-api-persistence"></a>

비지속성 메타데이터의 경우, 여러 메타데이터 항목을 동일한 *이름*으로 추가할 수 있습니다. 생산자 SDK는 메타데이터 항목이 다음 조각 앞에 추가될 때까지 메타데이터 대기열에서 메타데이터 항목을 수집합니다. 메타데이터 항목이 스트림에 적용됨에 따라 메타데이터 대기열은 삭제됩니다. 메타데이터를 반복하려면 `putKinesisVideoFragmentMetadata` 또는 `putFragmentMetadata`를 다시 호출합니다.

영구 메타데이터의 경우 생산자 SDK는 비영구 메타데이터와 동일한 방식으로 메타데이터 대기열에 메타데이터 항목을 수집합니다. 그러나 메타데이터 항목은 다음 조각 앞에 추가될 때 대기열에서 제거되지 않습니다.

`true`로 설정된 `persistent`로 `putKinesisVideoFragmentMetadata` 또는 `putFragmentMetadata`를 호출하면 다음과 같은 동작으로 이어집니다.
+ API를 호출하면 메타데이터 항목을 대기열로 가져갑니다. 메타데이터는 해당 항목이 대기열에 있는 동안 MKV 태그로 모든 조각에 추가됩니다.
+ 같은 *이름*과 다른 *값*으로 API를 이전에 추가된 메타데이터 항목으로서 호출하면 해당 항목을 덮어쓰기합니다.
+ API를 비어 있는 *값*으로 호출하면 메타데이터 대기열에서 메타데이터 항목을 제거(취소)합니다.



# Kinesis Video Streams에서 IPv6 사용
<a name="ipv6-support"></a>

제어 영역 및 데이터 영역 작업 모두에 IPv6를 사용하도록 Kinesis Video Streams를 구성할 수 있습니다. 이를 통해 애플리케이션은 듀얼 스택 엔드포인트를 통해 IPv6 주소를 사용하여 Kinesis Video Streams 서비스와 통신할 수 있습니다.

**참고**  
IPv6 지원에는 특정 SDK 버전 및 구성 설정이 필요합니다. Kinesis Video Streams SDK 및 AWS SDK 버전이 IPv6 듀얼 스택 엔드포인트를 지원하는지 확인합니다. 듀얼 스택 엔드포인트는 IPv4 및 IPv6 트래픽을 모두 지원하며 일부 리전의 일부 서비스에서 사용할 수 있습니다.

Kinesis Video Streams는 생산자와 소비자 애플리케이션 모두에 대해 듀얼 스택 엔드포인트를 통해 IPv6를 지원합니다. 컨트롤 플레인 API 호출 및 데이터 플레인 스트리밍 작업에 IPv6를 사용하도록 애플리케이션을 구성할 수 있습니다.

## IPv6용 AWS SDK 구성
<a name="configure-aws-sdk-ipv6"></a>

 AWS SDK를 사용하여 프로덕션 설정에서 Kinesis Video Streams 컨트롤 플레인 APIs 호출하는 경우 듀얼 스택 엔드포인트를 구성하여 IPv6를 활성화할 수 있습니다. AWS SDK는 듀얼 스택 엔드포인트를 활성화하는 여러 가지 표준화된 방법을 제공합니다.

**중요**  
듀얼 스택 엔드포인트가 활성화되면 SDK는 듀얼 스택 엔드포인트를 사용하여 네트워크 요청을 시도합니다. 서비스 또는 리전에 대한 듀얼 스택 엔드포인트가 없는 경우 요청이 실패합니다.

### 환경 변수 사용
<a name="ipv6-environment-variables"></a>

IPv6 듀얼 스택 엔드포인트를 활성화하려면 다음 환경 변수를 설정합니다.

```
export AWS_USE_DUALSTACK_ENDPOINT=true
```

### AWS 구성 파일 사용
<a name="ipv6-config-file"></a>

 AWS 구성 파일(`~/.aws/config`)에 다음 설정을 추가합니다.

```
[default]
use_dualstack_endpoint = true
```

### JVM 시스템 속성 사용(Java 및 Kotlin SDKs만 해당)
<a name="ipv6-jvm-properties"></a>

Java 및 Kotlin 애플리케이션의 경우 다음 JVM 시스템 속성을 설정합니다.

```
-Daws.useDualstackEndpoint=true
```

또는 Java 코드에서 프로그래밍 방식으로 다음을 수행할 수 있습니다.

```
System.setProperty("aws.useDualstackEndpoint", "true");
```

### SDK 지원
<a name="sdk-support-table"></a>

다음 AWS SDKs 지원합니다.


| SDK | 지원됨 | 구성 방법 | 
| --- | --- | --- | 
| AWS CLI v2 | 예 | 환경 변수, 구성 파일 | 
| SDK for C\$1\$1 | 예 | 환경 변수, 구성 파일 | 
| SDK for Go V2 (1.x) | 예 | 환경 변수, 구성 파일 | 
| SDK for Java 2.x | 예 | 환경 변수, 구성 파일, JVM 속성 | 
| SDK for Java 1.x | 아니요 | 지원되지 않음 | 
| SDK for JavaScript 3.x | 예 | 환경 변수, 구성 파일 | 
| SDK for Python (Boto3) | 예 | 환경 변수, 구성 파일 | 

듀얼 스택 엔드포인트를 구성한 후 AWS SDK는 Kinesis Video Streams 컨트롤 플레인 APIs를 호출할 때 IPv6 엔드포인트를 자동으로 사용합니다.

## IPv6용 Kinesis Video Streams 생산자 SDK 구성
<a name="configure-producer-sdk-ipv6"></a>

Kinesis Video Streams 생산자 SDK는 컨트롤 플레인 및 데이터 플레인 작업 모두에 대한 IPv6 구성 옵션을 제공합니다. 이러한 설정은 AWS SDK 듀얼 스택 엔드포인트 구성에서 작동합니다.

### C/C\$1\$1 생산자 SDK 구성
<a name="configure-c-cpp-producer-sdk"></a>

기본 엔드포인트 및 DNS 확인 체인은 KVS Producer-C SDK 버전 1.6.0에서 구현됩니다. 이러한 파라미터에 대한 구성을 설정할 수 있는 각 위치를 순차적으로 확인한 다음 설정한 첫 번째 위치를 선택합니다. 사전 정의된 시퀀스는 다음과 같습니다.

생산자 SDKs에 대한 자세한 내용은 [생산자 SDK for C](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c), [생산자 SDK for C\$1\$1](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp) 및 [생산자 SDK 관련 주제를](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk.html#producer-sdk-related-topics) 참조하세요.

#### 엔드포인트 구성
<a name="endpoint-configuration"></a>

1. 의 `controlPlaneUrl` 파라미터입니다`createAbstractDefaultCallbacksProvider`.

1. 엔드포인트 구성 CMake 파라미터: (`-DAWS_KVS_USE_LEGACY_ENDPOINT_ONLY=TRUE`, `-DAWS_KVS_USE_DUAL_STACK_ENDPOINT_ONLY=TRUE`)

1. 환경 변수: (`export AWS_USE_DUALSTACK_ENDPOINT=TRUE`)
   + `AWS_USE_DUALSTACK_ENDPOINT`가 `TRUE` (대/소문자 비구분)인 경우 듀얼 스택 엔드포인트가 사용됩니다.

1. 그렇지 않으면 레거시 엔드포인트가 구성되고 사용됩니다.

2, 3, 4의 경우 엔드포인트는에 제공된 리전을 기반으로 구성됩니다`createAbstractDefaultCallbacksProvider`.

#### DNS 필터링
<a name="dns-filtering"></a>

KVS 생산자 SDK는 구성에 따라 적절한 `CURLOPT_IPRESOLVE` 파라미터를 설정합니다.

1. DNS 확인 CMake 파라미터: (`-DAWS_KVS_IPV4_ONLY=TRUE`, `-DAWS_KVS_IPV6_ONLY=TRUE`, `-DAWS_KVS_IPV4_AND_IPV6_ONLY=TRUE`)

1. 환경 변수(`export AWS_KVS_USE_IPV4=TRUE`, `export AWS_KVS_USE_IPV6=TRUE`)

1. 그렇지 않으면 필터링이 수행되지 않습니다. DNS에서 반환되는 경우 IPv4 및 IPv6 IP 주소를 모두 사용할 수 있습니다.

**참고**  
DNS 필터 설정이 IPV6 IP 주소를 필터링하도록 설정되어 있지만 SDK 구성이 레거시 엔드포인트를 사용하는 경우(IPV4-only 주소를 반환함) 요청이 실패합니다.

C\$1\$1 생산자 SDK 버전 3.5.0은 KVS API 호출에 생산자-C SDK 1.6.0을 사용합니다.

### GStreamer 플러그인 구성
<a name="configure-gstreamer-plugin"></a>

GStreamer 플러그인은 기본 C 생산자 SDK를 사용하므로 앞서 설명한 대로 IPv6용 C SDK를 구성할 때 IPv6 구성이 자동으로 처리됩니다.

코드 수정은 필요하지 않습니다. CMake 파라미터를 사용하여 SDK를 빌드하거나 이전 섹션에 설명된 대로 적절한 환경 변수를 설정하기만 하면 됩니다.

### 데이터 영역 엔드포인트 해상도
<a name="data-plane-endpoint-resolution"></a>

데이터 영역 작업의 경우 `GetDataEndpoint` API를 사용하여 적절한 듀얼 스택 데이터 영역 엔드포인트를 검색합니다. 서비스는 요청 URL에 따라 해당 엔드포인트를 반환합니다.

예제:
+ 로 끝나는 레거시 엔드포인트에 `GetDataEndpoint` API 요청이 이루어진 경우 `.amazonaws.com`Kinesis Video Streams는 로 끝나는 레거시 데이터 영역 엔드포인트를 반환합니다`.amazonaws.com`.
+ 로 끝나는 듀얼 스택 엔드포인트에 `GetDataEndpoint` API 요청이 이루어진 경우 `.api.aws`Kinesis Video Streams는 로 끝나는 듀얼 스택 데이터 영역 엔드포인트를 반환합니다`.api.aws`.

## IPv6 AWS CLI 용 구성
<a name="configure-aws-cli-ipv6"></a>

Kinesis Video Streams 작업(일반적으로 proof-of-concept 작업) AWS CLI 에를 사용하는 경우 듀얼 스택 엔드포인트를 구성하여 IPv6를 활성화할 수 있습니다.

### 환경 변수 사용
<a name="cli-environment-variable"></a>

```
export AWS_USE_DUALSTACK_ENDPOINT=true
```

### AWS 구성 파일 사용
<a name="cli-config-file"></a>

 AWS CLI 구성 파일(`~/.aws/config`)에 다음을 추가합니다.

```
[default]
use_dualstack_endpoint = true
```

## 구성 예제
<a name="configuration-examples"></a>

### C SDK 예제
<a name="c-sdk-example"></a>

IPV6-only 모드에서 KVS Producer-C SDK를 빌드하고 환경 변수 구성을 무시하려면 다음 명령을 사용하여 SDK를 빌드합니다.

```
cmake .. -DAWS_KVS_USE_DUAL_STACK_ENDPOINT_ONLY=TRUE -DAWS_KVS_IPV6_ONLY=TRUE
make -j
```

**참고**  
SDK를 이미 빌드한 경우 클린 빌드를 수행해야 합니다. 빌드 명령을 실행하기 전에 기존 빌드, 오픈 소스 및 종속성 폴더를 삭제합니다.

## 고려 사항
<a name="ipv6-considerations"></a>

### 네트워크 요구 사항
<a name="network-requirements"></a>
+ 네트워크 인프라가 IPv6 연결을 지원하는지 확인
+ 보안 그룹 및 네트워크 ACLs IPv6 트래픽을 허용하는지 확인
+ 배포 환경에서 AWS IPv6 엔드포인트에 대한 연결 테스트
+ 일부 리전의 일부 서비스에서 듀얼 스택 엔드포인트를 사용할 수 있습니다. 대상 리전의 가용성을 확인합니다.

### SDK 호환성
<a name="sdk-compatibility"></a>
+ 지원되는 AWS SDK 버전을 사용하고 있는지 확인합니다.
+  AWS SDK for Java 1.x는 듀얼 스택 엔드포인트 구성을 지원하지 않습니다.
+ SDK for Go 1.x(V1)의 경우 공유 구성 파일 설정을 사용하려면 구성 파일에서 로드를 활성화해야 합니다.

### 테스트 및 검증
<a name="testing-validation"></a>

IPv6-enabled Kinesis Video Streams 애플리케이션을 프로덕션에 배포하기 전에:
+ 컨트롤 플레인 작업 테스트(스트림 생성, 삭제, 나열)
+ 데이터 영역 작업 확인(비디오 수집 및 소비)
+ 네트워크 환경에서 성능 및 연결 검증
+ 카나리아 테스트를 실행하여 일관된 IPv6 기능 보장
+ 듀얼 스택 엔드포인트를 사용할 수 없는 경우 장애 조치 동작 테스트

## IPv6로 업그레이드 시 영향을 받는 고객
<a name="customers-impacted-ipv6"></a>

Kinesis Video Streams용 IPv6를 활성화하면 몇 가지 영역에서 기존 구성 및 정책을 업데이트하여 지속적인 기능을 보장해야 할 수 있습니다.

### IAM 정책 및 IP 주소 필터링
<a name="iam-policies-ip-filtering"></a>

IAM 사용자 정책, 역할 정책 또는 리소스 기반 정책에서 소스 IP 주소 필터링을 사용하는 경우 IPv6 주소 범위를 포함하도록 이러한 정책을 업데이트해야 합니다.

**중요**  
`IpAddress` 또는 `NotIpAddress` 조건에서 IPv4 CIDR 블록을 사용하는 기존 IAM 정책은 IPv6 주소에서 자동으로 작동하지 않습니다. 액세스 제어를 유지하려면 IPv6 범위를 명시적으로 추가해야 합니다.

IPv6에 대한 IAM 정책 업데이트 예:

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "kinesisvideo:*",
      "Resource": "*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": [
            "192.0.2.0/24",
            "203.0.113.0/24",
            "2001:db8::/32"
          ]
        }
      }
    }
  ]
}
```

### 로깅 및 모니터링
<a name="logging-monitoring-ipv6"></a>

IPv6 주소는 IPv4 주소와 형식이 다르므로 로깅, 모니터링 및 분석 시스템에 영향을 미칠 수 있습니다.

#### 로그
<a name="cloudtrail-logs"></a>

 IPv6를 통해 요청하면 `sourceIPAddress` 필드에 IPv6 주소가 로그에 포함됩니다. IPv6 주소 형식을 처리하도록 로그 구문 분석 도구 및 스크립트를 업데이트합니다.

로그의 IPv6 주소 예:

```
{
  "sourceIPAddress": "2001:db8::1",
  "eventName": "CreateStream",
  "eventSource": "kinesisvideo.amazonaws.com"
}
```

## 문제 해결
<a name="troubleshooting-ipv6"></a>

### 일반적인 문제
<a name="common-issues"></a>
+ 연결 실패 - IPv6 네트워크 연결 및 DNS 확인 확인
+ SDK 오류 - 듀얼 스택 엔드포인트를 지원하는 호환 SDK 버전을 사용하고 있는지 확인합니다.
+ 인증 문제 - IAM 정책 및 자격 증명이 IPv6 엔드포인트에서 작동하는지 확인
+ 엔드포인트를 사용할 수 없음 - 서비스 또는 리전에 듀얼 스택 엔드포인트가 없는 경우 요청이 실패합니다.

### 확인 단계
<a name="verification-steps"></a>
+ `AWS_USE_DUALSTACK_ENDPOINT=true`이 설정되었거나 구성 파일에 `use_dualstack_endpoint = true` 있는지 확인
+ Kinesis Video Streams SDK IPv6 구성 플래그가 올바르게 설정되었는지 확인
+  AWS IPv6 엔드포인트에 대한 네트워크 연결 테스트
+ 애플리케이션 로그에서 IPv6-specific 오류 메시지 검토
+ 리전이 Kinesis Video Streams에 대한 듀얼 스택 엔드포인트를 지원하는지 확인

### 구성 검증
<a name="configuration-validation"></a>

다음을 확인하여 듀얼 스택 엔드포인트 구성을 확인할 수 있습니다.
+ 환경 변수: `echo $AWS_USE_DUALSTACK_ENDPOINT`
+ AWS 구성 파일: `cat ~/.aws/config | grep use_dualstack_endpoint`
+ JVM 속성(Java): 애플리케이션 로그에서 시스템 속성 확인