

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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 プロデューサークライアントには 1 つの`KinesisVideoClient`クラスが含まれています。このクラスは、メディアソースの管理、ソースからのデータの受信、ストリームのライフサイクルの管理を行います。データはメディアソースから Kinesis Video Streams に流れます。また、Kinesis Video Streams と独自のハードウェアおよびソフトウェア間のやり取りを定義するための`MediaSource`インターフェイスも提供します。

メディアソースはほぼすべてが対象となります。たとえば、カメラのメディアソースまたはマイクのメディアソースを使用できます。メディアソースはオーディオやビデオソースのみには限定されません。たとえば、データログがテキストファイルの場合でも、データのストリームとして送信できます。また、スマートフォンで複数のカメラから同時にデータをストリームすることもできます。

そのほかのソースからデータを取得するには、`MediaSource` インターフェイスを実装できます。このインターフェイスでは追加のシナリオが可能ですが、ビルトインサポートは提供されません。例えば、次のようなものを Kinesis Video Streams に送信したいとします。
+ 診断データストリーム (アプリケーションログとイベントなど)
+ 赤外線カメラ、RADAR あるいは深度カメラからのデータ

Kinesis Video Streams は、カメラなどのメディア生成デバイス用の組み込み実装を提供しません。このようなデバイスからデータを摘出するには、カスタムのメディアソース実装によるコードを実装する必要があります。これにより、カスタムメディアソースを `KinesisVideoClient` に明示的に登録でき、データは Kinesis Video Streams にアップロードされます。　　

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 Video Streams と統合し、アプリケーションが Kinesis ビデオストリームへのデータのストリーミングを開始できるようにします。

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 では: **[**インポート**] を選択します。ダウンロードしたパッケージのルートに含まれる `pom.xml` ファイルに移動します。
   + **Eclipse では:** [**ファイル**]、[**インポート**]、[**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"));
   ```

   詳細については、[https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/profile/ProfileCredentialsProvider.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/profile/ProfileCredentialsProvider.html)* リファレンスで「AWS SDK for Java ProfileCredentialsProvider*」を参照してください。

# コードを記述して調べる
<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 '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 マネジメントコンソール し、[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 Video Streams と統合し、アプリケーションが Kinesis ビデオストリームへのデータのストリーミングを開始できるようにします。

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)
+ [ID プールを設定する](#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`。

## ID プールを設定する
<a name="set-up-identity-pool"></a>

**ID プールをセットアップ**

1. [Amazon Cognito コンソール](https://console.aws.amazon.com/cognito/home)にサインインし、リージョンが正しいことを確認します。

1. 左側のナビゲーションで、**ID プール**を選択します。

1. **[ID プールを作成]** を選択します。

1. ID プールを設定します。

   1. **ステップ 1: ID プールの信頼を設定する** - 以下のセクションを完了します。
      + **ユーザーアクセス** - **認証されたアクセス**を選択する
      + **認証された ID ソース** - **Amazon Cognito ユーザープール**を選択する

      **[次へ]** を選択してください。

   1. **ステップ 2: アクセス許可を設定する** - **認証されたロール**セクションで、次のフィールドに入力します。
      + **IAM ロール** - **新しい IAM ロールの作成**を選択します
      + **IAM ロール名** - 名前を入力し、後のステップで書き留めます。

      **[次へ]** を選択してください。

   1. **ステップ 3: ID プロバイダーを接続する** - **ユーザープールの詳細**セクションで、次のフィールドに入力します。
      + **ユーザープール ID** - 前に作成したユーザープールを選択します。
      + **アプリクライアント ID** - 前に作成したアプリクライアント ID を選択します。

      **[次へ]** を選択してください。

   1. **ステップ 4: プロパティを設定する** - **ID プール名**フィールドに名前を入力します。

      **[次へ]** を選択してください。

   1. **ステップ 5: 確認して作成する** - 各セクションの選択内容を確認し、**ID プールの作成**を選択します。

1. **ID プール**ページで、新しい ID プールを選択します。

   **ID プール ID** をコピーし、後で書き留めます。`awsconfiguration.json` ファイルでは、これは です`CredentialsProvider.CognitoIdentity.Default.PoolId`。

1. IAM ロールのアクセス許可を更新します。

   1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) で IAM コンソールを開きます。

   1. 左側のナビゲーションで、**ロール**を選択します。

   1. 上記で作成したロールを見つけて選択します。
**注記**  
必要に応じて検索バーを使用します。

   1. アタッチされたアクセス許可ポリシーを選択します。

      **[Edit]** (編集) を選択します。

   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 プールをセットアップするには」の手順から ID プール ID **を指定し、 AWS リージョン (例: ) を指定します**us-west-2**。

   `CognitoUserPool` ノードで、「前提条件」セクションの**「ユーザープールをセットアップするには**」からアプリクライアントシークレット、アプリクライアント ID、プール ID を指定し、 を指定します AWS リージョン (例: **us-west-2**)。 [https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-android.html#producersdk-android-prerequisites](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/producer-sdk-android.html#producersdk-android-prerequisites)

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` がネットワーク呼び出しを行うには、認証のために認証情報が必要です。`AWSCredentialsProvider` のインスタンスを渡します。これは、前のセクションで変更した `awsconfiguration.json` ファイルから Amazon Cognito 認証情報を読み込みます。

## 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)` 実装を提供します。このクラスは、デバイスのカメラの 1 つからデータを読み取ります。

次のコード例 (「`[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**] を選択します。[**OK**] を選択してください。

1. [**Run**]、[**Run**] を選択します。

1. [**Select a Deployment Target**] 画面で、接続されているデバイスを選択し、[**OK**] を選択します。

1. デバイスの [**AWSKinesisVideoDemoApp**] アプリケーションで、[**Create new account**] を選択します。

1. [**«1»USERNAME**]、[**Password**]、[**Given name**]、[**Email address**]、[**Phone number**] の値を入力し、[**Sign up**] を選択します。
**注記**  
これらの値には以下の制約があります。  
**パスワード:** 大文字と小文字、数字、特殊文字を含む必要があります。これらの制約は、[Amazon Cognito コンソール](https://console.aws.amazon.com/cognito/home)のユーザープールページで変更できます。
**E メールアドレス:** 確認コードを受け取れるように有効なアドレスでなければなりません。
**電話番号:** 次の形式にする必要があります。**\$1*<Country code>**<Number>*** (例: **\$112065551212**)。

1. E メールで受信したコードを入力し、**確認**を選択します。**[OK]** を選択します。

1. 次のページで、デフォルト値のままにし、**ストリーム**を選択します。

1. にサインイン AWS マネジメントコンソール し、米国西部 (オレゴン) リージョンで [Kinesis Video Streams コンソール](https://console.aws.amazon.com//kinesisvideo/home/)を開きます。

   [**Manage Streams**] ページで [**demo-stream**] を選択します。

1. 埋め込みプレーヤーでストリーミングビデオが再生されます。フレームが蓄積されビデオが表示されるまでに少し時間がかかることがあります (一般的な帯域幅やプロセッサの状態で最長 10 秒)。
**注記**  
デバイスの画面が回転された場合 (縦向きから横向きへなど)、アプリケーションはビデオのストリーミングを停止します。

このコード例は、ストリームを作成します。`MediaSource` としてコードが開始すると、カメラから `KinesisVideoClient` にフレームが送信を開始します。クライアントは、データを **[demo-stream]** (デモストリーム) という名前の 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.または 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 Producer, GStreamer Plugin and 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 引数 | タイプ | デフォルト | 説明 | 
| --- | --- | --- | --- | 
| `BUILD_DEPENDENCIES` |  ブール値  |  ON  | ソースから依存関係を構築します。それ以外の場合は、システムに既にインストールされている依存関係を使用します。必要な依存関係のいずれかが見つからない場合は、エラーが返されます。 | 
| `BUILD_GSTREAMER_PLUGIN` | ブール値 |  VOFF  | kvssink GStreamer プラグインを構築します。 | 
|  `BUILD_JNI`  | ブール値 |  VOFF  | Java ランタイム環境からこのコードを呼び出すことができるように Java ネイティブインターフェイス (JNI) を構築します。 | 
|  `ALIGNED_MEMORY_MODEL`  | ブール値 |  VOFF  | メモリ割り当てを 8 バイトの境界に合わせる必要がある場合。一部のアーキテクチャでは、整合性のないメモリアクセスが許可されません。 | 
| `CONSTRAINED_DEVICE` | ブール値 |  VOFF  | Windows 以外のみ。ON の場合、スレッドスタックのサイズを に設定します0.5 MiB。[Alpine Linux](https://wiki.alpinelinux.org/wiki/Main_Page) ビルドに必要です。それ以外の場合は、オペレーティングシステムのデフォルトが使用されます。 | 
|  `BUILD_STATIC`  | ブール値 |  VOFF  | [共有](https://en.wikipedia.org/wiki/Shared_library) (OFF)、または[静的](https://en.wikipedia.org/wiki/Static_library) (ON) としてライブラリと実行可能ファイルを構築します。 | 
|  `ADD_MUCLIBC`  | ブール値 |  VOFF  | 組み込みシステム用に設計された小さな C 標準ライブラリである標準 C ライブラリの代わりに [uClibc](https://en.wikipedia.org/wiki/UClibc) にリンクします。 | 
|  `OPEN_SRC_INSTALL_PREFIX`  |  String  | ../オープンソース/ローカル | ソースから構築する場合にオープンソースの依存関係をインストールする場所。 | 

**クロスコンパイルのフラグ**

**重要**  
ターゲットマシンとホストマシンの CPU アーキテクチャが異なる場合は、これらを設定します。


| CMake 引数 | タイプ | デフォルト | 説明 | 
| --- | --- | --- | --- | 
| `BUILD_LOG4CPLUS_HOST` |  String  |  ""  | 指定された CPU アーキテクチャのlog4cplus依存関係を構築します。設定されていない場合、 log4cplusはホストマシンの CPU アーキテクチャを自動検出して使用します。 | 
| `BUILD_OPENSSL_PLATFORM`  |  String  |  ""  | 指定された CPU アーキテクチャのOpenSSL依存関係を構築します。設定されていない場合、 OpenSSLはホストマシンの CPU アーキテクチャを自動検出して使用します。 | 

**テストに関連するフラグ**


| CMake 引数 | タイプ | デフォルト | 説明 | 
| --- | --- | --- | --- | 
| `BUILD_TEST` |  ブール値  |  VOFF  | ユニットテストと統合テストを構築します。すべてのテストを実行するには、ビルドディレクトリ./tst/producerTestから を実行します。 AWS テストを実行するには認証情報が必要です。 | 
| `CODE_COVERAGE` | ブール値 | VOFF | GNU/Clang コンパイラでのみ使用できます。[gcov](https://gcc.gnu.org/onlinedocs/gcc/Gcov.html) とレポート生成を使用してコードカバレッジ収集を有効にします。 | 
| `COMPILER_WARNINGS` | ブール値 | VOFF | GNU/Clang コンパイラでのみ使用できます。すべてのコンパイラ警告を有効にします。 | 
| `ADDRESS_SANITIZER` | ブール値 | VOFF | GNU/Clang コンパイラでのみ使用できます。[AddressSanitizer](https://compiler-rt.llvm.org/) を使用してビルドします。 | 
| `MEMORY_SANITIZER` | ブール値 | VOFF | GNU/Clang コンパイラでのみ使用できます。[MemorySanitizer](https://compiler-rt.llvm.org/) を使用してビルドします。 | 
| `THREAD_SANITIZER` | ブール値 | VOFF | GNU/Clang コンパイラでのみ使用できます。[ThreadSanitizer](https://compiler-rt.llvm.org/) を使用して構築します。 | 
| `UNDEFINED_BEHAVIOR_SANITIZER` | ブール値 | VOFF | 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 プロデューサーライブラリを使用する](producer-sdk-cpp.md)、C\$1\$1 テストハーネス (`tst/ProducerTestFixture.h` およびその他のファイル) のコードを調べます。このコードは前のセクションでダウンロードしたものです。

**プラットフォームに依存しない** C\$1\$1 例では、次のコーディングパターンを示します。
+ Kinesis Video Streams にアクセスするために、`KinesisVideoProducer` のインスタンスを作成します。
+ `KinesisVideoStream` のインスタンスを作成します。これにより、同じ名前のストリームがまだ存在しない AWS アカウント 場合、 に Kinesis ビデオストリームが作成されます。
+ データのフレームをストリームに送信する準備ができたら、そのたびに `putFrame` を `KinesisVideoStream` で呼び出します。

以下のセクションでは、このコーディングパターンについて詳しく説明します。



## KinesisVideoProducer のインスタンスを作成する
<a name="producersdk-cpp-write-create-producer"></a>

`KinesisVideoProducer::createSync` メソッドを呼び出して、`KinesisVideoProducer` オブジェクトを作成します。次の例では、`KinesisVideoProducer` を `ProducerTestFixture.h`ファイルに作成します。

```
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 つのストリーム
3 分の最大継続時間
各ストリームは 30 フレーム/秒 (FPS)
各フレームのサイズは 10,000 KB
このアプリケーションのコンテンツストアの要件は、**3 (ストリーム) x 3 (分) x 60 (1 分あたり秒) x 10,000 (kb) x 1.2 (デフラグメント許容量) = 194.4 Mb～200 Mb **です。
+ `ClientCallbackProvider` オブジェクト。クライアント固有のイベントを報告する関数ポインタを返します。
+ `StreamCallbackProvider` オブジェクト。ストリーム固有のイベントが発生したときにコールバックされる関数ポインタを返します。
+ 認証情報環境変数へのアクセス AWS を提供する `CredentialProvider` オブジェクト。
+ ( AWS リージョン 「us-west-2」）。サービスエンドポイントはリージョンから決定されます。

## KinesisVideoStream のインスタンスを作成する
<a name="producersdk-cpp-write-create-stream"></a>

`StreamDefinition` パラメータを指定して `KinesisVideoProducer::CreateStream` メソッドを呼び出すことで、`KinesisVideoStream` オブジェクトを作成します。この例では、トラックタイプをビデオ、トラック ID を 1 として、`ProducerTestFixture.h` ファイルで `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 マネジメントコンソールで表示することもできます。
+ 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` メソッドには、次のパラメータが必要です。
+ トラック ID (オーディオ用）。これは一意であり、ゼロ以外の値である必要があります。
+ ユーザー定義のトラック名 (オーディオトラックの「オーディオ」など）。
+ このトラックのコーデック ID (オーディオトラック「A\$1AAC」など）。
+ トラックタイプ (たとえば、オーディオには MKV\$1TRACK\$1INFO\$1TYPE\$1AUDIO の列挙値を使用します）。

オーディオトラック用のコーデックプライベートデータがある場合は、addTrack 関数を呼び出すときに、このデータを渡すことができます。KinesisVideoStream で start メソッドを呼び出し中に、KinesisVideoStream オブジェクトの作成後、コーデックプライベートデータを送信することもできます。

## Kinesis ビデオストリームにフレームを配置する
<a name="producersdk-cpp-write-putframe"></a>

`KinesisVideoStream::putFrame` を使用してメディアを Kinesis のビデオストリームに挿入し、ヘッダーとメディアデータを含む `Frame` オブジェクトに渡します。この例では、`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 の特定のトラックに KinesisVideoStream を配置する
<a name="producersdk-cpp-write-putframeintospecifictrack"></a>

`PutFrameHelper` クラスを使用して、フレームデータを特定のトラックに配置することができます。まず、 `getFrameDataBuffer`を呼び出して、`KinesisVideoFrame`データを埋めるために事前に割り当てられたバッファの 1 つへのポインタを取得します。次に、 `putFrameMultiTrack`を呼び出して をブール値`KinesisVideoFrame`とともに送信し、フレームデータのタイプを指定できます。ビデオデータの場合は true、フレームにオーディオデータが含まれている場合は false を使用します。この`putFrameMultiTrack`メソッドはキューイングメカニズムを使用して、MKV フラグメントが一定間隔で増加するフレームタイムスタンプを維持し、2 つのフラグメントが重複しないようにします。たとえば、フラグメントの最初のフレームの MKV タイムスタンプは、常に前のフラグメントの最後のフレームの MKV タイムスタンプより大きい必要があります。

`PutFrameHelper` には以下のフィールドがあります。
+ キュー内のオーディオフレームの最大数。
+ キュー内のビデオフレームの最大数。
+ 1 つのオーディオフレームに割り当てるサイズ。
+ 1 つのビデオフレームに割り当てるサイズ。

## アクセスメトリクスとメトリクスのログ記録
<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:** 1 秒あたりのフレーム数を、すべてのアクティブなストリームで集計した数。
+ **totalTransferRate:** すべてのストリームで送信される合計ビット数/秒 (bps)。

`getKinesisVideoStreamMetrics` によって入力される `PStreamMetrics` オブジェクトには、以下の情報が含まれています。
+ **currentViewDuration:** コンテンツビューの先頭 (フレームがエンコードされている場合) と現在の位置 (フレームデータが Kinesis Video Streams に送信される場合) の 100 ns 単位の差。
+ **overallViewDuration:** コンテンツビューの先頭 (フレームのエンコード時) と末尾 (コンテンツビューに割り当てられた合計容量を超過したこと、または Kinesis Video Streams から `PersistedAck` メッセージを受信し、既知の永続的なフレームがフラッシュされたことが原因で、フレームがメモリからフラッシュされた時点) の差異 (100 ns 単位)。
+ **currentViewSize:** コンテンツビューの先頭 (フレームがエンコードされた時点) から、現在の位置 (フレームデータが Kinesis Video Streams に送信される時点) までのサイズ (バイト単位)。
+ **overallViewSize:** コンテンツビューの合計サイズ (バイト単位)。
+ **currentFrameRate:** 最後に測定されたストリームのレート (fps 単位)。
+ **currentTransferRate:** 最後に測定されたストリームのレート (bps 単位)。

## Teardown:
<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>

のコードを実行して検証するには[C\$1\$1 プロデューサーライブラリを使用する](producer-sdk-cpp.md)、以下の OS 固有の手順を参照してください。
+ [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)

ストリームに関連付けられている、`PutMedia.IncomingBytes` などのメトリクスを Amazon CloudWatch コンソールで監視することで、ストリームのトラフィックをモニタリングすることができます。

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

C\$1\$1 プロデューサー SDK アプリケーションのログ記録は、 `kinesis-video-native-build`フォルダの `kvs_log_configuration` ファイルで設定します。

次の例は、デフォルト設定ファイルの最初の行を示しています。この行で、`DEBUG` レベルのログエントリを AWS マネジメントコンソールに書き込むようにアプリケーションを設定します。

```
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 プロデューサーライブラリは、プラットフォームに依存しないコードベース (PIC、Platform Independent Codebase) と呼ばれる共通コンポーネントに基づきます。このコードベースは、GitHub ([https://github.com/awslabs/amazon-kinesis-video-streams-pic/](https://github.com/awslabs/amazon-kinesis-video-streams-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.または 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 クローンを実行しなかった場合は、`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 プロデューサーライブラリを使用して、フォルダ `samples/h264SampleFrames` 内の H.264 エンコードされた動画フレームを Kinesis のビデオストリームに送信する方法を示します。

このサンプルアプリケーションは次の 3 つのセクションで構成されています。
+ 初期化と設定:
  + プラットフォーム固有のメディアパイプラインの初期化および設定。
  + パイプラインの KinesisVideoClient および KinesisVideoStream の初期化および設定、コールバックの設定、シナリオ固有の認証の統合、コーデックプライベートデータの抽出および送信、ストリームの準備完了状態。
+ メインループ:
  + タイムスタンプおよびフラグによるメディアパイプラインからのフレームの取得。
  + KinesisVideoStream へのフレームの送信。
+ Teardown:
  + 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 を呼び出して、デバイスのストレージに関する情報を含み、Kinesis Video Streams イベントに関する報告を行うためのコールバックを管理する `KinesisVideoClient` オブジェクトを作成します。

  ```
  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;
      }
  ```
+ Teardown:

  ```
  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. サンプルアプリケーション `kinesis_video_cproducer_video_only_sample` は、フォルダ `samples/h264SampleFrames` 内の H.264 でエンコードされた動画フレームを Kinesis Video Streams に送信します。次のコマンドは、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 デバイス
  + Board バージョン: 3 Model B 以降。
  + 接続された[カメラモジュール](https://www.raspberrypi.com/documentation/accessories/camera.html)または接続された USB カメラ (ウェブカメラ）。
  + 少なくとも 8 GB の容量がある SD カード。
  + Raspbian オペレーティングシステム (カーネルバージョン 4.9 以降) がインストールされている。最新の Raspberry Pi OS (以前の Raspbian) イメージは[、Raspberry Pi ウェブサイト](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 マネジメントコンソール し、[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) で IAM コンソールを開きます。

1. 左側のナビゲーションメニューで [**ユーザー**] を選択します。

1. 新規ユーザーを作成するには、[**ユーザーを追加**] を選択します。

1. ユーザーにわかりやすい [**ユーザー名**] を提供します (**kinesis-video-raspberry-pi-producer** など)。

1. [**アクセスの種類**] で、[**プログラムによるアクセス**] を選択します。

1. **[Next: Permissions]** (次のステップ: 許可) を選択します。

1. [**Set permissions for kinesis-video-raspberry-pi-producer** (kinesis-video-raspberry-pi-producer にアクセス許可を設定する)] で [**既存のポリシーを直接アタッチ**] を選択します。

1. [**Create policy**] (ポリシーの作成) を選択します。[**ポリシーの作成**] ページが新しいウェブブラウザタブで開きます。

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. [**Create policy**] (ポリシーの作成) を選択します。

1. ブラウザで [**ユーザーを追加**] タブに戻り、[**Refresh** (更新)] を選択します。

1. 検索ボックスに作成したポリシーの名前を入力します。

1. リストの作成した新しいポリシーの横のチェックボックスを選択します。

1. [**Next: Review**] を選択します。

1. [**Create user**] を選択します。

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"
   }
   ```

   `ssid` と `psk` 値を使用する Wi-Fi ネットワークの情報に置き換えます。

1. `wpa_supplicant.conf` ファイルを SD カードにコピーします。`boot` ボリュームのルートにコピーする必要があります。

1. Raspberry Pi に SD カードを挿入し、デバイスの電源を入れます。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. オープン `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`スタックが推奨されます。以下の手順に従って、 `libcamera`がシステムでup-to-dateであることを確認します。

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

   このコマンドは 1 つのブランチ ( `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 パイプラインは、640 x 480 ピクセルの解像度で 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/ja_jp/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 に GStreamer の 1.22 バージョンをダウンロードします。

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

   1. ディレクトリを gst-rtsp-server の examples ディレクトリに変更します。

      ```
      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 ストリームを検証するもう 1 つの方法は、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 を使用して RTSP フィードを Kinesis Video Stream に送信するには**

   この GStreamer パイプラインは`rtspsrc`、 を使用して RTSP サーバーに接続し、RTP ビデオストリームを取得します。フレームを に渡します。これにより`rtph264depay`、RTP パケットから H.264 でエンコードされたビデオフレームが抽出されます。 は、ビデオフレームを 形式で`h264parse`グループ化`kvssink`します。 `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>

起動直後に Bus エラーが発生した場合 `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 を使用するには、 をコンパイル`ON`するときに `ALIGNED_MEMORY_MODEL` CMake フラグを明示的に に設定する必要があります。これは`kvssink`、デフォルトが であるためです`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)を参照してください。

**解決策:**

調整オプション`x264enc`を使用して `zerolatency` を設定します。これにより、リアルタイムのシナリオに合わせて を最適化することでエンコーディングのレイテンシーが大幅に短縮され、フレームの処理と出力がより迅速になります。

設定例:

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

などのデバイスには、一度に 1 つのプロセス`/dev/video0`でのみアクセスできます。複数のプロセスが同時にアクセスしようとすると、2 番目のプロセスが最初のプロセスが完了するまで待機します。

**解決策:**

ループバックデバイスを作成し、複数のプロセスが同時にループバックインターフェイスを使用できるようにします。詳細については、[「Stack Exchange](https://raspberrypi.stackexchange.com/questions/19630/take-picam-image-while-motion-is-running/19897#19897)」を参照してください。

### 内部データストリームエラー
<a name="rpi-troubleshoot-internal-error"></a>

GStreamer パイプラインを作成するときは、ある要素のソースパッドを別の要素のシンクパッドにリンクして要素を接続します。このリンクプロセスにより、ソース要素からシンク要素へのデータフローが可能になり、データパイプラインが形成されます。

ログのエラーメッセージ「パッドリンクが失敗した」は、パイプライン内の 2 つの要素のパッド間の接続 (リンク) を確立しようとしたときに GStreamer で問題が発生したことを示します。

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

**解決策:**

どの要素が相互にリンクできないかを判断します。パイプラインの範囲を絞り込むには、パイプラインから要素を削除します。右端の要素を に置き換え`fakesink`、要素を一度に 1 つずつ削除します。

場合によっては、[capsfilter](https://gstreamer.freedesktop.org/documentation/coreelements/capsfilter.html?gi-language=c) 要素を調整したり、パイプラインが使用する要素を変更したりする必要があります。

一般的なケースは、カメラがサポートしていない `resolution` `framerate`または を要求することです。ターミナル`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 から送信された動画ストリームがコンソールに表示されます。

**注記**  
ビデオがコンソールに表示されるまでに数秒かかる場合があります。

ストリームが再生されたら、コンソールで次の機能を試すことができます。
+ [**ビデオのプレビュー**] セクションから、ナビゲーションコントロールを使用しストリームの巻き戻しまたは早送りを行います。
+ **ストリーム情報**セクションで、ストリームのコーデック、解像度、ビットレートを確認します。このチュートリアルでは、帯域幅の使用を最小限に抑えるために、Raspberry Pi の解像度とビットレートの値は意図的に低く設定されています。

  ストリーム用に作成されている Amazon CloudWatch メトリクスを表示するには、**CloudWatch でストリームメトリクスを表示する**」を選択します。
+ [**データ保持期間**] で、ビデオストリームが 1 日間保持されることに注目します。この値を編集して [**No data retention** (データを保持しない)] 設定、あるいは 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～2 分待ってから、右矢印を使用します。メディアが表示されない場合は、ストリームが正しいリージョンに送信されていることを確認し、ストリーム名のスペルを確認します。この情報は ログで確認できます。

kvssink が使用するリージョンを決定する方法[にリージョンを指定する `kvssink`](examples-gstreamer-plugin-parameters.md#kvssink-region)の詳細については、「」を参照してください。

### メディアが にロードされるまでに時間がかかる AWS マネジメントコンソール
<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 でフレームレートが 15 fps のストリームの場合: 

  フラグメントの長さ = 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 パイプラインで、 `kvssink`を `autovideosink` または `matroskamux`と に置き換えます`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 出力のみをサポートしている場合は、 `jpegparse`および `jpegdec`要素を使用してメディアを変換してから、 を使用して H.264 にエンコードする必要があります`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
```

システムのアーキテクチャを確認します。
+ カーネルビットネスの確認: run `uname -m`
+ ユーザースペースのビットネスを確認する: run `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`。ホストマシンのオペレーティングシステムがターゲットマシンのオペレーティングシステムと一致しない場合、シンボリックリンクが壊れる可能性があります。例えば、MacBook for a Raspberry Pi でのクロスコンパイルなどです。

もう 1 つの考えられる原因は、構築されたバイナリが間違ったアーキテクチャ用であったことです。たとえば、バイナリが 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`た には、ターゲットを指す矢印はありません。

**解決策:**

シンボリックリンクを修正するには、次の 2 つのオプションがあります。
+ **推奨:** `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)
+ [View ライブラリによって返されるエラーコードとステータスコード](#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～100 のパーセンテージで表します。 | 
| 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 | DescribeStream API エラー。 | DescribeStream API 再試行エラーのあとにこのエラーが返されます。PIC クライアントは、再試行を停止した後にこのエラーを返します。 | 
| 0x52000012 | STATUS\$1INVALID\$1DESCRIBE\$1STREAM\$1RESPONSE | 無効な DescribeStreamResponse 構造体。 | DescribeStreamResultEvent に渡された構造体が 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 | 無効な auth info の長さ。 | [プロデューサー 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 | コンテンツストアがメモリ不足です。 | コンテンツストアはストリーム間で共有され、全ストリーム \$1 \$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 Reference」を参照してください。 | 
| 0x52000033 | STATUS\$1SERVICE\$1CALL\$1CLIENT\$1LIMIT\$1ERROR | クライアント制限。 | サービスから返されます。詳細については、「Kinesis Video Streams API Reference」を参照してください。 | 
| 0x52000034 | STATUS\$1SERVICE\$1CALL\$1DEVICE\$1LIMIT\$1ERROR | デバイス制限。 | サービスから返されます。詳細については、「Kinesis Video Streams API Reference」を参照してください。 | 
| 0x52000035 | STATUS\$1SERVICE\$1CALL\$1STREAM\$1LIMIT\$1ERROR | ストリーム制限。 | サービスから返されます。詳細については、「Kinesis Video Streams API Reference」を参照してください。 | 
| 0x52000036 | STATUS\$1SERVICE\$1CALL\$1RESOURCE\$1DELETED\$1ERROR | リソースが削除された、あるいは削除中です。 | サービスから返されます。詳細については、「Kinesis Video Streams API Reference」を参照してください。 | 
| 0x52000037 | STATUS\$1SERVICE\$1CALL\$1TIMEOUT\$1ERROR | サービス呼び出しがタイムアウトしました。 | 特定のサービス API の呼び出しがタイムアウトの結果となりました。有効なネットワーク接続があることを確認します。PIC はオペレーションを自動的に再試行します。 | 
| 0x52000038 | STATUS\$1STREAM\$1READY\$1CALLBACK\$1FAILED | ストリームの準備完了通知。 | 非同期ストリームが作成されたことを示す通知が PIC からクライアントに送信されます。 | 
| 0x52000039 | STATUS\$1DEVICE\$1TAGS\$1COUNT\$1NON\$1ZERO\$1TAGS\$1NULL | 無効なタグが指定されています。 | タグ数はゼロではありませんが、タグは空です。タグが指定されているか、カウントがゼロであることを確認します。 | 
| 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 | TagResourceAPI は失敗しました。 | 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 | READY 状態のプロデューサークライアントの取得に失敗しました。 | PIC が READY 状態に移行することに失敗すると、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) インジケータです。 | GetStreamDataAPI 呼び出しで、現在のアップロード処理セッションは終了したことを示します。これは、セッションが終了あるいはエラーが発生した、あるいはセッショントークンが期限切れとなり、セッションが更新されている場合に発生します。 | 
| 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 | プロデューサーの初期化が READY 状態に到達できませんでした。 | プロデューサークライアントの初期化中に、READY 状態に到達できませんでした。詳細については、ログを参照してください。 | 
| 0x52000056 | STATUS\$1STATE\$1MACHINE\$1STATE\$1NOT\$1FOUND | 内部ステートマシンエラー。 | 公に表示されるエラーではありません。 | 
| 0x52000057 | STATUS\$1INVALID\$1FRAGMENT\$1ACK\$1TYPE | FragmentAck 構造で無効な ACK タイプが指定されています。 | 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)」で定義されています。このエラーは、1 秒間のフレームが非常に低い場合、または管理可能な時間のフラグメントを作成するキーフレームが存在しないことを示します。エンコーダーの設定を確認し、キーフレームが定期的に正しく生成されていることを確認します。 | 
| 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/](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/](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/](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/](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/](https://docs.aws.amazon.com/kms/latest/APIReference/)」を参照してください。 | 
| 0x5200006c | STATUS\$1ACK\$1ERR\$1STREAM\$1DELETED | ストリームが削除された、または削除中です。 | ストリームが別のアプリケーションまたは AWS マネジメントコンソールで削除されています。 | 
| 0x5200006d | STATUS\$1ACK\$1ERR\$1ACK\$1INTERNAL\$1ERROR | Internal error。 | 一般的サービス内部エラー。 | 
| 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 Video クライアントにフレームを送信できませんでした」](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 (拡張可能なバイナリメタ言語) 形式で表記するには大きすぎる数字をエンコードしようとしています。これは、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 順応フラグが指定され、コードに 3 つ以上のゼロがある無効な開始シーケンスが発生した場合などです。有効な Annex-B 形式には、バイトストリームの 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ました。いずれか 1 つを指定、あるいは指定なしにします。 | 
| 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) のネットワーク抽象化レイヤーユニット (NALU) 数が無効です。 | 
| 0x32000018  | STATUS\$1MKV\$1INVALID\$1HEVC\$1FORMAT  | HEVC の形式が無効です。 | 
| 0x32000019  | STATUS\$1MKV\$1HEVC\$1SPS\$1NALU\$1MISSING  | シーケンスパラメータセット (SPS) に 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   | 無効なタグ名の長さ。有効な値はゼロより大きく、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 セグメント 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 | 

### View ライブラリによって返されるエラーコードとステータスコード
<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 構造でより短いフレーム時間を設定します。たとえば、ストリームが 25 FPS の場合、各フレームの再生時間は 40 ミリ秒です。ただし、エンコーダーの「ジッター」を処理するには、そのフレーム期間の半分 (20 ミリ秒) を使用することをお勧めします。一部のストリームでは、エラーを検出するためにより正確な時間制御が必要となります。 | 
| 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 エラーは「ホスト名を解決できませんでした」です。デバイスのインターネット接続を確認してください。 もう 1 つの一般的なエラーは、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～10,000 ではありません。  |  この関数に渡される URL を確認します。  | 
| 0x16000005 | STATUS\$1TIMESTAMP\$1STRING\$1UNRECOGNIZED\$1FORMAT |  IoT 認証情報の取得による JSON の「有効期限」項目は、 の形式ではありません`YYYY-MM-DDTHH:mm:SSZ`。  |   AWS ヘルスダッシュボードを確認して、後でもう一度試してください。  | 

# Network Abstraction Layer (NAL) 適応フラグを参照
<a name="producer-reference-nal"></a>

このセクションでは、`StreamInfo.NalAdaptationFlags`列挙に利用可能なフラグに関する情報が含まれています。

アプリケーションの[エレメンタリーストリーム](https://en.wikipedia.org/wiki/Elementary_stream)は、**Annex-B** または **AVCC** 形式のいずれかにすることができます。
+ **Annex-B** 形式は、2 バイトのゼロで [NALU (Network Abstraction Layer Units)](https://en.wikipedia.org/wiki/Network_Abstraction_Layer#NAL_units) を区切り、その後に 1 バイトまたは 3 バイトのゼロと数値 *1* が続きます (**開始コード**と呼ばれる、00000001 など)。
+ **AVCC** 形式はまた、NALU をラップしますが、各 NALU の前に NALU のサイズを示す値 (通常は 4 バイト) があります。

多くのエンコーダーは Annex-B ビットストリーム形式を作成します。一部の上位ビットストリームプロセッサ ( の再生エンジンや [Media Source Extensions (MSE)](https://en.wikipedia.org/wiki/Media_Source_Extensions) プレイヤーなど AWS マネジメントコンソール) は、フレームに AVCC 形式を使用します。

H.264 コーデックの SPS/PPS (シーケンスパラメータセット/ピクチャパラメータセット) であるコーデックプライベートデータ (CPD) は、Annex-B または AVCC 形式にすることもできます。ただし、CPD の場合、形式は前に説明したものとは異なります。

フラグは、次のように、SDK に指示し、フレームデータと CPD の NALU を AVCC または Annex-B に適応させるよう にします。


****  

| フラグ | 適応 | 
| --- | --- | 
| 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 3984** の、[セクション 1.3: ネットワーク抽象化レイヤーユニットタイプ](https://www.ietf.org/rfc/rfc3984.txt)を参照してください。

# プロデューサー SDK 構造
<a name="producer-reference-structures-producer"></a>

このセクションでは、データを Kinesis Video Streams Producer オブジェクトに提供するために使用できる構造について説明します。

**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
```

次の例では、デバイスに音声ストリームとビデオストリームがあります。音声ストリームには 1 秒あたり 512 サンプルがあり、各サンプルは平均 100 バイトです。ビデオストリームには 1 秒あたり 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** – 事前に割り当てるストレージサイズをバイト単位で指定します。最小の割り当ては 10 MB です。最大の割り当ては 10 GB です。(今後ファイルに格納されるコンテンツストアの実装に伴って変更される予定です。)
+ **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` オブジェクトは、プラットフォームに依存しないコードの `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 時間) | 
| [タグ] | 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> | ストリームの最大レイテンシー (ミリ秒)。この時間をバッファ期間が超えると、ストリームのレイテンシープレッシャーコールバック (指定されている場合) が呼び出されます。0 を指定すると、ストリームのレイテンシープレッシャーコールバックは呼び出されません。 | milliseconds::zero() | 
| fragment\$1duration | duration<uint64\$1t>  | フラグメントの有効期間 (秒単位)。この値は、key\$1frame\$1fragmentation 値と組み合わせて使用します。この値が false の場合、この継続期間が経過すると、Kinesis Video Streams はキーフレームでフラグメントを生成します。たとえば、Advanced Audio Coding (AAC) オーディオストリームは各フレームをキーフレームとして使用します。key\$1frame\$1fragmentation = false を指定すると、この継続期間の経過後に、2 秒のフラグメントが生じます。 | 2 | 
| timecode\$1scale | duration<uint64\$1t, milli>  | MKV タイムコードスケール (ミリ秒単位)。MKV クラスター内でフレームのタイムコードの詳細度を指定します。MKV フレームのタイムコードは、常にクラスターの開始を基準にします。MKV では、符号付きの 16 ビット値 (0 〜 32767) を使用してクラスター内のタイムコード (フラグメント) を示します。フレームタイムコードが指定されたタイムコードスケールで表現できることを確認します。タイムコードスケール値のデフォルトである 1 ミリ秒の場合、表現できるフレームの最大値は 32,767 ミリ秒 \$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 に小さな影響が生じます。電力やフットプリントが極端に低いデバイスでは、これを false に設定して、CPU サイクルの消費を抑える必要があります。それ以外の場合は、この値falseに を使用することはお勧めしません。 | true | 
| nal\$1adaptation\$1flags | uint32\$1t  |  Network Abstraction Layer unit (NALU) 適応フラグを指定します。ビットストリームが H.264 でエンコードされている場合、NALU で未加工またはパッケージとして処理できます。これは Annex-B 形式または AVCC 形式のいずれかになります。ほとんどの基本ストリームプロデューサーとコンシューマー (読み取りエンコーダーとデコーダー) は、エラー復旧などの利点があるため、Annex-B 形式を使用します。高レベルのシステムでは AVCC 形式を使用します。これは、MPEG、HLS、DASH などのデフォルト形式です。コンソールの再生では、ブラウザの MSE (Media Source Extensions) を使用して、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 を含む必要があります) を探し、2 つの NALUs ( ) を抽出`Ab(Sps)Ab(Pps)`して、 の CPD に設定します`StreamDefinition`。 詳細については、「[Network Abstraction Layer (NAL) 適応フラグを参照](producer-reference-nal.md)」を参照してください。  | デフォルトでは、フレームデータとコーデックプライベートデータの両方で 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 トラックのコーデック 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 | 現在割り当てられているサイズ。割り当て済みのサイズ \$1 使用可能なサイズは、内部のブックキーピングとコンテンツストアの実装のため、ストレージ全体のサイズよりわずかに小さくなります。 | 
| 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、ストリームレイテンシーコールバックが指定されている場合、そのコールバックが呼び出されます。時間は 100ns 単位で指定します。これは PIC レイヤーのデフォルトの時間単位です。 | 
| overallViewDuration | UINT64 | 全体の表示時間。ストリームに ACK や永続化が設定されていない場合、この値は Kinesis のビデオストリームに挿入されるフレームが増えるに従って増加し、StreamDefinition に指定された buffer\$1duration と等しくなります。ACKs が有効で、永続 ACK が受信されると、バッファは次のキーフレームにトリミングされます。これは、ACK タイムスタンプがフラグメント全体の先頭を示すためです。時間は 100 ns 単位で指定します。これは PIC レイヤーのデフォルトの時間単位です。 | 
| currentViewSize | UINT64 | 現在のバッファのサイズ (バイト単位)。 | 
| overallViewSize | UINT64 | 全体の表示サイズ (バイト単位)。 | 
| currentFrameRate | UINT64 | 現在のストリームで確認されたフレームレート。 | 
| currentTransferRate | UINT64 | すべてのストリームで確認された転送レート (バイト/秒)。 | 

# プロデューサー SDK コールバック
<a name="producer-reference-callbacks"></a>

Amazon Kinesis Video Streams プロデューサー SDK のクラスとメソッドは、独自のプロセスを維持しません。その代わり、受信した関数呼び出しとイベントを使用してコールバックをスケジュールし、アプリケーションと通信します。

アプリケーションが SDK とやり取りするために使用できるコールバックパターンは 2 つあります。
+ `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/ja_jp/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` – ストレージのオーバーフローまたはプレッシャーを報告します。このコールバックは、ストレージの使用率が以下の `STORAGE_PRESSURE_NOTIFICATION_THRESHOLD` 値 (ストレージ全体のサイズの 5 パーセント) に下がると呼び出されます。詳細については、「[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(...);
```


**Events**  

| 関数 | 説明 | タイプ | 
| --- | --- | --- | 
| 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 | ストレージの使用率が STORAGE\$1PRESSURE\$1NOTIFICATION\$1THRESHOLD 値 (ストレージ全体のサイズの 5 パーセントとして定義) に下がると呼び出されます。 | 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 プロデューサー 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)。

メタデータをストリーム内のフラグメントを埋め込むモードは 2 つあります。
+ **非永続的** – 発生したビジネス固有の基準に基づいて、ストリーム内のフラグメントに 1 回限り、またはアドホックベースでメタデータをアタッチできます。一例として、動きを検出して、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 は非永続メタデータの場合と同じ方法でメタデータキュー内のメタデータ項目を収集します。ただし、メタデータ項目は、次のフラグメントの先頭に追加されてもキューから削除されません。

`putKinesisVideoFragmentMetadata` または `putFragmentMetadata` で `persistent` を `true` に設定して呼び出すと、以下のような動作になります。
+ 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 を使用するようにアプリケーションを設定できます。

## AWS SDK for IPv6 を設定する
<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 コールに Producer-C SDK 1.6.0 を使用します。

### GStreamer プラグインを設定する
<a name="configure-gstreamer-plugin"></a>

GStreamer プラグインは基盤となる C プロデューサー SDK を使用するため、前述のように C SDK for IPv6 を設定するとIPv6 設定が自動的に処理されます。

コードの変更は必須ではありません。CMake パラメータを使用して SDK を構築するか、前のセクションで説明したように適切な環境変数を設定します。

### データプレーンエンドポイントの解決
<a name="data-plane-endpoint-resolution"></a>

データプレーンオペレーションでは、 `GetDataEndpoint` API を使用して適切なデュアルスタックのデータプレーンエンドポイントを取得します。サービスは、リクエスト URL に応じて対応するエンドポイントを返します。

例:
+ API `GetDataEndpoint`リクエストが で終わるレガシーエンドポイントに対して行われた場合`.amazonaws.com`、Kinesis Video Streams は で終わるレガシーデータプレーンエンドポイントを返します`.amazonaws.com`。
+ API `GetDataEndpoint`リクエストが で終わるデュアルスタックエンドポイントに対して行われた場合`.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>

KVS Producer-C SDK を IPV6-onlyモードで構築し、環境変数設定を無視するには、次のコマンドを使用して 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 アプリケーションを本番環境にデプロイする前に:
+ コントロールプレーンオペレーションのテスト (ストリームの作成、削除、一覧表示)
+ データプレーンオペレーションの検証 (ビデオの取り込みと消費)
+ ネットワーク環境でのパフォーマンスと接続を検証する
+ Canary テストを実行して、一貫した 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): アプリケーションログのシステムプロパティを確認する