

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

# 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` などのメトリクスを監視することで、ストリームのトラフィックをモニタリングすることもできます。

**注記**  
テストハーネスでは空のバイトのフレームのみを送信するため、コンソールにはビデオストリームとしてのデータは表示されません。