自動リアルタイムイメージ生成 - Amazon Kinesis Video Streams

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

自動リアルタイムイメージ生成

Amazon Kinesis Video Streams は、イメージをトランスコードして配信する機能を提供します。Kinesis Video Streams は、動画データからリアルタイムで画像を自動的に抽出し、指定した Amazon S3 バケットに画像を配信します。リアルタイムの自動画像抽出を実装するには、次のステップを実行します。

  • 生成されたイメージを受け取る S3 バケットを作成します。

  • ImageGenerationConfiguration ストリームプロパティを設定して、イメージの作成方法と送信先を Kinesis Video Streams に指示します。

  • イメージ生成タグの追加 – Kinesis Video Streams は、イメージ生成タグを持つフラグメントのみを使用してイメージを生成します。これらのタグは、Kinesis Video Streams プロデューサー SDK と putKinesisVideoEventMetadataメソッドを使用してビデオをアップロードするときに追加されます。

次の手順では、これらの各ステップを実行する手順を示します。

カスタマーマネージドキーを使用している場合は、PutMedia呼び出しを実行するロール (アップローダー) に、データの暗号化と復号、および Amazon S3 バケットへのアクセスに必要な次のアクセス許可があることを確認します。

  • kms:Encrypt

  • kms:GenerateDataKey

  • kms:Decrypt

  • s3:PutObject

詳細については、「サーバー側の暗号化の使用開始方法」を参照してください。

生成されたイメージの送信先を設定するには
  1. イメージが送信される S3 送信先バケットを作成します。

    Amazon S3 ユーザーガイドに従って Amazon S3 バケットを作成します。

    バケットの URI を書き留めます。これは、ストリームのイメージ生成設定を更新する次のステップで必要になります。

  2. AWS CLI がインストールされ、設定されていることを確認します。詳細については、AWS Command Line Interface 「 バージョン 2 ユーザーガイド」を参照してください。

  3. 次のコンテンツを入力として という名前update-image-generation-input.jsonの新しいファイルを作成します。プレースホルダー値を、使用する値で更新します。サポートされる最大値と最小値については、UpdateImageGenerationConfiguration API を参照してください。

    { "StreamName": "demo-stream", "ImageGenerationConfiguration": { "Status": "ENABLED", "DestinationConfig": { "DestinationRegion": "us-east-1", "Uri": "s3://my-bucket-name" }, "SamplingInterval": 200, "ImageSelectorType": "PRODUCER_TIMESTAMP", "Format": "JPEG", "FormatConfig": { "JPEGQuality": "80" }, "WidthPixels": 320, "HeightPixels": 240 } }
  4. 次のコマンドに示すように、UpdateImageGenerationConfigurationAPI を使用してストリームのイメージ生成設定を更新し、JSON ファイルを入力としてアタッチします。ファイルパスは、現在のディレクトリの ファイルを指すことに注意してください。

    aws kinesisvideo update-image-generation-configuration \ --cli-input-json file://./update-image-generation-input.json
  5. 成功すると、空のレスポンスが返され、ターミナルに何も出力されません。

    注記

    イメージ生成設定を更新してからイメージ生成ワークフローを開始するには、少なくとも 1 分かかります。少なくとも 1 分待ってから、ビデオをストリームにアップロードします。

  6. 設定を確認します。 AWS CLI を使用して、ストリームの DescribeImageGenerationConfiguration API を呼び出します。

    aws kinesisvideo describe-image-generation-configuration \ --stream-name "demo-stream"

Kinesis Video Streams は、イメージ生成タグを持つフラグメントのイメージのみを生成して配信します。Amazon S3 イメージ生成タグとともに提供される追加のフラグメントメタデータは、Amazon S3 メタデータとして保存されます。

注記

イメージ生成タグは、ストリームレベルのタグではなく、フラグメントメタデータタグを指します。

重要

イメージ生成タグは、フラグメントメタデータタグの制限にカウントされます。詳細については、「ストリーミングメタデータサービスクォータ」を参照してください。

以下は、 mkvinfoユーティリティを使用したフラグメントメタデータタグ構造の例です。イメージ生成タグは、キーが で値AWS_KINESISVIDEO_IMAGE_GENERATIONのない MKV シンプルタグです。詳細については、Matroska ドキュメントの「ビデオタグの例」を参照してください。

