

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

# Kinesis Video Streams: 仕組み
<a name="how-it-works"></a>

**Topics**
+ [Kinesis Video Streams API とプロデューサーライブラリのサポート](how-it-works-kinesis-video-api-producer-sdk.md)
+ [Kinesis Video Streams データモデル](how-data.md)

フルマネージド型の Amazon Kinesis Video Streams を使用して AWS のサービス、デバイスから AWS クラウド にライブビデオをストリーミングし、永続的に保存できます。その後、リアルタイムで動画を処理するために独自のアプリケーションを構築するか、バッチ指向の動画分析を実行できます。

次の図表は、Kinesis Video Streams の仕組みの概要を示しています。





![\[Kinesis Video Streams のプロデューサーとコンシューマーとのインタラクションを示す図表。\]](http://docs.aws.amazon.com/ja_jp/kinesisvideostreams/latest/dg/images/acuity-arch-3a.png)


この図は、次のコンポーネント間のやり取りを示しています。
+ **Producer** - Kinesis のビデオストリームにデータを送る任意のソース。プロデューサーは、セキュリティカメラ、ボディウェアカメラ、スマートフォンカメラ、ダッシュボードカメラなどのビデオ生成デバイスです。プロデューサーは、音声フィード、イメージ、RADAR データなどの動画以外のデータも送信できます。

  1 つのプロデューサーで複数のビデオストリームを生成できます。例えば、ビデオカメラは動画データを 1 つの Kinesis のビデオストリームにプッシュし、音声データを別のストリームにプッシュすることができます。
  + **Kinesis Video Streams プロデューサーライブラリ** – デバイスにインストールして設定できるソフトウェアとライブラリのセット。これらのライブラリを使用して、動画を安全に接続し、リアルタイムで、数秒間バッファした後、事後after-the-factメディアアップロードとしてなど、さまざまな方法で確実にストリーミングできます。
+ **Kinesis ビデオストリーム** – ライブビデオデータを転送し、オプションで保存して、リアルタイム、バッチベース、または 1 回限りのデータを使用できるようにするリソース。一般的な設定の場合、Kinesis のビデオストリームには、それに対してデータを発行するプロデューサーが 1 つだけ用意されています。

  音声、動画のほか、奥行き感知フィードや RADAR フィードなどの、時間がエンコードされた類似のデータストリームを扱うことができます。を使用して、 AWS マネジメントコンソール または SDKs を使用して AWS プログラムで Kinesis ビデオストリームを作成します。

  複数の独立したアプリケーションでは、Kinesis のビデオストリームを並列で消費できます。
+ **コンシューマー** - フラグメントやフレームなどのデータを Kinesis のビデオストリームから取得して、表示、処理、または分析します。一般的に、これらのコンシューマーは Kinesis Video Streams アプリケーションと呼ばれます。Kinesis Video Streams でデータをリアルタイムで消費して処理するアプリケーション、または低レイテンシー処理が不要な場合にデータを保存して時間インデックスを作成するアプリケーションを作成できます。これらのコンシューマーアプリケーションを作成して Amazon EC2 インスタンス上で実行できます。
  + [パーサーライブラリを使用してカメラからの出力を監視する](parser-library.md) – Kinesis Video Streams アプリケーションが Kinesis ビデオストリームから低レイテンシーでメディアを確実に取得できるようにします。また、メディア内のフレームの境界を解析し、アプリケーションでフレーム自体の処理や分析を集中的に実行できるようにします。

# Kinesis Video Streams API とプロデューサーライブラリのサポート
<a name="how-it-works-kinesis-video-api-producer-sdk"></a>

Kinesis Video Streams には、ストリームを作成および管理し、ストリーム間でメディアデータの読み取りまたは書き込みを行うための API が用意されています。Kinesis Video Streams コンソールは管理機能に加えて、ライブ再生およびビデオオンデマンドの再生もサポートしています。Kinesis Video Streams は、アプリケーションコードで使用すると、データをメディアソースから抽出したり、Kinesis のビデオストリームにアップロードすることができる一連のプロデューサーライブラリも提供します。

**Topics**
+ [Kinesis Video Streams API](#how-it-works-kinesis-video-api)
+ [エンドポイント検出パターン](#how-it-works-api-pattern)
+ [プロデューサーライブラリ](#how-it-works-producer-sdk)

## Kinesis Video Streams API
<a name="how-it-works-kinesis-video-api"></a>

Kinesis Video Streams にはAPIs が用意されています。また、メディアデータをストリームから読み取ったり、ストリームに書き込むための API も用意されています。
+ **Producer API** - Kinesis Video Streams には、メディアデータを Kinesis のビデオストリームに書き込むための `PutMedia` API が用意されています。`PutMedia` リクエストで、プロデューサーはメディアフラグメントのストリームを送信します。*フラグメント*とは、自己完結型のフレームのシーケンスです。フラグメントに属するフレームは、他のフラグメントからのフレームに依存していないことが求められます。詳細については、「[PutMedia](API_dataplane_PutMedia.md)」を参照してください。

  フラグメントが届くと、Kinesis Video Streams では一意のフラグメント番号を昇順で割り当てます。また、各フラグメントのプロデューサー側とサーバー側のタイムスタンプを Kinesis Video Streams 固有のメタデータとして保存します。
+ **コンシューマー APIs** – コンシューマーは、次の APIs を使用してストリームからデータを取得できます。
  + `GetMedia` - この API を使用するとき、コンシューマーは開始フラグメントを識別する必要があります。次に、API はストリームに追加された順番 (昇順のフラグメント番号) でフラグメントを返します。フラグメント内のメディアデータは、[Matroska (MKV)](https://www.matroska.org/technical/specs/index.html) などの構造化された形式にまとめられています。詳細については、「[GetMedia](API_dataplane_GetMedia.md)」を参照してください。
**注記**  
`GetMedia` では、フラグメントの場所を認識します (データストア内にアーカイブされているか、リアルタイムで利用可能)。たとえば、開始フラグメントがアーカイブされていることを `GetMedia` が判断すると、フラグメントがデータストアから返され始めます。まだアーカイブされていない新しいフラグメントを返す必要がある場合、 はインメモリストリームバッファからのフラグメントの読み取り`GetMedia`に切り替えます。

    これは、ストリームによって取り込まれた順番でフラグメントを処理する継続的なコンシューマーの例です。

    `GetMedia` では、動画処理アプリケーションが失敗したり、遅延した後でも、問題なく処理を挽回することができます。`GetMedia` を使用すると、アプリケーションでは、データストアにアーカイブされているデータを処理でき、アプリケーションが処理に追いついてきたところで、届いたメディアデータを `GetMedia` がリアルタイムで引き続き配信するようになります。
  + `GetMediaFromFragmentList` (および `ListFragments`) - バッチ処理アプリケーションはオフラインコンシューマーと見なされます。オフラインコンシューマーは、`ListFragments` と `GetMediaFromFragmentList` の API を組み合わせることで、特定のメディアフラグメントまたは動画の範囲を明示的にフェッチできます。`ListFragments` および `GetMediaFromFragmentList` を使用すると、アプリケーションは、特定の時間範囲またはフラグメント範囲の動画のセグメントを識別し、これらのフラグメントを順番に、または並行して処理するためにフェッチできます。このアプローチは、大量のデータを並行して迅速に処理する必要がある `MapReduce` アプリケーションに適しています。

    たとえば、コンシューマーが 1 日分の動画フラグメントを処理する必要があるとします。コンシューマーは次のことを行います。

    1. `ListFragments` API を呼び出し、時間範囲を指定して目的のフラグメントのコレクションを選択することで、フラグメントのリストを取得します。

       API は、指定された時間範囲内のすべてのフラグメントからメタデータを返します。メタデータは、フラグメント番号、プロデューサー側、サーバー側のタイムスタンプなどの情報を提供します。

    1. フラグメントのメタデータリストを使用して、フラグメントを任意の順序で取得します。例えば、その日のすべてのフラグメントを処理するために、コンシューマーはリストをサブリストに分割し、ワーカー (複数の Amazon EC2 インスタンスなど) に を使用してフラグメントを並行してフェッチさせ`GetMediaFromFragmentList`、並行して処理することを選択できます。

次の図は、これらの API コール中のフラグメントとチャンクのデータフローを示しています。

![\[API コール中のフラグメントとチャンクのデータフローを示した図\]](http://docs.aws.amazon.com/ja_jp/kinesisvideostreams/latest/dg/images/arch-20.png)


プロデューサーが `PutMedia` リクエストを送信するときは、ペイロード内のメディアメタデータを送信してから、メディアデータフラグメントのシーケンスを送信します。Kinesis Video Streams はデータを受け取ると、Kinesis Video Streams のチャンクとして着信メディアデータを保存します。各チャンクは以下で構成されています。
+ メディアメタデータのコピー
+ フラグメント
+ Kinesis Video Streams 固有のメタデータ。フラグメント番号、サーバー側およびプロデューサー側のタイムスタンプなど

コンシューマーがメディアメタデータをリクエストすると、Kinesis Video Streams は、リクエストで指定されたフラグメント番号から始まるチャンクのストリームを返します。

ストリームのデータの永続性を有効にした場合、ストリームでフラグメントを受け取った後に、Kinesis Video Streams もフラグメントのコピーをデータストアに保存します。

## エンドポイント検出パターン
<a name="how-it-works-api-pattern"></a>

**コントロールプレーン REST APIs**

[Kinesis Video Streams コントロールプレーン REST APIs](https://docs.aws.amazon.com//kinesisvideostreams/latest/dg/API_Operations_Amazon_Kinesis_Video_Streams.html) にアクセスするには、[Kinesis Video Streams サービスエンドポイント](https://docs.aws.amazon.com//general/latest/gr/akv.html#akv_region)を使用します。

**データプレーン REST APIs**

Kinesis Video Streams は、セル[ラーアーキテクチャ](https://docs.aws.amazon.com//wellarchitected/latest/reducing-scope-of-impact-with-cell-based-architecture/what-is-a-cell-based-architecture.html)を使用して構築され、スケーリングとトラフィック分離のプロパティを向上させます。各ストリームはリージョン内の特定のセルにマッピングされるため、アプリケーションはストリームがマッピングされた正しいセル固有のエンドポイントを使用する必要があります。Data Plane REST APIs にアクセスするときは、適切なエンドポイントを自分で管理してマッピングする必要があります。このプロセスを示したエンドポイント検出パターンの詳細は次のとおりです。

1. エンドポイント検出パターンは、いずれかの`GetEndpoints`アクションの呼び出しから始まります。これらのアクションはコントロールプレーンに属します。

   1. [Amazon Kinesis Video Streams Media](API_Operations_Amazon_Kinesis_Video_Streams_Media.md) または [Amazon Kinesis Video Streams Archived Media](API_Operations_Amazon_Kinesis_Video_Streams_Archived_Media.md)サービスのエンドポイントを取得する場合は、 を使用します[GetDataEndpoint](API_GetDataEndpoint.md)。

   1. [Amazon Kinesis Video Signaling Channels](API_Operations_Amazon_Kinesis_Video_Signaling_Channels.md)、、[Amazon Kinesis Video WebRTC ストレージ](API_Operations_Amazon_Kinesis_Video_WebRTC_Storage.md)または [Kinesis Video Signaling](https://docs.aws.amazon.com//kinesisvideostreams-webrtc-dg/latest/devguide/kvswebrtc-websocket-apis.html) のエンドポイントを取得する場合は、 を使用します[GetSignalingChannelEndpoint](API_GetSignalingChannelEndpoint.md)。

1. エンドポイントをキャッシュして再利用します。

1. キャッシュされたエンドポイントが機能しなくなった場合は、 を新たに呼び出し`GetEndpoints`てエンドポイントを更新します。

## プロデューサーライブラリ
<a name="how-it-works-producer-sdk"></a>

Kinesis のビデオストリームの作成後は、ストリームへのデータの送信を開始できます。アプリケーションコードで、これらのライブラリを使用してデータをメディアソースから抽出したり、Kinesis のビデオストリームにアップロードすることができます。使用可能なプロデューサーライブラリの詳細については、「[Kinesis Video Streams へのアップロード](producer-sdk.md)」を参照してください。

# Kinesis Video Streams データモデル
<a name="how-data"></a>

[Kinesis Video Streams へのアップロード](producer-sdk.md) および [パーサーライブラリを使用してカメラからの出力を監視する](parser-library.md) は、動画データに伴う情報の埋め込みをサポートする形式で動画データを送受信します。この形式は Matroska (MKV) 仕様に基づいています。

[MKV 形式](https://en.wikipedia.org/wiki/Matroska)は、メディアデータに対するオープン仕様です。*Amazon Kinesis Video Streams Developer Guide* 内のすべてのライブラリおよびコードの例は、MKV 形式でデータを送受信します。

[Kinesis Video Streams へのアップロード](producer-sdk.md) は `StreamDefinition`および `Frame`タイプを使用して、MKV ストリームヘッダー、フレームヘッダー、フレームデータを生成します。

MKV 仕様の詳細については「[Matroska Specification](https://www.matroska.org/technical/specs/index.html)」を参照してください。

以下のセクションでは、[C\$1\$1](producer-sdk-cpp.md) によって作成された MKV 形式データのコンポーネントについて説明します。

**Topics**
+ [ストリームヘッダー要素](#how-data-header-streamdefinition)
+ [トラックデータをストリーミングする](#how-data-header-streamtrack)
+ [フレームヘッダー要素](#how-data-header-frame)
+ [MKV フレームデータ](#how-data-frame)

## ストリームヘッダー要素
<a name="how-data-header-streamdefinition"></a>

`StreamDefinition` では次の MKV ヘッダー要素が使用されます (`StreamDefinition.h` で定義)。


****  

| Element | 説明 | 一般的な値 | 
| --- | --- | --- | 
| stream\$1name | Kinesis のビデオストリームの名前。 | my-stream | 
| retention\$1period | ストリームデータが Kinesis Video Streams によって保持される時間単位の期間。データを保持しないストリーム0に を指定します。 | 24 | 
| [タグ] | ユーザーデータのキーと値のコレクション。このデータは AWS マネジメントコンソール に表示され、クライアントアプリケーションにより読み取ることでストリームに関する情報をフィルタリングまたは取得できます。 |  | 
| kms\$1key\$1id | 存在する場合、ユーザー定義 AWS KMS キーを使用してストリーム上のデータを暗号化します。存在しない場合、データは Kinesis が提供するキー () によって暗号化されますaws/kinesisvideo。 | 01234567-89ab-cdef-0123-456789ab | 
| streaming\$1type | 現在、有効なストリーミングタイプは STREAMING\$1TYPE\$1REALTIME のみです。 | STREAMING\$1TYPE\$1REALTIME | 
| content\$1type | ユーザー定義のコンテンツタイプ。動画データをストリーミングしてコンソールで再生する場合、コンテンツタイプは video/h264 である必要があります。 | video/h264 | 
| max\$1latency | この値は現在使用されていないため、0 に設定する必要があります。 | 0 | 
| fragment\$1duration | フラグメントの継続時間 (推定)。この時間が最適化に使用されます。実際のフラグメント継続時間は、ストリーミングデータによって決定します。 | 2 | 
| timecode\$1scale | フレームタイムスタンプで使用されるスケールを示します。デフォルト値は 1 ミリ秒です。`0` を指定すると、デフォルト値の 1 ミリ秒も割り当てられます。この値は 100 ナノ秒～1 秒の範囲で指定できます。 詳細については、Matroska のドキュメントの「[TimecodeScale](https://matroska.org/technical/specs/notes.html#TimecodeScale)」を参照してください。 |  | 
| key\$1frame\$1fragmentation | true の場合、ストリームはキーフレームが受信された場合に新たなクラスターを開始します。 | true | 
| frame\$1timecodes | の場合true、Kinesis Video Streams は受信したフレームの表示タイムスタンプ (pts) とデコードタイムスタンプ (dts) の値を使用します。の場合false、Kinesis Video Streams はシステム生成の時間値でフレームを受信したときにフレームをスタンプします。 | true | 
| absolute\$1fragment\$1time |  true の場合、クラスタータイムコードは絶対時間 (プロデューサーのシステムクロックなど) を用いて解釈されます。false の場合、クラスタータイムコードはストリームの開始時刻の相対値として解釈されます。 | true | 
| fragment\$1acks |  true の場合、Kinesis Video Streams がデータを受信した際に確認 (ACK) が送信されます。ACK は KinesisVideoStreamFragmentAck または KinesisVideoStreamParseFragmentAck コールバックを用いて受信できます。 | true | 
| restart\$1on\$1error | ストリームのエラーが発生した後、ストリームが送信を再開すべきかどうかを示します。 | true | 
| nal\$1adaptation\$1flags | コンテンツ内に NAL (Network Abstraction Layer) 適応またはコーデックプライベートデータが含まれるかどうかを示します。有効なフラグには NAL\$1ADAPTATION\$1ANNEXB\$1NALS および NAL\$1ADAPTATION\$1ANNEXB\$1CPD\$1NALS が含まれます。 | NAL\$1ADAPTATION\$1ANNEXB\$1NALS | 
| frame\$1rate | コンテンツの推定フレームレート。この値は最適化に使用され、実際のフレームレートは受信データのレートにより決定されます。0 を指定すると、デフォルトの 24 が割り当てられます。 | 24 | 
| avg\$1bandwidth\$1bps | コンテンツ帯域幅の推定値。Mbps 単位。この値は最適化に使用され、実際のレートは受信データの帯域幅により決定されます。たとえば、25 FPS で動作する 720p の解像度のビデオストリームでは、平均 5 Mbps の帯域幅を期待できます。 | 5 | 
| buffer\$1duration | コンテンツがプロデューサー上でバッファされる時間。ネットワークレイテンシーが低い場合、この値を減らすことができます。ネットワークレイテンシーが高い場合、この値を大きくすると、割り当てが小さいバッファにフレームを配置できないため、送信前にフレームがドロップされるのを防ぎます。 |  | 
| replay\$1duration | 接続が失われた場合にビデオデータストリームが「巻き戻」される時間。接続損失によるフレームの損失が懸念されない場合、この値はゼロになります。消費するアプリケーションが冗長フレームを削除できる場合は、値を増やすことができます。この値はバッファ期間より短くする必要があります。そうでない場合はバッファ期間が使用されます。 |  | 
| connection\$1staleness | データが受信されない場合に接続を維持する期間。 |  | 
| codec\$1id | コンテンツで使用されるコーデック。詳細情報については Matroska 仕様の「[CodecID](https://matroska.org/technical/specs/codecid/index.html)」を参照してください。 | V\$1MPEG2 | 
| track\$1name | ユーザー定義のトラック名。 | my\$1track | 
| codecPrivateData | 多くのダウンストリームコンシューマーにおいて必要となる、フレームデータのデコードのためにエンコーダーが提供するデータ (ピクセル単位でのフレーム幅および高さなど)。[C\$1\$1 プロデューサーライブラリ](producer-sdk-cpp.md)では、 のgMkvTrackVideoBits配列にフレームのピクセル幅と高さMkvStatics.cppが含まれます。 |  | 
| codecPrivateDataSize | codecPrivateData パラメータのデータのサイズ。 |  | 
| track\$1type | ストリームのトラックのタイプ。 | MKV\$1TRACK\$1INFO\$1TYPE\$1AUDIO または MKV\$1TRACK\$1INFO\$1TYPE\$1VIDEO | 
| segment\$1uuid | ユーザー定義のセグメント uuid (16 バイト)。 |  | 
| default\$1track\$1id | トラックの、一意のゼロ以外の数。 | 1 | 

## トラックデータをストリーミングする
<a name="how-data-header-streamtrack"></a>

`StreamDefinition` では次の MKV トラック要素が使用されます (`StreamDefinition.h` で定義)。


****  

| Element | 説明 | 一般的な値 | 
| --- | --- | --- | 
| track\$1name | ユーザー定義のトラック名。たとえば、オーディオトラック用の「audio」。 | audio | 
| codec\$1id | トラック用のコーデック ID。たとえば、オーディオトラック用の「A\$1AAC」。 | A\$1AAC | 
| cpd | フレームデータのデコードのためにエンコーダーが提供するデータ。このデータには、フレームの幅と高さ (ピクセル単位) を含めることができます。この情報は多くのダウンストリームコンシューマーで必要となります。[C\$1\$1 プロデューサーライブラリ](https://docs.aws.amazon.com//kinesisvideostreams/latest/dg/producer-sdk-cpp.html)では、MkvStatics.cpp の gMkvTrackVideoBits 配列にフレームのピクセル幅と高さが含まれています。 MkvStatics.cpp  |  | 
| cpd\$1size | codecPrivateData パラメータのデータサイズ。 |  | 
| track\$1type | トラックのタイプ。たとえば、オーディオ用の MKV\$1TRACK\$1INFO\$1TYPE\$1AUDIO の列挙値を使用できます。 | MKV\$1TRACK\$1INFO\$1TYPE\$1AUDIO | 

## フレームヘッダー要素
<a name="how-data-header-frame"></a>

`Frame` では次の MKV ヘッダー要素が使用されます (`mkvgen/Include.h` の `KinesisVideoPic` パッケージで定義)。
+ **Frame Index:** 一定間隔で増加する値。
+ **Flags:** フレームのタイプ。有効な値は次のとおりです。
  + `FRAME_FLAGS_NONE`
  + `FRAME_FLAG_KEY_FRAME`: `key_frame_fragmentation` がストリーム上で設定されている場合、キーフレームは新たなフラグメントを開始します。
  + `FRAME_FLAG_DISCARDABLE_FRAME`: デコーダーに対し、デコーディングが遅い場合はこのフレームを破棄できることを通知します。
  + `FRAME_FLAG_INVISIBLE_FRAME`: このブロックの時間は 0 です。
+ **デコードタイムスタンプ:** このフレームがデコードされた時刻のタイムスタンプ。以前のフレームがデコードのためにこのフレームに依存している場合、このタイムスタンプは以前のフレームよりも前になる可能性があります。この値はフラグメントの開始の相対値です。
+ **プレゼンテーションタイムスタンプ:** このフレームが表示されるときのタイムスタンプ。この値はフラグメントの開始の相対値です。
+ **Duration:** フレームの再生時間。
+ **Size:** フレームデータのサイズ (バイト単位)

## MKV フレームデータ
<a name="how-data-frame"></a>

`frame.frameData` 内のデータには、使用されるエンコーディングスキーマに応じ、フレームのメディアデータのみが含まれている場合、あるいはさらにネスト化されたヘッダー情報が含まれている場合があります。に表示するには AWS マネジメントコンソール、データを [H.264](https://en.wikipedia.org/wiki/H.264/MPEG-4_AVC) コーデックでエンコードする必要がありますが、Kinesis Video Streams はタイムシリアル化されたデータストリームを任意の形式で受信できます。