

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

# コードを記述して調べる
<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));
  ```