MacでAmazon Kinesis Video Streamを試してみた

#はじめに
Android端末でストリーミング動画の再生と保存を実現する必要があったので、まずは手元のMacで試してみることにしました。
C++プロデューサーSDKをGStreamerプラグインとして使用します。
以下のREADME.mdを参考にしています。

https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp

#Kinesis Video Streamとは
デバイスからAWSクラウドへのビデオのライブストリーミングに使用したり、あるいはリアルタイムのビデオ処理やバッチ指向のビデオ分析のためのアプリケーションを構築できる完全管理のAWSのサービスです。
用意されているSDKを使用することで、デバイスのメディアソースをAWSにストリーミングして`再生、保存、分析、機械学習`などを実行できます。

https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/what-is-kinesis-video.html

#プロデューサーSDKの準備
まずは`git clone`でC++プロデューサーSDKをGitHubからダウンロードします。

```
$ git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git
```
ダウンロードしたリポジトリに`build`ディレクトリを準備します。

```
$ cd amazon-kinesis-video-streams-producer-sdk-cpp
$ mkdir build
$ cd build 
```
必要なライブラリを取得します。

```
$ brew install pkg-config openssl cmake gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad gst-plugins-ugly log4cplus gst-libav
```

buildディレクトリでcmakeを実行し、GStreamerサンプルプログラムを含めてビルドします。

```
$ cmake .. -DBUILD_DEPENDENCIES=OFF -DBUILD_GSTREAMER_PLUGIN=ON
```

ここで、私の環境では以下のようなエラーが発生しました。

###エラー内容と解決方法

```
  Compatibility with CMake < 2.8.12 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value or use a ...<max> suffix to tell
  CMake that the project does not need compatibility with older versions.


-- Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY OPENSSL_INCLUDE_DIR) 
CMake Error at dependency/libkvscproducer/kvscproducer-src/CMakeLists.txt:118 (message):
  OpenSSL is not found.  Make sure to export PKG_CONFIG_PATH to where
  OpenSSL's pc file is
```
opensslがうまくリンクされていなかったようです。
`brew link`で解決できました。

```
brew link openssl --force
```

`cmake`を実行した後、buildディレクトリで`make`を実行します。

```
$ make
```

以下のように出力されれば、コンパイル完了です。

```
[ 38%] Built target kvspic
[ 58%] Built target kvspicUtils
[ 68%] Built target kvsCommonCurl
[ 79%] Built target cproducer
[ 89%] Built target KinesisVideoProducer
[ 91%] Built target kvs_gstreamer_multistream_sample
[ 92%] Built target kvs_gstreamer_audio_video_sample
[ 94%] Built target kvs_gstreamer_file_uploader_sample
[ 95%] Built target kvs_gstreamer_sample
[100%] Built target gstkvssink
```

#GStreamerプラグインを使用して実行

以下は、buildディレクトリではなく、リポジトリのルートから実行します。

```
$ export GST_PLUGIN_PATH=`pwd`/build
$ export LD_LIBRARY_PATH=`pwd`/open-source/local/lib
$ gst-inspect-1.0 kvssink
```
上記が問題なく実行できれば、ストリーミングの実行が可能です。

以下のように、実行するとKinesis Video Streamのコンソール上でストリーミング動画を確認できます。音声は入りません。

```
gst-launch-1.0 autovideosrc ! videoconvert ! video/x-raw,format=I420,width=1280,height=720 ! vtenc_h264_hw allow-frame-reordering=FALSE realtime=TRUE max-keyframe-interval=45 bitrate=512 ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=baseline ! kvssink stream-name=MyKinesisVideoStream storage-size=512 access-key="YourAccessKeyId" secret-key="YourSecretAccessKey" aws-region="ap-northeast-1"
```


音声を含めてストリーミングする場合は、以下を実行します。

```
gst-launch-1.0 -v avfvideosrc ! videoconvert ! vtenc_h264_hw allow-frame-reordering=FALSE realtime=TRUE max-keyframe-interval=45 ! kvssink name=sink stream-name="MyKinesisVideoStream" access-key="YourAccessKeyId" secret-key="YourSecretAccessKey" aws-region="ap-northeast-1" osxaudiosrc ! audioconvert ! avenc_aac ! queue ! sink.
```
実行すると、Kinesis Video Streamに"MyKinesisVideoStream"というストリーム名でビデオストリームが作成されました。
![スクリーンショット 2021-03-21 10.55.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410068/ac4d6688-7b4d-bb98-e591-652c3e69436a.png)

`メディア再生`のタブを開くと、ストリーミング映像が確認できます。
`クリップをダウンロード`からMP4形式でダウンロードすることができます。
![スクリーンショット 2021-03-21 10.55.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410068/94c56242-d845-9f64-7c8b-f5ee881e578d.png)

###Macでの実行例
Macでの様々な実行例が以下に記載されています。

https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/docs/macos.md#running-the-gst-launch-10-command-to-start-streaming-both-audio-and-raw-video-in-mac-os

#おわりに
Android端末でも試してみました。
Android端末では、AndroidプロデューサーライブラリとAmazon Cognitoを使用してストリーミングすることができます。
以下を参考にして手順通りに実行すると、スムーズにストリーミングできました。

https://docs.aws.amazon.com/ja_jp/kinesisvideostreams/latest/dg/producer-sdk-android.html