AWS IoT 再入門ブログリレー Amazon Kinesis Video Streams編

2021.05.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

CX事業本部平内(SIN)です。

本企画は、弊社チームIoTメンバーが初心に返ってIoTサービスについて学びなおし、解説してみようというものです。
本エントリーでは、AWSへ動画をライブで簡単かつ安全にストリーミングできる「Amazon Kinesis Video Streams(以下、Kinesis Video Streams)」について紹介します。

Kinesis Video Streamsの主要な機能は、以下のとおりです。

  • 数百万ものデバイスからのストリーミングデータを取り込むために必要な、すべてのインフラストラクチャ扱うマネージドサービス
  • ストリーム内の動画データの耐久性に優れた保存、暗号化、インデックス作成
  • APIを介したデータへのアクセスが可能
  • ライブやオンデマンド視聴用の動画再生が可能
  • コンピュータビジョンと動画分析を活用するアプリケーションを迅速に構築可能
  • ビデオチャットやピアツーピアのメディアストリーミングが可能(WebRTC)

2 ユースケース

AWSのドキュメントで紹介されているユースケースとしては、以下のようなものが挙げられています。

(1) スマートホーム

防犯システムなどのカメラ搭載の機器から、ビデオやオーディオを、ライブでAWSへストリーミングでき、そのストリームを使用した、各種のシステム構築が可能

例: カメラ搭載のドアベルを携帯電話から操作する


https://aws.amazon.com/jp/kinesis/video-streams

(2) スマートシティ

都市において、24時間年中無休でキャプチャされた膨大な動画を、安全、かつ、コスト効率よく、取り込み、保存、分析でき、活用が可能

例: アンバーアラートシステム


https://aws.amazon.com/jp/kinesis/video-streams

(3) 工業オートメーション

RADARやLIDARの信号、温度プロファイル、工業用機器からの深度データなど、様々な時間符号化データを収集し、機械学習フレームワークによってデータを分析し、予知保全などの工業オートメーションを構築可能

例: 機器の予防保全


https://aws.amazon.com/jp/kinesis/video-streams

3 2種類のストリーミング方法

Kinesis Video Streamsでは、以下の2種類のストリーミング方法が提供されています。

  • メディア形式で収集

デバイスからのストリーミングデータをクラウドへ取り込んで保存し、再生や分析に利用します。仕組み上、ライブ再生は、2秒から数秒のレイテンシーを許容する必要があります。

  • WebRTC

WebRTCによる、超低遅延の双方向のストリーミングです。ストリーミングデータは、双方向に送受可能ですが、クラウドへの保存はされません。


【AWS Black Belt Online Seminar】Amazon Kinesis Video Streams

どちらも、リアルタイム配信のような利用が可能ですが、接続数は限られており、大規模な配信には、AWS メディアサービスの利用が推奨されています。

4 メディア形式で収集

「メディア形式で収集」の場合のアーキテクチャです。

  • プロデューサー (メディアをアップロードするデバイス)
  • ストリーム (データを受け付ける単位、デバイスと1対1となる)
  • コンシューマー (データを取り込んで分析等を行うアプリ等、ストリーム1に複数作成可能)
  • インデックス (ストリーム内のデータは、時間ベースのインデックスを付与して、内部S3に保存されている)


【AWS Black Belt Online Seminar】Amazon Kinesis Video Streams

以下、取り込み、保存、再生、取得・分析についてです。

(1) 取り込み

Kinesis Video Streamsへメディアを取り込む方法としては、以下のようなものが提供されています。

  • PutMedia API
  • Amazon Kinesis Video Streams Producer SDK(推奨)

(1-1) PutMediaAPI


https://docs.aws.amazon.com/ja_jp/kinesisvideostreams/latest/dg/API_dataplane_PutMedia.html

MKVフォーマットのフラグメントをPayloadとして、HTTP POSTします。MKVフォーマット専用となることや、Long Running Sessionの扱いなど、やや、取り扱いが難しいかもしれません。

(1-2) Amazon Kinesis Video Streams Producer SDK

Amazon Kinesis Video Streams Producer SDKでは、用途に合わせて、階層ごとに利用が可能です。

  • コア機能を提供するライブラリ (ファームウエアレベルで統合可能)
  • Producer SDK(開発者向け[C,C++,Java])
  • デモアプリケーション


【AWS Black Belt Online Seminar】Amazon Kinesis Video Streams

Produser SDKを利用したサンプルや、GStreamerで利用可能なシンクが利用可能です。
Amazon Kinesis Video Streams CPP Producer, GStreamer Plugin and JNI
Amazon Kinesis Video Streams Producer SDK Java

最も簡単に利用可能な、「デモアプリケーション」では、下記のようなものが提供されています。

