📑

Amazon Kinesis Video Streams API/SDK による開発

2022/02/02に公開

Amazon Kinesis Video Streams を使ったアプリケーションを開発するための SDK について整理してみました。

※WebRTC については触れていません。

参考

API 構成

Amazon Kinesis Video Streams のストリームに対する配信、閲覧は以下の API を使用することで実現され、呼び出すための SDK が各種用意されています。

Producer API

ストリームに映像を送信する API はひとつだけです。

Producer API

  • PutMedia : ストリームにメディアデータをセグメント単位(1~10秒)で送信する
    • MKV 形式のみ
    • CLI: なし

PutMedia API は通常の API とは異なりセッションを張ったまま複数のやりとりをおこなう Long Running Session となっており、AWS CLI ではサポートされていません。基本的には SDK の使用が推奨されています。直接 API を叩く場合、以下のような処理を自前でおこなう必要があると思われます。

  • 認証
  • コネクションの管理 (コネクションの維持、再接続など)
  • フロー制御 (レイテンシーを監視してフレームを破棄するなど)

Consumer API

Consumer API

Consumer 側は AWS SDK で GetMedia/GetMediaFromFragmentList API を呼ぶことで、送信されたメディアデータにメタデータが付与されたチャンクという単位で読み出しをおこないますが、これを解析する Parser Library が別途用意されます。また mp4 ファイル形式や DASH/HLS で再生するための URL を取得する API も用意されています。

Consumer API を使った具体的な実装方法は別途、以下に整理しました。

SDK のビルド

Amazon Kinesis Video Streams に対する SDK は以下のリポジトリに分かれています。

CPP Producer / GStreamer Plugin / JNI

Producer Library (CPP Producer) と、GStreamer 用のプラグイン、Java 用の JNI (インターフェイス)がビルドできるプロジェクトです。

CPP Producer / GStreamer Plugin / JNI のビルド準備

Debian GNU/Linux の場合

apt-get install -y cmake g++ git m4 make pkg-config

# JNI もビルドする場合
apt-get install -y openjdk-11-jdk

# GStreamer Plugin もビルドする場合
apt-get install -y libssl-dev libcurl4-openssl-dev liblog4cplus-dev \
  libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
  gstreamer1.0-plugins-base-apps gstreamer1.0-plugins-bad \
  gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-tools

macOS の場合

brew install cmake git log4cplus make pkg-config

# JNI もビルドする場合
brew install adoptopenjdk11

# GStreamer Plugin もビルドする場合
brew install gstreamer gst-plugins-base \
  gst-plugins-good gst-plugins-bad gst-plugins-ugly gst-libav \
  log4cplus openssl

CPP Producer / GStreamer Plugin / JNI のビルド

git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git
cd amazon-kinesis-video-streams-producer-sdk-cpp
mkdir -p build
cd build
cmake .. \
  -DBUILD_JNI=ON \
  -DBUILD_GSTREAMER_PLUGIN=ON
make

ビルド結果は以下に出力されます。 (macOS の場合は .dylib)

  • CPP Producer) libKinesisVideoProducer.so
  • JNI) libKinesisVideoProducerJNI.so
  • JStreamer プラグイン) libgstkvssink.so
  • 依存ライブラリ
    • dependency/libkvscproducer/kvscproducer-src/libcproducer.so
    • open-source/local/lib 配下

CPP Producer の動作確認

export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
tst/producerTest

テスト用のサンプルソースは tst/ProducerTestFixture.h に書かれています。

GStreamer Plugin の動作確認

GST_PLUGIN_PATH にビルドしたライブラリのあるパスを指定することで、GStreamer から認識されます。

export GST_PLUGIN_PATH=$(pwd)/build
export LD_LIBRARY_PATH=$(pwd)/open-source/local/lib
gst-inspect-1.0 kvssink

Producer SDK Java

Producer SDK Java のビルド準備

Debian GNU/Linux 11 の場合

apt-get install -y maven

macOS の場合

brew install maven

Producer SDK Java のビルド

git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-java.git
cd amazon-kinesis-video-streams-producer-sdk-java
mvn compile assembly:single

Producer SDK Java の動作確認

src/main/demo/com/amazonaws/kinesisvideo/demoapp/DemoAppMain.java を書き換えて、適切なリージョンおよび認証情報を使用するよう修正します。

例)

final KinesisVideoClient kinesisVideoClient = KinesisVideoJavaClientFactory
        .createKinesisVideoClient(Regions.AP_NORTHEAST_1, new ProfileCredentialsProvider());

実行

JAVA_LIBRARY_PATH=$(cd "../amazon-kinesis-video-streams-producer-sdk-cpp/build"; pwd)
STREAM_NAME=stream-test
java \
  -classpath target/amazon-kinesis-video-streams-producer-sdk-java-1.11.0-jar-with-dependencies.jar \
  -Djava.library.path=${JAVA_LIBRARY_PATH} \
  -Dkvs-stream=${STREAM_NAME} \
  com.amazonaws.kinesisvideo.demoapp.DemoAppMain

src/main/resources/data/h264/ 配下の動画ファイルが、指定されたストリームに送信されます。

C Producer

上記の C++/Java 用ライブラリとは別のリポジトリに、ベースとなる C 言語版が存在します。

git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-c.git
cd amazon-kinesis-video-streams-producer-c
mkdir build 
cd build
cmake ..
make

試してはいません。

Discussion