|+ Tags | + Tag | // MANDATORY: Predefined MKV tag to trigger image generation for the fragment | + Simple | + Name: AWS_KINESISVIDEO_IMAGE_GENERATION | // OPTIONAL: S3 prefix which will be set as prefix for generated image. | + Simple | + Name: AWS_KINESISVIDEO_IMAGE_PREFIX | + String: image_prefix_in_s3 // 256 bytes max | // OPTIONAL: Key value pairs that will be persisted as S3 Image object metadata. | + Simple | + Name: CUSTOM_KEY_1 // Max 128 bytes | + String: CUSTOM_VALUE_1 // Max 256 bytes | + Simple | + Name: CUSTOM_KEY_2 // Max 128 bytes | + String: CUSTOM_VALUE_2 // Max 256 bytes

フラグメントへのイメージ生成タグの追加

Kinesis Video Streams は、イメージ生成タグを持つフラグメントに対してのみイメージを生成および配信します。Kinesis Video Streams は、これらの特別な MKV タグを認識し、ストリームのイメージ処理設定に基づいてイメージ生成ワークフローを開始します。

Kinesis Video Streams プロデューサー SDK を使用してメディアをアップロードする場合、 putKinesisVideoEventMetadataメソッドを使用して、タグ付けする各フラグメントにイメージ生成タグを追加します。keyframe フラグを含むフレームで putFrameが呼び出されると、新しいフラグメントが開始されます。

録画済みの動画をアップロードする場合、ネットワーク速度に応じて、録画された動画の速度とは異なる速度でアップロードされる可能性があります。ビデオの元のタイムスタンプに基づいて定期的にイメージを生成し、Amazon Kinesis Video Streams がビデオを受信したレートに基づいて生成されたサーバータイムスタンプを使用しない場合は、プロデューサータイムスタンプを使用してイメージ生成を設定することをお勧めします。

このコードの完全な例を表示するには、GitHub のVideoOnlyRealtimeStreamingSampleコードサンプルを参照してください。

// 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; Frame eofr = EOFR_FRAME_INITIALIZER; 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)); // 1. End the previous fragment if (frame.flags == FRAME_FLAG_KEY_FRAME && !firstFrame) { putKinesisVideoFrame(streamHandle, &eofr); } // 2. putFrame call CHK_STATUS(putKinesisVideoFrame(streamHandle, &frame)); if (frame.flags == FRAME_FLAG_KEY_FRAME) { // 3. Adding the image generation tag CHK_STATUS(putKinesisVideoEventMetadata(streamHandle, STREAM_EVENT_TYPE_IMAGE_GENERATION, NULL);) // 4. Adding fragment metadata for (n = 1; n <= 5; n++) { SNPRINTF(metadataKey, METADATA_MAX_KEY_LENGTH, "SAMPLE_KEY_%d", n); SNPRINTF(metadataValue, METADATA_MAX_VALUE_LENGTH, "SAMPLE_VALUE_%d", frame.index + n); CHK_STATUS(putKinesisVideoFragmentMetadata(streamHandle, metadataKey, metadataValue, FALSE)); } } defaultThreadSleep(frame.duration); frame.decodingTs += frame.duration; frame.presentationTs = frame.decodingTs; frameIndex++; fileIndex++; fileIndex = fileIndex % NUMBER_OF_FRAME_FILES; firstFrame = TRUE; } // 5. End the final fragment putKinesisVideoFrame(streamHandle, &eofr);

サンプルフレームを設定するためのサンプルコードの要素は、次のように説明されています。

  1. 各フラグメントはフラグメントの末尾 () で終わる必要がありますeofr。このステートメントでは、次のフレームの先頭を示す新しいキーフレームを受信するたびに、次のフレームをストリームに追加するeofr前に を配置します。

  2. 現在のフレームをストリームに配置します。

  3. イメージ生成タグを追加します。putKinesisVideoEventMetadata メソッドは、呼び出し後および の前にいつでもputFrame(keyFrame)呼び出すことができますputFrame(eofr)。フラグメントごとに 1 回のみ呼び出す必要があります。すべてのフラグメントにはキーフレームが 1 つしかないため、現時点ではわかりやすくするために呼び出されます。の戻り値は、成功コード (0) でチェックputKinesisVideoEventMetadataされます。

  4. Kinesis Video Streams が Amazon S3 オブジェクトメタデータに変換する他のカスタムフラグメントメタデータを追加します。

  5. このアップロードセッションの最終フラグメントを終了します。