RTSP demo application(RTSPカメラの映像を送信するDockerアプリケーション)
Sample Docker container build and run instructions for Kinesis Video Streams RTSP demo application

Brower-based Ingestion ブラウザからWebカメラの映像をアップロードする
KVS Browser-based Ingestion

(2) 保存

Kinesis Video Streams では、以下の概念でメディアデータが扱われています。

  • フレーム(動画内の1コマの画像)
  • フラグメント(短時間の複数フレームの塊で、フラグメントごと独立している)
  • チャンク(ストリーム内での格納形式で、フラグメントにメタ情報追加したもの)

プロデューサー(デバイス)からは、フラグメントの単位で連続して動画が送信されます。Kinesis Video Streamsに到着したデータでは、プロデューサーが付与したタイムスタンプや、サーバ到着時のタイムスタンプ、インデックス番号などの付加情報を追加したチャンク形式で、これを格納します。 コンシューマーは、チャンク単位でデータを取得し、その中のフラグメント(フレーム)を取り出します。


https://docs.aws.amazon.com/ja_jp/kinesisvideostreams/latest/dg/how-it-works-kinesis-video-api-producer-sdk.html

データの保存期間は、0(保存しない)から10年まで設定可能で、データが削除されるまでは、期間を変更(延長、短縮)することも可能です。(保存期間で料金が発生します)

(3) 再生

Kinesis Video Streams では、以下の方法で、ライブ再生及び、オンデマンド再生が可能です。

  • 簡易ビューアー
  • HTTP Live Stringing(HLS) 及び、Dynamic Adaptive Striaming over HTTP(DASH)による再生

(3-1) 簡易ビューアー

コンソール上で、ストリーム及び、開始時間を指定して、再生が可能です。また、mp4のダウンロードも可能です。なお、ここでの再生は、H264で圧縮されたものに限ります。基本的には、テスト用という位置付けです。

(3-2) HLS及び、DASHによる再生

データ保持期間を0以上とし、H264、H265、AACなどの一定の条件下で、HLSや、DASHによる再生が可能です。なお、セッションの上限は10となっています。

作業手順は、概ね以下の通りです。

  • GetDataEndpoint APIでエンドポイント取得
  • GetHLS(DASH)StreamingSession URL APIによってストリーミングURLを取得
  • URLから任意のツールで再生


HLS を使用した動画再生
MPEG-DASH を使用した動画再生

(4) 取得・分析

Kinesis Video Streams では、以下の方法で、データの取得(分析)が可能です。

  • GetClip API
  • GetMedia API
  • GetMediaForFragmentList API/ListFragments API
  • Amazon Kinesis Video Streams Perser Library
  • Amazon Rekognition Video
  • Amason Kinesis Video Inference Template

(4-1) GetClip API

1リクエストで、100MByte以下、200フラグメント以下という制限がありますが、マネジメントコンソール及び、APIにより、MP4を生成してダウンロードできます。
GetClip

(4-2) GetMedia API

ストリームからリアルタイムにデータを取得します。


GetMedia

(4-3) GetMediaForFragmentList API/ListFragments API

ストリームからバッチ処理的に指定期間のデータを取得します。GetMediaForFragmentListで指定期間のフラグメントのリストを取得し、ListFragmentsで実際にデータをダウンロードできます。


GetMediaForFragmentList
ListFragments

(4-4) Amazon Kinesis Video Streams Perser Library

ストリームから取得したMKV形式のデータを加工するJavaのライブラリ
Amazon Kinesis Video Streams Parser Library

(4-5) Amazon Rekognition Video

設定のみで、Amazon Rekognition Videoに連携できます。


Amazon Rekognition ストリーミングビデオの操作


https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/streaming-video.html

(4-6) Amason Kinesis Video Inference Template

コンシューマを作成しなくても、SageMakerの推論エンドポイントに接続が可能です。


Amazon Kinesis Video Streams および Amazon SageMaker を使用したリアルタイムでのライブビデオの分析


https://aws.amazon.com/jp/blogs/news/analyze-live-video-at-scale-in-real-time-using-amazon-kinesis-video-streams-and-amazon-sagemaker/

5 WebRTC

WebRTC(Web Real-Time Communication)は、 ウェブブラウザやモバイルアプリケーション間のリアルタイム通信を提供するオープンソースプロジェクトであり、端末間でピアツゥーピアな接続を確立し、動画・音声・その他の任意のデータを低遅延に双方向でストリーミングできます。

WebRTCでは、Signaling ServerSTUN ServerTURN Serverなどのサーバ機能が存在しますが、Kinesis Video Streamsでは、この部分を、フルマネージドなサービスとして提供しています。
What Is Amazon Kinesis Video Streams with WebRTC

