

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

# コードを記述して調べる
<a name="producersdk-cpp-write"></a>

のこのセクションでは[C\+\+ プロデューサーライブラリを使用する](producer-sdk-cpp.md)、C\+\+ テストハーネス (`tst/ProducerTestFixture.h` およびその他のファイル) のコードを調べます。このコードは前のセクションでダウンロードしたものです。

**プラットフォームに依存しない** C\+\+ 例では、次のコーディングパターンを示します。
+ 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\_AAC」など）。
+ トラックタイプ (たとえば、オーディオには MKV\_TRACK\_INFO\_TYPE\_AUDIO の列挙値を使用します）。

オーディオトラック用のコーデックプライベートデータがある場合は、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\+\+ プロデューサーの例では、テストデータのバッファを送信します。実際のアプリケーションでは、フレームバッファとフレームのサイズはメディアソース (カメラなど) のフレームデータから取得してください。

`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\+\+ プロデューサー 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);            
```