サンプルを使用してイメージ生成タグを追加する

コマンドラインオプションでイメージ生成タグを追加する場合は、C++ プロデューサー SDK kvs_gstreamer_audio_video_sampleで を使用できます。次の例に示すように、 -e image または -e both引数を追加して、この機能を有効にします。

./kvs_gstreamer_audio_video_sample stream-name \ -f video-to-upload.mp4 \ -e both

このサンプルアプリケーションの詳細については、GitHub の Amazon Kinesis Video Streams CPP プロデューサー、GStreamer プラグイン、JNI README を参照してください。

Amazon S3 オブジェクトパス (イメージ)

S3 オブジェクトパスは、生成されたイメージが配信される設定済みの S3 バケット上の場所を記述します。次の形式を使用します。

ImagePrefix_AccountID_StreamName_ImageTimecode_RandomID.file-extension

オブジェクトパス要素は次のように定義されます。

  • ImagePrefix - 存在するAWS_KINESISVIDEO_IMAGE_PREFIX場合は の値。

  • AccountID - ストリームが作成される AWS アカウント ID。

  • StreamName - イメージの生成元のストリームの名前。

  • ImageTimecode - イメージが生成されるフラグメントのエポックタイムコード (ミリ秒単位)。

  • RandomID - ランダム GUID。

  • file-extension - リクエストされたイメージ形式に基づく JPG または PNG。

この例では、生成されたイメージのオブジェクトパスは次のようになります。

111122223333_demo-stream_16907729324_f20f9add-75e7-4399-a30f-fc7aefb1bab7.jpg

イメージメタデータの取得

S3 コンソールまたは CLI を使用して、生成されたイメージのメタデータを取得できます。

Kinesis Video Streams は、生成されたイメージのフラグメント番号、プロデューサーとサーバーのタイムスタンプ、コンテンツタイプのメタデータを、すべて Amazon S3 オブジェクトメタデータとしてフォーマットして設定します。追加の MKV タグが存在する場合、それらのタグは Amazon S3 オブジェクトメタデータとしても追加されます。次の例は、Amazon S3 ヘッドオブジェクト API コマンドを使用してオブジェクトメタデータを取得する方法を示しています。レスポンスには、Kinesis Video Streams によって作成されたメタデータが含まれます。

aws s3api head-object --bucket my-bucket-name --key 111122223333_demo-stream_1690707290324_f20f9add-7e57-4399-a30f-fc7aefb1bab7.jpg { "AcceptRanges": "bytes", "LastModified": "2023-07-30T08:54:51+00:00", "ContentLength": 22693, "ETag": "\"63e03cb6d57f77e2db984c1d344b1083\"", "ContentType": "image/jpeg", "ServerSideEncryption": "AES256", "Metadata": { "aws_kinesisvideo_producer_timestamp": "1690707290324", "aws_kinesisvideo_server_timestamp": "1690707289209", "aws_kinesisvideo_fragment_number": "91343852333182036507421233921329142742245756394" } }

S3 オブジェクトメタデータの詳細については、「」を参照してくださいhttps://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMetadata.html

スロットリングから保護するための Amazon S3 URI の推奨事項

Amazon S3 に何千ものイメージを書き込むと、スロットリングのリスクがあります。詳細については、S3 プレフィックスの Put リクエストの制限」を参照してください。

Amazon S3 プレフィックスは、1 秒あたり 3,500 PUT リクエストの PUT 制限で始まり、一意のプレフィックスについては時間の経過とともに徐々に増加します。Amazon S3 プレフィックスとして日付と時刻を使用しないでください。タイムコード化されたデータは、一度に 1 つのプレフィックスに影響し、定期的に変更され、以前のプレフィックスのスケールアップが無効になります。

高速で一貫性のある Amazon S3 スケーリングを有効にするには、16 進数コードや UUID などのランダムプレフィックスを Amazon S3 送信先 URI に追加することをお勧めします。たとえば、16 進コードプレフィックスは、リクエストを 16 の異なるプレフィックス (一意の 16 進文字ごとのプレフィックス) にランダムに分割します。これにより、Amazon S3 が自動スケーリングされた後、1 秒あたり 56,000 個の PUT リクエストが許可されます。