ステップ 2: コードを記述して調べる - Amazon Kinesis Video Streams

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

ステップ 2: コードを記述して調べる

C++ プロデューサーライブラリ手順のこのセクションでは、C++ テストハーネス (tst/ProducerTestFixture.h および他のファイル) でコードを検証します。このコードは前のセクションでダウンロードしたものです。

プラットフォームに依存しない C++ 例では、次のコーディングパターンを示します。

  • Kinesis Video Streams にアクセスするために、KinesisVideoProducer のインスタンスを作成します。

  • KinesisVideoStream のインスタンスを作成します。これにより、 AWS アカウント 同じ名前のストリームがまだ存在しない場合は、Kinesis ビデオストリームが作成されます。

  • データのフレームをストリームに送信する準備ができたら、そのたびに putFrameKinesisVideoStream で呼び出します。

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

のインスタンスを作成する KinesisVideoProducer

KinesisVideoProducer::createSync メソッドを呼び出して、KinesisVideoProducer オブジェクトを作成します。次の例では、KinesisVideoProducerProducerTestFixture.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 (オーディオ用 1 つのトラック 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 このクラスを使用して、フレームデータを特定のトラックに入れることができます。まず Buffer を呼び出して、 getFrameData事前に割り当てられたバッファーの 1 つへのポインターを取得してデータを埋めます。 KinesisVideoFrame 次に、 putFrameMulti Track を呼び出して、フレームデータのタイプを示す Boolean 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: すべてのストリームで送信されている 1 秒あたりの合計ビット数 (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);

次のステップ

ステップ 3: コードを実行して検証する