EC2 + gstreamer + Kinesisで動画を流す

# できたこと

EC2インスタンス上で動画を流し、それをAmazon Kinesisで確認することができました
動画の再生、Kinesisへの流し込みにはgstreamerを利用
Kinesisへの接続にはkvssinkエレメントを利用しました

# 必要なもの

| 必要なもの | 用途 |
|:--|:--|
| アクセスキーID | EC2からKinesisにアクセスするために必要 |
| シークレットアクセスキー | EC2からKinesisにアクセスするために必要 |
| EC2インスタンス | gstreamerを実行するために必要 |
| gstreamer | ストリーミングをKinesisに届けるために必要 |
| kvssinkプラグイン | ストリーミングをKinesisに届けるために必要 |
| ビデオストリーム | ストリーミングをKinesisに届けるために必要 |

# 手順

## 目次

1. アクセスキーIDとシークレットーアクセスキーの取得
1. EC2インスタンス作成
1. EC2に gstreamer をインストール
1. Kinesisプラグイン(kvssink)のビルド
1. Kinesis ビデオストリームを作成する
1. EC2インスタンスから Kinesis に画を流してみる

## 詳細

### 1. アクセスキーIDとシークレットーアクセスキーの取得

AWSマネジメントコンソールを開く
https://ap-northeast-1.console.aws.amazon.com/console/home

上のバーの右、ユーザー名をクリックし「マイセキュリティ資格情報」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/57b4bf9b-8839-c564-c7f6-ebf466aab0da.png)
セキュリティ認証情報 のページになるので
「▼アクセスキー (アクセスキー ID とシークレットアクセスキー)」
をクリックし「新しいアクセスキーの作成」を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/daa2cd2c-0828-7d6c-ac4c-723e719346dd.png)
「▼アクセスキーを表示」とすると
- アクセスキーID
- シークレットアクセスキー
が表示されるので、メモする
(ここでメモし忘れると２度と表示されないので注意)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/6d896b24-02cf-3f69-7bbc-d4dc4e8745f4.png)

* アクセスキー ID: (メモする！)
* シークレットアクセスキー: (メモする！)

### 2. EC2インスタンス作成

AWSマネジメントコンソールを開く
https://ap-northeast-1.console.aws.amazon.com/console/home

検索窓に "EC2" と入力し、EC2ダッシュボードを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/7f99453d-9c8d-5ccf-1f4c-0366af3f69d5.png)

EC2インスタンスを生成する

※Dec/Enc/ResizeをGPUは使わずに、CPUでおこなっていますので、
GPUが大きなインスタンスである必要はないですが、
CPUパワーはそれなりに必要です。

EC2へのログイン等々は省略

### 3. EC2に gstreamer をインストール

EC2インスタンスにログインする

3-0. おまじない

```shell
$ sudo apt update
```

3-1. 基本パッケージ

```shell
$ sudo apt install libgstreamer1.0-0 gstreamer1.0-tools
```

3-2. 最低限のプラグイン

```shell
$ sudo apt install gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
  gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav \
  gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa \
  gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio
```

### 4. Kinesisプラグイン(kvssink)のビルド

EC2インスタンスにログインする

クローン

```shell
$ mkdir kvssink
$ cd kvssink
$ git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp
```

必要なプラグイン、ライブラリ、ツール等をインストール

```shell
$ sudo apt update
$ sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base-apps
$ sudo apt-get install gstreamer1.0-plugins-bad gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-tools
```

ビルド

```shell
$ cd amazon-kinesis-video-streams-producer-sdk-cpp
$ mkdir build
$ cd build
$ cmake -DBUILD_GSTREAMER_PLUGIN=ON ..

# 30分くらいかかるので気長に待ちましょう...

$ make -j3
```

確認

```shell
$ export GST_PLUGIN_PATH=$GST_PLUGIN_PATH:/home/XXXXXXXX/kvssink/amazon-kinesis-video-streams-producer-sdk-cpp/build

$ gst-inspect-1.0 kvssink
```

kvssinkに関する情報が出てくれば、kvsskinkが使える状態になっています。


※ ```export GST_PLUGIN_PATH=$GST_PLUGIN_PATH:/home/XXXXXXXX/kvssink/amazon-kinesis-video-streams-producer-sdk-cpp/build``` は ```.bashrc``` などに追加しておくのが良いでしょう(毎回入力は面倒なので)

### 5. Kinesis ビデオストリームを作成する

Amazon Kinesis Video Streams にアクセス
https://ap-northeast-1.console.aws.amazon.com/kinesisvideo/home?region=ap-northeast-1#/

ダッシュボード >>> 「ビデオストリームを作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/5348ee79-a0e0-87d5-d257-d28e5a699683.png)

セットアップ

* ビデオストリーム名：test_stream (適当に決める)
* デフォルト設定

「ビデオストリームを作成」をクリックしてビデオストリームを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/8bba14d2-935a-ad51-81fc-fa3dcba01346.png)

ビデオストリーム名は kvssink に指定する必要があるので、メモしておく

### 6. EC2インスタンスから Kinesis に画を流してみる

#### 6-1. ストリームを見る側(Kinesis)

Amazon Kinesis Video Streams にアクセス
https://ap-northeast-1.console.aws.amazon.com/kinesisvideo/home?region=ap-northeast-1#/

画面の左から「ビデオストリーム」を選択
作成したビデオストリームの一覧が表示されるので、5で作成したビデオストリームを選択

「メディア再生」をクリック

「メディアを検索 ロード中...」と表示され、
しばらくすると「メディアがみつかりません」とダイアログが出るが気にせず放置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/6687099f-c7ea-cc1e-5feb-6f7c147274ed.png)

#### 6-2. ストリームを送る側(EC2)

EC2インスタンスにログインする

① videotestsrc (gstreamer付属のテスト用ビデオソース)

```shell
$ gst-launch-1.0 videotestsrc ! video/x-raw,width=800,height=600 ! x264enc ! video/x-h264,stream-format=avc,alignment=au,profile=baseline ! kvssink stream-name="{ビデオストリーム名}" access-key="{アクセスキーID}" secret-key="{シークレットアクセスキー}" aws-region="ap-northeast-1"
```

② Clip0002.mp4を配信 (MP4ファイルで、動画コーデックはH.264であることを想定)

```shell
$ gst-launch-1.0 filesrc location=Clip0002.mp4 ! qtdemux ! avdec_h264 ! videoconvert ! videoscale ! video/x-raw,format=I420,width=800,height=450 ! x264enc bframes=0 key-int-max=45 bitrate=500 ! video/x-h264,stream-format=avc,alignment=au,profile=baseline ! kvssink stream-name="{ビデオストリーム名}" access-key="{アクセスキーID}" secret-key="{シークレットアクセスキー}" aws-region="ap-northeast-1"
```

あとはお好きに

以上です