なお、2021/05/06現在、1つのシグナリングチャンネルに接続できるMasterは1つであり、Viewerは10コまでという制限があることに注意が必要です
Kinesis Video Streams with WebRTC: How It Works

(1) シグナリングチャンネル

シグナリングチャンネルを作成することで、WebRTCが利用可能になります。

シグナリングチャンネルの作成が終わると、デモ画面で直ちに動作が確認できます。

(2) SDK

Masterや、Viewerを実装するためには、各種のプラットフォーム向けにSDKが提供されています。
Amazon Kinesis Video Streams WebRTC SDK for JavaScript
Amazon Kinesis Video Streams C WebRTC SDK
The Amazon Kinesis Video WebRTC Sample

Amazon Kinesis Video Streams WebRTC SDK for JavaScriptを使用している様子です。

6 最後に

今回は、初心に返ってIoTサービスについて学びなおし、解説してみようということで、Kinesis Video Streamsについて紹介しました。

非常に機能豊富なサービスで、全然、網羅できていなくて恐縮なのですが、個人的には、サービスの全体象を少しは再認識できたことを喜んでいます。

不十分な部分は、併記させて頂いたURL等をご参照頂ければ幸いです。

7 参考リンク


Amazon Kinesis Video Streams
Amazon Kinesis Video Streams 開発者ガイド
【AWS Black Belt Online Seminar】Amazon Kinesis Video Streams
AMAZON KINESIS VIDEO STREAMS ハンズオン

以下は、過去に、Kinesis Video Streamsに関して投稿させて頂いた記事です。興味湧くものがありましたら、辿っていただければ嬉しいです。


Amazon Kinesis Video Streamsを使ってストリーム映像をAWS上に流してみる【RaspberryPi】 min-install-script編
[Amazon Kinesis Video Streams] DockerイメージのプロデューサーライブラリでRTSPサーバの動画を配信してみました。
[Amazon Kinesis Video Streams] Docker+RasPi+USB接続Webカメラでの配信
[Kinesis Video Streams] ストリーム上のフラグメントデータから、任意の時間帯を指定して動画を取得してみました。
[Kinesis Video Streams] Jetson Nano上で各種ソースからの動画のアップロード 〜 kvssinkを利用する場合のGStreamerの使用方法
[Amazon Kinesis Video Streams] Dockerイメージのプロデューサーライブラリで動画配信(Raspberry Pi編)
Amazon Kinesis Video Streams with WebRTC を使用して、RasPIで動画を送ってみました。
[Kinesis Video Streams] Mac上で各種ソースからの動画のアップロード 〜 kvssinkを利用する場合のGStreamerの使用方法
[Kinesis Video Stream] HTTP Live Streaming(HLS)による動画の配信
[Kinesis Video Streams] パーサーライブラリ(kvssink)による動画送信で、解像度とフレームレートの調整でデータサイズが変化することを確認してみました。【RaspberryPi】
Amazon Kinesis Video Streamsを使ってストリーム映像をAWS上に流してみる【Windows(MSVC)】
[Kinesis Video Streams] Raspberry PiからGStreamerを使用してTCPストリーム配信してみました。
[Kinesis Video Streams] GStreamerを使用したRTSPサーバを構築し、Macから動画を送信してみました。
[Kinesis Video Streams] OpenCVのビデオソースにGStreamerを使用してみました。
[Kinesis Video Streams] capsfilerとvideoscaleを使って、好みの解像度で動画を送信してみました
【小ネタ】GStreamerのtee及び、queueを使って、Kinesis Video Streamsの複数のストリームに同時送信してみました
[Kinesis Video Streams] Jetson Nano上でインテル® RealSense の画像を処理すると同時にKinesis Video Streamsに送信してみました
【小ネタ】Kinesis Video Streamsへ送信する動画にclockoverlayで時間を挿入する
[Kinesis Video Streams] Raspberry Piでh.264エンコードをする3種類の方法
[Kinesis Video Streams] DockerイメージのプロデューサーライブラリでMacのカメラを使用してみました
[Kinesis Video Streams] Windows上で各種ソースからの動画のアップロード 〜 kvssinkを利用する場合のGStreamerの使用方法
【小ネタ】2つのWebカメラの入力を合成し、1つの動画としてKinesis Video Streamsに送信する
[Kinesis Video Streams] (新機能)GetClip APIを使用するとストリームから一発でmp4が取得できるので超捗る
[Kinesis Video Streams] Raspberry Pi 上で各種ソースからの動画のアップロード 〜 kvssinkを利用する場合のGStreamerの使用方法
[Amazon Connect] 留守番電話を設置した場合に必要なKinesis Video StreamsとS3のデータサイズについて