Wowza Streaming Engineのスケジュール機能はこうやって使うのだ！

どうも、streampackのfadoです。今年も残りわずかになりましたね。まあ色々と大変な一年ではありましたが、自分にとっては成長できた年かなと思います。今回の主役は`Wowza Streaming Engine`です。まず`Wowza Streaming Engine`(以下 Wowza)って何？というところからですが、一言で言うと多機能なメディアサーバソフトウェアのことです。基本的に有料なのですが[Trialライセンス](https://www.wowza.com/free-trial)もあり、制限はあるものの検証用として十分活用出来るので、触ってみたいという方は是非お試し下さい。この記事では最近使うことが多くなったWowzaのスケジュール機能の設定方法についてご紹介していきたいと思います。

#注意事項
* WowzaサーバーはAWSクラウド上で構築され、OSはAmazon Linux 2を採用しています。
* スケジュール機能が利用できるのはWowza Streaming Engine 4.0.0以降となります。
* 本環境のWowzaバージョンは4.8.8 (build 20201203191143)です。
* Wowzaサーバーの構築手順はスコープ外なので割愛させて頂きます。英語ですがサーバーのインストールとセットアップについては[こちら](https://www.wowza.com/docs/how-to-install-and-configure-wowza-streaming-engine)をご参考下さい。
* Wowzaサーバーの操作にある程度知見がある方を対象にしています。
* フリー素材のmp4を使っています。
 * http://www.caminandes.com/

#スケジュール機能でできること

* 擬似ライブ配信が可能です。
* ライブ配信の間に映像（蓋映像等）を設置することが可能です。
* ウェブサイトにiframeを埋め込んで動画をループで流すことができます。

#設定方法
Wowzaのスケジュール機能は標準機能ではないため、プラグインのインストールからのセットアップが必要です。Wowzaのインストールフォルダーは`/usr/local/WowzaStreamingEngine`とします。尚、`livetest`というアプリケーション名(Live HTTP Originタイプ)を新規作成し、例として説明を進めます。

##プラグインのセットアップ
1.Wowzaサーバーに下記URLからプラグインをダウンロードします。
https://www.wowza.com/downloads/forums/collection/wse-plugin-streampublisher.zip

```
$ wget https://www.wowza.com/downloads/forums/collection/wse-plugin-streampublisher.zip
```
2.unzipした後に`lib/wse-plugin-streampublisher.jar`を`/usr/local/WowzaStreamingEngine/lib`にコピーします。

```
$ unzip wse-plugin-streampublisher.zip && sudo cp -v lib/wse-plugin-streampublisher.jar /usr/local/WowzaStreamingEngine/lib
```
3.反映させるためにWowzaサービスを再起動します。

```
$ sudo systemctl restart WowzaStreamingEngine.service
```

##Server ListenersとModulesの設定
###Server Listeners
WowzaのServer Listenerでの設定を有効にします。こちらの設定はサーバーレベルのもので全てのアプリケーションに適用されます。
`Wowza Streaming Engine Manager`コンソールにログインし、`Server -> Server Setup -> Server Listenersタブ`を開いて下記Class Nameを追加します。

|  Fully Qualified Class Name |
|:-:|
|com.wowza.wms.plugin.streampublisher.ServerListenerStreamPublisher  |

設定後
![スクリーンショット 2020-12-24 21.42.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/9561cebe-29f8-0c88-554f-519480c124e9.png)

**＊設定の反映にはWowzaサービスの再起動が必要です。**

###Modules
WowzaのModuleでの設定を有効にします。こちらの設定はアプリケーションレベルのものでで対象アプリケーションにのみ適用されます。
`Applications -> Application名(ここではlivetest)-> Modulesタブ`を開いて下記を追加します。

| Name | Description | Fully Qualified Class Name |
|:-:|:-:|:-:|
| streamPublisher  |  Schedules streams and playlists. | com.wowza.wms.plugin.streampublisher.ModuleStreamPublisher  |

設定後
![スクリーンショット 2020-12-24 22.05.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/80b0d71c-38e6-564c-713d-13b0049b40cb.png)
**＊設定の反映にはアプリケーションを再起動する必要があります。**

##Propertiesの設定
###Server Properties
* `Server Properties`はサーバーレベルでしか設定出来ません。

`Applications -> Application名 -> Propertiesタブ`を開いてからCustomをクリックします。下記を追加して下さい。

| Path | Name | Type | Value | Notes |
|:-:|:-:|:-:|:-:|:--|
| /Root/Server  | streamPublisherVHost  | String | _defaultVHost_  | スケジュールがロードするVHostを指定する(デフォルト: _defaultVHost_)  |
|  /Root/Server | streamPublisherApplication  |String   | livetest/_definst_  | スケジュールがロードするapplication/applicationを指定する(デフォルト: live/_definst_)  |

設定後
![スクリーンショット 2020-12-24 23.34.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/dbd0e2f0-d8e6-894d-f272-2695d767565e.png)
**＊設定の反映にはWowzaサービスの再起動が必要です。**

###Application Properties
* `Application Properties`はサーバーレベル、またはアプリケーションレベルにて設定することができます。両方に設定の記述があった場合、アプリケーションの設定が優先されます。
* Pathはサーバーレベルなら`/Root/Server`、アプリケーションレベルなら`/Root/Application`というように指定します。この例ではアプリケーションレベルで設定します。
* 設定可能Propertiesはたくさんありますが今回はメインなプロパティーのみを紹介します。他のPropertiesについてこちらのWowzaの[ドキュメント](https://www.wowza.com/docs/how-to-schedule-streaming-with-wowza-streaming-engine-streampublisher#application-properties)をご参照下さい。

`Applications -> Application名 -> Propertiesタブ`を開いてからCustomをクリックします。下記を追加して下さい。

| Path | Name | Type | Value | Notes |
|:-:|:-:|:-:|:-:|:--|
| /Root/Application  | streamPublisherSmilFile  | String  | streamschedule.smil  | アプリケーションが使用するスケジュールファイル。 SMILファイルと呼ばれ、コンテンツストレージフォルダー内に格納する必要がある。この場合は/usr/local/WowzaStreamingEngine/content/になる。(デフォルト: streamschedule.smil) |

設定後
![スクリーンショット 2020-12-24 23.46.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/b9e206c8-38a0-f34b-1af8-f751bd65250c.png)
**＊設定の反映にはアプリケーションを再起動する必要があります。**

##スケジュールの設定

* スケジュール機能を利用したいアプリケーションは自身のSMILファイルを設定する必要があります。ファイル名は先ほど説明した`Application Properties`の`streamPublisherSmilFile`プロパティーで指定します。尚、SMILファイルの格納場所はストレージコンテンツフォルダーであり、この場合は`/usr/local/WowzaStreamingEngine/content/`になります。
* `Wowza Streaming Engine Manager`コンソール上でもSMILファイルの設定項目がありますがこの機能では使えません。サーバーにログインして該当ファイルを作成及び修正しないといけません。

`streamschedule.smil`ファイルを作成し、次のように記述します。テスト目的のためストリームは一つのみにします。

```bash

<smil>
    <head>
    </head>
    <body>

        <stream name="Stream1"></stream>

        <playlist name="pl1" playOnStream="Stream1" repeat="true" scheduled="2020-12-25 00:00:00">
            <video src="mp4:caminandes_llamigos_480p.mp4" start="0" length="-1"/>
        </playlist>

    </body>
</smil>
```
変更可能な部分を説明します。

* `<stream name="Stream1"></stream>` 
 * **name** = ストリーム名を指定します。
* `<playlist name="pl1" playOnStream="Stream1" repeat="true" scheduled="2020-12-25 00:00:00">`
 * **name** = プレイリスト名を指定します。
 * **playOnStream** = streamで指定したストリーム名を記入します。
 * **repeat** = trueならプレイリストがループします。falseならプレイリストが終わると同時にストリームも終了します。
 * **scheduled** = ストリームをいつ開始させるかを指定する。Wowzaサーバーのタイムゾーンと時刻をベースに作動します。日付が過去の場合、ストリームが即座に開始します。
* `<video src="mp4:caminandes_llamigos_480p.mp4" start="0" length="-1"/>`
 * **src** = VODと擬似ライブの場合、mp4のソースファイルを指定します。ソースファイルはSMILファイルと同じフォルダー内に設置する必要があります。この例では`/usr/local/WowzaStreamingEngine/content/`配下になります。
 * **start** = VODと擬似ライブの場合は`0`または開始したい時間(秒)を指定します。ライブの場合は`-2`にします。
 * **length** = ストリーム時間(秒)を指定します。最後までストリームを流したい場合、`-1`にします。

#確認
サーバーの設定に問題なければ下記のようにストリームが入っていることが分かります。表示されない時はWowzaサービスを再起動してみて下さい。
`Applications -> Application名 -> Incoming Streams`で確認出来ます。

![スクリーンショット 2020-12-25 1.21.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/b1b69b45-fdf4-fa64-d656-589287bac9f3.png)

ストリームの開始時刻(先述のscheduledパラメータで指定した値)が未来の場合、ストリームのStatusが`Active`になっていますがストリームの信号自体は流れていません。ストリーム名をクリックし、詳細を見るとBytes Inが`0`であることが確認出来ます。

![スクリーンショット 2020-12-25 1.29.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/9684e27a-30ec-05e8-23b3-29554c84e8d3.png)

指定した開始時間になるとストリーム信号が実際に流れてきてBytes Inの値が変動しているのをみて分かります。
![スクリーンショット 2020-12-25 1.45.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/ed99a356-c77b-3cde-9aaa-0c6767d3850a.png)

HLSプロトコルでの視聴になりますが問題なく出来ています。
![スクリーンショット 2020-12-25 1.55.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/32fc9a63-71c5-d510-3a3d-e791433a3d4c.png)

補足ですがHLSでのデフォルトの視聴URLは下記の通りです。
`http://[Public IP]:1935/Application名/ストリーム名/playlist.m3u8`

今回の環境ではALBを挟んでポート80/tcpからポート1935/tcpにフォワードするように設定していますので私の環境では下記URLです。尚、テスト目的のため、TLS通信は有効にしていませんのでご了承下さい。
`http://[ALBのDNS名]/livetest/Stream1/playlist.m3u8`

#結論
今回はトランスコード設定なしで紹介しましたが、ABR技術と組み合わせればさらに活用できる場面が広がると思います。ただ使ってみて感じたのは確かに便利な機能ですが、Wowzaの管理画面でスケジュールの変更や修正が出来ない点は少し不便です。あとスケジュール機能をout-of-the-box状態で使うことができたらいいなと思います。`AWS Elemental MediaLive`にもスケジュール機能があり、ウェブコンソールで設定が完結していることを考えるとWowzaの運用面での使いやすさはまだまだ改善できるのかなというのは正直な感想です。

あとAPIを使ってスケジュールをロード、リロード、アンロードすることも出来ますが設定方法は省かせて頂きます。個人的にはサーバーを再起動させた方が早かったりしますので。追加コンテンツとしていつか紹介できたらいいなとは思っています。それではメリークリスマス＆良いお年を！

#参考文献
https://www.wowza.com/docs/how-to-schedule-streaming-with-wowza-streaming-engine-streampublisher