翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
ステップ 2: コードを記述し、コードを実行する
C++ プロデューサーライブラリ手順のこのセクションでは、C++ テストハーネス (tst/ProducerTestFixture.h
および他のファイル) でコードを検証します。このコードは前のセクションでダウンロードしたものです。
プラットフォームに依存しない C++ 例では、次のコーディングパターンを示します。
-
Kinesis Video Streams にアクセスするために、
KinesisVideoProducer
のインスタンスを作成します。 -
KinesisVideoStream
のインスタンスを作成します。これにより、AWS アカウント同じ名前のストリームが、Kinesis のビデオストリームが作成されます。 -
データのフレームをストリームに送信する準備ができたら、そのたびに
putFrame
をKinesisVideoStream
で呼び出します。
以下のセクションでは、このコーディングパターンに関する詳細を示します。
のインスタンスの作成 KinesisVideoProducer
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 (ストリーム) * 3 (分) * 60 (1 分あたりの秒) * 10000 (kb) * 1.2 (デフラグ許容量) = 194.4 Mb ~ 200 Mb です。
-
-
ClientCallbackProvider
オブジェクト。クライアント固有のイベントを報告する関数ポインタを返します。 -
StreamCallbackProvider
オブジェクト。ストリーム固有のイベントが発生したときにコールバックされる関数ポインタを返します。 -
CredentialProvider
AWS認証情報環境変数へのアクセスを提供するオブジェクト。 -
AWS リージョン(「us-west-2」)。サービスエンドポイントはリージョンから決定されます。
のインスタンスの作成 KinesisVideoStream
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 Management Console で表示することもできます。
-
ストリーム用 AWS KMS 暗号化キー。詳細については、「Using Server-Side Encryption with Kinesis Video Streams」を参照してください。
-
ストリーミングタイプ。現在、有効な値は
STREAMING_TYPE_REALTIME
のみです。 -
メディアコンテンツタイプ。
-
メディアレイテンシー。この値は現在使用されていないため、0 に設定する必要があります。
-
各フラグメントの再生時間。
-
メディアのタイムコードスケール。
-
メディアがキーフレームを使用して断片化するかどうか。
-
メディアがタイムコードを使用するかどうか。
-
メディアが絶対フラグメントタイムを使用するかどうか。
Kinesis のビデオストリームへのオーディオトラックの追加
以下の addTrack メソッドを使用して、オーディオトラックの詳細をビデオトラックストリーム定義に追加できます。StreamDefinition
stream_definition->addTrack(DEFAULT_AUDIO_TRACKID, DEFAULT_AUDIO_TRACK_NAME, DEFAULT_AUDIO_CODEC_ID, MKV_TRACK_INFO_TYPE_AUDIO);
addTrack メソッドでは、以下のパラメータが必要です。
-
トラック ID (オーディオ用のもの)。これは一意であり、ゼロ以外の値である必要があります。
-
ユーザー定義のトラック名 (たとえば、オーディオトラックの「audio」)。
-
このトラックのコーデック ID (たとえば、オーディオトラック「A_AAC」)。
-
トラックタイプ (たとえば、オーディオには MKV_TRACK_INFO_TYPE_AUDIO という列挙値を使用してください)。
オーディオトラック用のコーデックプライベートデータがある場合は、addTrack 関数を呼び出すときに、このデータを渡すことができます。で start KinesisVideoStream メソッドを呼び出しているときにオブジェクトを作成した後に、コーデックのプライベートデータを送信することもできます。KinesisVideoStream
Kinesis のビデオストリームにフレームを埋め込む
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 Data Model」を参照してください。
を特定のトラックに入れるには KinesisVideoFrame KinesisVideoStream
PutFrameHelperこのクラスを使用して、フレームデータを特定のトラックに入れることができます。まず、getFrameData Buffer を呼び出して、事前に割り当てられたバッファの 1 つへのポインタを取得してデータを入力します。KinesisVideoFrame次に、putFrameMultiトラックを呼び出して、KinesisVideoFrameフレームデータのタイプを示すブール値とともにを送信できます。ビデオデータの場合は true、フレームにオーディオデータが含まれている場合は false を使用します。putFrameMultiTrackメソッドはキューイングメカニズムを使用して、MKVフラグメントのフレームタイムスタンプが単調に増加し、2つのフラグメントが重複しないようにします。たとえば、フラグメントの最初のフレームのMKVタイムスタンプは、前のフラグメントの最後のフレームのMKVタイムスタンプよりも常に大きくなければなりません。
PutFrameHelper には以下のフィールドがあります。
-
キュー内のオーディオフレームの最大数。
-
キュー内のビデオフレームの最大数。
-
1 つのオーディオフレームに割り当てるサイズ。
-
1 つのビデオフレームに割り当てるサイズ。
メトリクスとメトリクスログ記録
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: コンテンツストア (ストリーミングデータの保存に使用されるメモリ) の全体のサイズ (バイト単位)。
-
contentStoreAvailableサイズ:コンテンツストアで使用可能なメモリ (バイト単位)。
-
contentStoreAllocatedサイズ:コンテンツストアに割り当てられたメモリ。
-
totalContentViewsサイズ:コンテンツビューに使用されたメモリの合計です。コンテンツビューは、コンテンツストア内の情報の一連のインデックスです。
-
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: 最後に測定されたストリームのレート(1 秒あたりのフレーム数)。
-
currentTransferRate: 最後に測定されたストリームのレート (1 秒あたりのバイト数)。
Teardown:
バッファ内の残りのバイトを送信し、ACK
を待機する場合、stopSync
を使用できます。
kinesis_video_stream->stopSync();
または、stop
を呼び出してストリーミングを終了できます。
kinesis_video_stream->stop();
ストリームを停止したら、次の API を呼び出すことでストリームを解放できます。
kinesis_video_producer_->freeStream(kinesis_video_stream);