Wowza Streaming Engine を使った VOD ストリーミングのセットアップ

## はじめに

この記事では、Wowza Streaming Engine で VOD (ビデオ・オンデマンド) でストリーミング コンテンツの配信を行うためのセットアップを行います。

作業の手順は、以下の通りです。

1. アダプティブストリーミング用の VOD ファイルの作成
2. SMIL ファイルの作成
3. ビデオファイルのアップロード
4. Wowza Streaming Engine のセットアップ
5. アダプティブストリーミング再生のテスト

[Big Buck Bunny サイト](https://peach.blender.org/download/) のビデオコンテンツをサンプルとして使うストリーミングコンテンツとします。

> 配信で利用する [ビデオファイル](https://download.blender.org/demo/movies/BBB/bbb_sunflower_1080p_30fps_normal.mp4) はこちらを利用しました。

## 手順1: アダプティブストリーミング用の VOD ファイルの作成

アダプティブストリーミング方式でのストリーミング再生では、プレイヤーのネットワーク接続の帯域幅に合わせて複数のビットレートと解像度のビデオを切り替えながら、ストリーミングビデオを再生します。まず、[FFmpeg ツール](https://ffmpeg.org/) を使って、オリジナルのビデオファイルから、複数のビットレートの MP4 ファイルを作成します。

Ubuntu Linux への FFmpeg のインストールは以下のコマンドを実行します。

```bash
sudo apt install ffmpeg
```

> 参考までに、利用した FFmpeg のバージョンは以下になります。

  ```bash
  $ ffmpeg -version
  ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers
  ```

FFmpeg を使った複数ビットレートの MP4 のトランスコードにあたり、[Gist で公開しているシェルスクリプト](https://gist.github.com/liveinstantly/adfdcdeb8ab2a4ecb7fe2b3844ef5cac)を利用します。以下のコマンドを実行して、ビデオのダウンロード、トランスコードを行います。

```bash
cd ~/
mkdir videos
cd videos
curl -O https://download.blender.org/demo/movies/BBB/bbb_sunflower_1080p_30fps_normal.mp4
curl -LO https://gist.github.com/liveinstantly/adfdcdeb8ab2a4ecb7fe2b3844ef5cac/raw/a2b0272dd06f9676a02cc6f0ff812123e0490742/ffmpeg_abr_transcode.sh
curl -O https://wowzademostorage1.blob.core.windows.net/transcoding/encode_spec_sample.txt
chmod +x ffmpeg_abr_transcode.sh
./ffmpeg_abr_transcode.sh bbb_sunflower_1080p_30fps_normal.mp4 BigBuckBunny-h264-1080p-30fps encode_spec_sample.txt
mkdir bigbuckbunny-1080p-30fps-h264
mv BigBuckBunny-h264-1080p-30fps*.mp4 bigbuckbunny-1080p-30fps-h264/
```

生成された MP4 ビデオファイルは以下の通りです。

```bash
BigBuckBunny-h264-1080p-30fps_0400_320x180.mp4
BigBuckBunny-h264-1080p-30fps_0650_640x360.mp4
BigBuckBunny-h264-1080p-30fps_1000_640x360.mp4
BigBuckBunny-h264-1080p-30fps_1500_960x540.mp4
BigBuckBunny-h264-1080p-30fps_2250_960x540.mp4
BigBuckBunny-h264-1080p-30fps_3400_1280x720.mp4
BigBuckBunny-h264-1080p-30fps_4700_1920x1080.mp4
BigBuckBunny-h264-1080p-30fps_6000_1920x1080.mp4
```

## 手順2: SMIL ファイルの作成

アダプティブストリーミング方式での配信用に SMIL ファイルを作成します。

下記の XML (SMIL) ファイルを `~/videos/bbb_h264_1080p_30fps.smil` に保存します。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<smil title="Big Buck Bunny H264 1080p 30fps Adaptive Bitrate sample content">
    <body>
        <switch>
            <!-- BigBuckBunny-h264-1080p-30fps_0400_320x180.mp4 -->
            <video width="320" height="180" src="bigbuckbunny-1080p-30fps-h264/BigBuckBunny-h264-1080p-30fps_0400_320x180.mp4" systemLanguage="eng">
                <param name="videoBitrate" value="400000" valuetype="data"></param>
                <param name="audioBitrate"  value="64000" valuetype="data"></param>
            </video>
            <!-- BigBuckBunny-h264-1080p-30fps_0650_640x360.mp4 -->
            <video width="640" height="360" src="bigbuckbunny-1080p-30fps-h264/BigBuckBunny-h264-1080p-30fps_0650_640x360.mp4" systemLanguage="eng">
                <param name="videoBitrate" value="650000" valuetype="data"></param>
                <param name="audioBitrate"  value="64000" valuetype="data"></param>
            </video>
            <!-- BigBuckBunny-h264-1080p-30fps_1000_640x360.mp4 -->
            <video width="640" height="360" src="bigbuckbunny-1080p-30fps-h264/BigBuckBunny-h264-1080p-30fps_1000_640x360.mp4" systemLanguage="eng">
                <param name="videoBitrate" value="1000000" valuetype="data"></param>
                <param name="audioBitrate"   value="64000" valuetype="data"></param>
            </video>
            <!-- BigBuckBunny-h264-1080p-30fps_1500_960x540.mp4 -->
            <video width="960" height="540" src="bigbuckbunny-1080p-30fps-h264/BigBuckBunny-h264-1080p-30fps_1500_960x540.mp4" systemLanguage="eng">
                <param name="videoBitrate" value="1500000" valuetype="data"></param>
                <param name="audioBitrate"   value="64000" valuetype="data"></param>
            </video>
            <!-- BigBuckBunny-h264-1080p-30fps_2250_960x540.mp4 -->
            <video width="960" height="540" src="bigbuckbunny-1080p-30fps-h264/BigBuckBunny-h264-1080p-30fps_2250_960x540.mp4" systemLanguage="eng">
                <param name="videoBitrate" value="2250000" valuetype="data"></param>
                <param name="audioBitrate"   value="64000" valuetype="data"></param>
            </video>
            <!-- BigBuckBunny-h264-1080p-30fps_3400_1280x720.mp4 -->
            <video width="1280" height="720" src="bigbuckbunny-1080p-30fps-h264/BigBuckBunny-h264-1080p-30fps_3400_1280x720.mp4" systemLanguage="eng">
                <param name="videoBitrate" value="3400000" valuetype="data"></param>
                <param name="audioBitrate"   value="128000" valuetype="data"></param>
            </video>
            <!-- BigBuckBunny-h264-1080p-30fps_4700_1920x1080.mp4 -->
            <video width="1920" height="1080" src="bigbuckbunny-1080p-30fps-h264/BigBuckBunny-h264-1080p-30fps_4700_1920x1080.mp4" systemLanguage="eng">
                <param name="videoBitrate" value="4700000" valuetype="data"></param>
                <param name="audioBitrate"   value="128000" valuetype="data"></param>
            </video>
            <!-- BigBuckBunny-h264-1080p-30fps_6000_1920x1080.mp4 -->
            <video width="1920" height="1080" src="bigbuckbunny-1080p-30fps-h264/BigBuckBunny-h264-1080p-30fps_6000_1920x1080.mp4" systemLanguage="eng">
                <param name="videoBitrate" value="6000000" valuetype="data"></param>
                <param name="audioBitrate"   value="128000" valuetype="data"></param>
            </video>
        </switch>
    </body>
</smil>
```

> 注意: SMIL ファイルは階層化されたディレクトリには配置できないため、ソースファイルを階層化する場合は `src` 属性を相対パスで記載します。

## 手順3: ビデオファイルのアップロード

Wowza Streaming Engine では VOD 配信用に以下の3つのアプリケーションのタイプがあります。

| タイプ | 説明 |
| --- | --- |
| **VOD** | 単一サーバー向けのアプリケーション (VOD ファイルを読み込み、プレーヤーにストリーミングするために使用します) |
| **VOD Edge** | メディア キャッシュ ソースから VOD ファイルを取り込み、VOD ファイルをプレーヤーにストリーミングするために使用します |
| **VOD HTTP Origin** | ビデオ・オンデマンド ファイルのオリジンとして動作し、HTTP ストリーミング プロトコル (MPEG-DASH および Apple HLS) を使用して HTTP キャッシング インフラストラクチャに配信するために使用します |

Wowza Streaming Engine のインストール後の既定のセットアップでは、"**VOD**" タイプのアプリケーションが自動的にセットアップされていて、既定では `[インストール先のディレクトリ]\content` フォルダから VOD ファイルを読み込みます。

手順1と手順2で作成したファイルを `content` フォルダにコピーしても構いません。

この記事では、メディアキャッシュ機能を使って外部のクラウドストレージにアップロードした VOD ファイルを配信するよう設定します。

外部のクラウドストレージとして、Azure Storage を使ってみます。Azure CLI の手順を以下に説明しますので、「[Azure CLI をインストールする方法](https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli)」を参考に Azure CLI をインストールしてください。

```bash
export AZ_LOCATION=japanwest
export AZ_RESOURCE_GROUP=YourResourceGroup
export AZ_STORAGE_ACCOUNT=wowzavodstorage
az group create --resource-group ${AZ_RESOURCE_GROUP} --location ${AZ_LOCATION}
az storage account create --name ${AZ_STORAGE_ACCOUNT} --resource-group ${AZ_RESOURCE_GROUP} --location ${AZ_LOCATION} --sku Standard_LRS
AZ_STORAGE_KEY=$(az storage account keys list --account-name ${AZ_STORAGE_ACCOUNT} --resource-group ${AZ_RESOURCE_GROUP} | jq -r .[0].value)
az storage container create --name vod --account-name ${AZ_STORAGE_ACCOUNT} --account-key "${AZ_STORAGE_KEY}"
cd ~/videos/
az storage copy -s bigbuckbunny-1080p-30fps-h264 --destination-container vod --account-name ${AZ_STORAGE_ACCOUNT} --account-key ${AZ_STORAGE_KEY} --recursive
```

## 手順4: Wowza Streaming Engine のセットアップ

コンテンツのアップロードが完了したら、以下の手順で Wowza Streaming Engine のセットアップを行います。

### メディアキャッシュの有効化

メディアキャッシュ機能を有効にするには、以下の手順で行います。

1. Wowza Streaming Engine Manager 管理 UI にログインし、上部メニューバーの [**Server**] をクリックします。
2. 左のメニューから [**Media Cache**] をクリックします。
3. "**Status: Enabled**" と表示されている場合は、すでに有効になっているため、以降のステップは必要はありません。
4. **[Enable Media Cache]** ボタンを押します。
5. 画面上部に [**Media Cache enabled. You must restart the server for changes to take effect.**] と表示されたら、**[Restart Now]** ボタンをクリックします。

### メディアキャッシュ ソースの追加

メディアキャッシュソースとして、Azure Blob Storage を追加するには、以下の手順で行います。

1. Wowza Streaming Engine Manager 管理 UI にログインし、上部メニューバーの [**Server**] をクリックします。
2. 左のメニューから [**Media Cache**] をクリックします。
3. [**Source**] タブをクリックし、**[+Add Media Cache Source]** ボタンを押します。
4. 以下のパラメーター情報を入力して、**[+Add]** ボタンをクリックします。

    | パラメーター | 値 |
    | --- | --- |
    | Source Name | Azure Blob Storage のメディアソースキャッシュの任意の名前: 例: `Azure:wowzavodstorage` |
    | Description | Azure Blob Storage のメディアソースキャッシュの説明 (任意) |
    | Source Type | メディアキャッシュソースのタイプ: `Azure` |
    | Prefix | メディアキャッシュソースのプレフィックス: `azblob/` |
    | Blob Storage Account Name | Azure Blob Storage アカウントの名前: `wowzavodstorage` |
    | Blob Storage Account Access Key | Azure Blob Storage アカウント鍵: `${AZ_STORAGE_KEY}` の値 |

## VOD Edge アプリケーションの作成

VOD Edge アプリケーションの作成は、以下の手順で行います。

1. Wowza Streaming Engine Manager 管理 UI にログインし、上部メニューバーの [**Applications**] の ▼ をクリックし、[**Add Application**] をクリックします。
2. VOD Edge のボタンをクリックし、[**Enter a name for your new application**] のテキストボックスに "**vodedge**" と入力し、**[+Add]** ボタンをクリックします。
3. [**Playback Types**] では、配信に必要となる方式の項目をチェックします (ここではすべての項目をチェックします)。
4. [**Media Cache Source**] では、[**All Media Cache Sources are available**] を選択します。
5. [**Closed Caption Sources**] では、配信に必要となる字幕形式の項目をチェックします (ここではすべての項目をチェックします)。
6. **[Save]** ボタンをクリックし、VOD Edge アプリケーション設定を保存します。

## 手順5: アダプティブストリーミング再生のテスト

手順3でコンテンツのアップロードと手順4が完了したら、VOD ファイルの配信ができる状態になります。

SMIL ファイルのメディアキャッシュソースの再生 URL は以下のように構成されます。

> http(s)://**[Wowza Streaming Engine のドメイン名]**/**[VOD Edgeアプリケーション名]**/\_definst\_/smil:**[Media Cache Source Prefix][Media Source の Path]**/**[Manifest]**
>
> **[Manifest]** は playlist.m3u8 または manifest.mpd

VOD コンテンツの再生 URL は、以下の通りです。

| ストリーミング形式 | URL |
| --- | --- |
| HLS | https://_[WowzaStreamingEngineのドメイン名]_/vodedge/\_definst\_/smil:azblob/bbb_h264_1080p_30fps.smil/playlist.m3u8 |
| DASH | https://_[WowzaStreamingEngineのドメイン名]_/vodedge/\_definst\_/smil:azblob/bbb_h264_1080p_30fps.smil/manifest.mpd |

[Web プレイヤー](https://testplayer.demo.liveinstantly.cloud/)を使って、再生のテストを行います。

![VOD再生テスト](https://shigeyf.dev/posts/_streaming/stream-vod-contents-with-wse/./wowza-streaming-engine-vod-play-test.jpg)

> メディアキャッシュ ソース上の MP4 ファイルに対して、RTMP や RTSP での配信も可能です。
>
> 再生 URL の中の "smil:" の代わりに "mp4:" を使います。

## まとめ

この記事では、VOD ファイルをクラウドストレージにアップロードして、Wowza Streaming Engine 経由で
ストリーミング配信を行うための設定を紹介しました。

Wowza Streaming Engine を利用することで、マルチビットレートの MP4 ファイルを Apple HLS, MPEG-DASH などの
ストリーミング形式に変換することができるようになります。

複数の Wowza Streaming Engine サーバーを導入することでスケーラビリティ高い配信を実現することもできます。
また、さらに CDN と組み合わせを行うことで大規模な HTTP ベースのアダプティブストリーミング配信を実現することも可能となります。