Wowza Streaming Engine の配信動画からフレームを切り出す

## はじめに

Wowza Streaming Engine （以下、WSE）で配信している動画からフレームを切り出したい！

というわけで、公式のドキュメントに沿ってやってみました

https://www.wowza.com/docs/how-to-generate-thumbnail-images-of-live-streams

API 経由で切り出せるようなので、意外と簡単にできそうですね

## 実行環境

- macOS Big Sur 11.5
- OBS Studio 27.0.1
- Docker 20.10.7
- Wowza Streaming Engine 4.8.12+1

## REST API によるサムネイル取得

ドキュメントによると、設定を変更してから API にアクセスすればサムネイルとしてフレームの画像が取得できるようです

以下のコードを _/Library/WowzaStreamingEngine/conf/VHost.xml_ の Port 8086 の _HTTPProviders_ に追加して再起動します

```xml
<HTTPProvider>
	<BaseClass>com.wowza.wms.transcoder.thumbnailer.HTTPProviderGenerateThumbnail</BaseClass>
	<RequestFilters>thumbnail*</RequestFilters>
	<AuthenticationMethod>none</AuthenticationMethod>
</HTTPProvider>
```

Java　の実装をわざわざしたくないので、公式ドキュメントの一番下に書いてある REST API にアクセスしてみます

> http://[wowza-ip-address]:8086/thumbnail?application=[application-name]&streamname=[stream-name]&size=[width]x[height]&fitmode=[fitmode]&crop=[left],[right],[top],[bottom]&format=[png,jpg]

```bash
curl "http://localhost:8086/thumbnail?application=webcam&streamname=myStream&size=1280x720&format=jpeg"
```

、、、アレ？

待てど暮らせど何も返ってこない、、、

というわけで、実はトランスコーダー設定が必要でした

https://www.wowza.com/docs/how-to-set-up-and-run-wowza-transcoder-for-live-streaming#enable-the-transcoder2

公式ドキュメントを参考にセットアップしてみましょう

> Enable the Transcoder
> 1. In the Applications contents panel, select your live application, and then click Transcoder. Then in the details page, click Enable Transcoder.

メニューから _Transcoder_ をクリックするわけですね、、、

![スクリーンショット 2021-07-28 18.57.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/2ec1376e-344e-598c-a433-11bfaf7d0c24.png)

、、、そんな項目ありませんが

別のところを見ると、そもそも macOS 版はトランスコーダーに対応していませんでした

https://www.wowza.com/docs/about-wowza-transcoder#software-requirements1

> Transcoder is supported only on 64-bit versions of Windows and Linux. A 64-bit Java runtime is also required. 32-bit versions of Windows and Linux aren't supported. The macOS operating system isn't supported, either.

## Docker で WSE

というわけで、 Docker の出番です

https://www.wowza.com/docs/how-to-set-up-wowza-streaming-engine-using-docker

まずは今ローカルで動いているものを停止します

```bash
sudo launchctl unload -w /Library/LaunchDaemons/com.wowza.WowzaStreamingEngineManager.plist
sudo launchctl unload -w /Library/LaunchDaemons/com.wowza.WowzaStreamingEngine.plist
```

公式ドキュメントに従って、以下のようにコンテナを実行します

```bash
docker run -it --name wowza \
  --restart always \
  --expose 1935/tcp \
  --expose 8086/tcp \
  --expose 8087/tcp \
  --expose 8088/tcp \
  --publish 1935:1935 \
  --publish 8086:8086 \
  --publish 8087:8087 \
  --publish 8088:8088 \
  --volume <ローカルのパス>:/usr/local/WowzaStreamingEngine/logs \
  --entrypoint /sbin/entrypoint.sh \
  --env WSE_MGR_USER=<ユーザー名> \
  --env WSE_MGR_PASS=<パスワード> \
  --env WSE_LIC=<ライセンスコード> \
  --env WSE_IP_PARAM=127.0.0.1 \
  wowzamedia/wowza-streaming-engine-linux
```

一瞬で立ち上がりました

今まで一生懸命 macOS 版で動かしていた意味は、、、

Docker　上は Linux 版で動いているので、しっかり _Transcoder_ の項目が出ています

![スクリーンショット 2021-07-28 19.07.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/137715ab-34ce-3ac3-717e-947de7d0540d.png)

_Enable Transcoder_ をクリックします

![スクリーンショット 2021-07-28 19.09.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/3ed81d94-64e6-2437-9e25-b3ec2fc55c2e.png)

そして、ローカルでやったのと同じように `VHost.xml` を編集します

起動中のコンテナに入ります

```bash
docker exec -it wowza bas
```

コンテナ内に vim が無かったので入れます

```bash
apt-get update
apt-get install vim
```

そして編集します

Linux の場合のパスは `/usr/local/WowzaStreamingEngine/conf/VHost.xml` です

```bash
vi /usr/local/WowzaStreamingEngine/conf/VHost.xml
```

保存後、 _Server_ タブの右上 _Restart_ で WSE を再起動します

![スクリーンショット 2021-07-28 19.24.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/031a7c84-160d-bead-ca9b-5adb37cfcd77.png)

_Incoming Streams_ を見ると、トランスコーダーのストリームが増えています

![スクリーンショット 2021-07-28 19.26.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/19d03b1a-ae50-8c83-3af1-df797c1bc7b5.png)

## フレーム取得

この状態で改めて REST API にアクセスしましょう

```bash
curl "http://localhost:8086/thumbnail?application=webcam&streamname=myStream&size=1280x720&format=jpeg" > myStream.jpg
```

無事フレーム画像が取得できました！

![スクリーンショット 2021-07-28 19.30.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/7b85e41c-d74b-5352-3607-708ed8ced287.png)

右下に Wowza のロゴが透かしで入っているのは、おそらく無料トライアルのライセンスだからです

## 終わりに

念の為、 Transcoder を無効化してからもう一度再起動してフレーム取得すると、、、

なぜか取得できました :sweat: 

macOS ではできなかったのに、、、

とりあえず、 Linux 版では問題なくフレーム取得できそうです

やっぱり技術検証するには Docker を使うのが一番ですね