Streaming Serverを利用したライブストリーミング

# やりたいこと
監視カメラなどの映像をスマートフォンで確認する場合、カメラのIPアドレスを指定したり、WebRTCを利用したりしてP2Pで直接メディアストリームを受信する方法が利用できます。ただ、カメラ映像を複数ユーザーが同時視聴したい場合、ネットワークやカメラのスペック上難しい場合がありサーバーで経由する必要があります。

今回はStreaming ServerをAWS上に立ててサーバー経由でのライブストリーミングを試作し、遅延時間を実測してみたいと思います。

# Streaming Server
以下にStreaming Serverの比較が掲載されている。
https://en.wikipedia.org/wiki/Comparison_of_streaming_media_systems

今回は対応プロトコルが多いWowza Streaming Engineを利用して試作を行う。
https://www.wowza.com/

<img width="749" alt="スクリーンショット 2017-08-15 10.34.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/6ff8af2c-f84e-5c42-84fc-bc9f85ab41da.png">


# Wowza Streaming Engineの立ち上げ
Wowzaのページで試用版のライセンスを購入します。アカウントの作成が必要です。
https://www.wowza.com/free-trial

登録が完了すると以下のようなメールでライセンスキーが発行されます。
<img width="563" alt="スクリーンショット 2017-08-15 9.44.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/61b0e49d-fb9e-904d-0479-5a83cd8af47c.png">

Market Placeで"Wowza"と入力して検索。
https://aws.amazon.com/marketplace

試用ライセンスを利用するので、2段目の"Bring Your License”を選択します。
<img width="762" alt="スクリーンショット 2017-08-15 9.49.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/d085fe97-adbf-c64a-afb7-7e18ffdc786b.png">

セットアップウィザードを進めて、デフォルトでインスタンスを起動。デフォルトではWowzaで推奨の"m3.large"が選択されます。
<img width="724" alt="スクリーンショット 2017-08-15 9.59.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/7fddae9f-2985-35e7-a853-f033a6f9872e.png">

# Wowza Streaming Engineの設定
http://[EC2のPublic DNS]:8088/enginmanagerで設定画面に接続可能です。

<img width="804" alt="スクリーンショット 2017-08-15 10.33.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/fd57fe87-a7e9-0701-9992-680bb81588a0.png">

初期IDは"wowza"、パスワードは起動したインスタンスのID（i-xxxxxx)となります。

<img width="570" alt="スクリーンショット 2017-08-15 10.35.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/fe77cedf-6d81-2504-fc88-ddfcef2a4ce8.png">

ログイン直後にSouce Authenticationの設定が求められると思います。これは、カメラが映像をStreaming Engineに送信するための認証設定で後に必要となります。設定した情報は、Sever -> Source Authenticationで確認できます。

<img width="1038" alt="スクリーンショット 2017-08-15 11.04.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/ea03b989-b73b-6143-879b-2a3fcd8882e7.png">

Applicationを選択し、Liveを選択します。今回はiPhoneをカメラとして利用しますので、GoCoderを選択し、Host Server / Host Portの情報を確認しておきます。

<img width="752" alt="スクリーンショット 2017-08-15 11.31.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/ecf11595-587c-1380-802d-34e314a5d897.png">

<img width="1045" alt="スクリーンショット 2017-08-15 11.38.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/fa946c59-6eca-9b7b-1754-5feac3787868.png">

# GoCoderの設定
iPhoneもしくはAndroidでGoCoderアプリケーションをインストールします。アプリケーション起動後にWowza Streaming Engineの以下の3項目の設定を入力して下さい。

* Host - 先ほど確認したサーバーのIPアドレスとポートナンバー
* Application - liveとストリーム名を選択
* Source Authentication - 先ほど設定したユーザ名とパスワード

上記の設定完了後に赤丸を押して配信を開始して下さい。

# 動作確認
まずRTMPのストリームが1本入っていることを確認します。

<img width="710" alt="スクリーンショット 2017-08-15 12.04.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/5ffa7436-e25b-1307-7c5b-6d915d995705.png">

右上のTest Playersを選択し、About HLSを選択するとURLが表示されるので、URLでブラウザで確認します。そうするとライブ映像の確認ができました。

<img width="457" alt="スクリーンショット 2017-08-15 12.17.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/a4f93d83-dcaf-b5ae-990d-c43b5dff3df1.png">

# 遅延時間の計測
両方向のネットワークがLTEであることもありますが、Camera ==RTMP==> Wowza Streaming Engine ==HLS==> Web Browserの経路ではほぼ40秒の遅延があることがわかりました。

HLSの場合もともと通信の安定性を考慮したプロトコルで低遅延のプロトコルではありません。10秒ごとのチャンクに切られて、遅延が15秒から45秒という仕様通りの挙動が確認できました。

HLS以外のプロトコルを選択することで遅延は減らせられそうです。以下のWowzaのページにも詳細が記述されています。RTMPもしくはWebRTCを選択するということになりそうです。

https://www.wowza.com/products/capabilities/low-latency