【解決】WowzaからHLSをS3へプッシュする方法

案外これ探してる人も多いかと思います。個人的な備忘録としてもまとめておこうかと

いつもは個別の固定ページでWowza関連をまとめてますが、今回はモジュールの話なので記事にしてみました

なお、本家のWowzaのページだと、この辺が実はまとまってません(今のところですが)

ただ、実はgithubの方でHLS to S3が可能なモジュールが公開されていたりします

https://github.com/WowzaMediaSystems/wse-example-pushpublish-hls

分かる人はこのリンク先のSample Implementationを参照するだけで大体できると思いますが、私が実際に動かしてみて動作した方法を以下にまとめたので、これを見た方がより確実だと思います

動作環境

まず、私が動作させた環境は以下の通りです

Wowza Stremaing Engine 4.7.7(Linux)

別にWindowsでも動くと思いますが、Windowsだと動作がもっさりするので、私はいつもLinux版を使っています

wse-example-pushpublish-hlsの設定

Sample Implementationの順序をそのまま日本語訳してるだけみたいな感じになりますが、後半では実際に動かした設定も載せます

1)wse-example-pushpublishing-hls.jarをWowzaをインストールしたディレクトリ配下のlibフォルダにコピーします

2)confフォルダ内のPushPublishProfilesCustom.xmlをテキストエディタで開きます

多分、最初はこのような感じになっていると思います

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <PushPublishProfiles>
        <PushPublishProfile>
            <Name>profilename</Name>
            <Protocol>protocol</Protocol>
            <BaseClass>classpath</BaseClass>
            <UtilClass>utility classpath</UtilClass>
            <Implementation>
                <Name>destinationname</Name>
            </Implementation>
            <HTTPConfiguration>
            </HTTPConfiguration>
        </PushPublishProfile>
    </PushPublishProfiles>
</Root>

これを以下のように変更します

<PushPublishProfile>
    <Name>cupertino-file</Name>
    <Protocol>HTTP</Protocol>
    <BaseClass>com.mycompany.wms.example.pushpublish.protocol.cupertino.PushPublishHTTPCupertinoFileHandler</BaseClass>
    <UtilClass></UtilClass>
    <Implementation>
     <Name>Cupertino File</Name>
    </Implementation>
    <HTTPConfiguration>
    </HTTPConfiguration>
</PushPublishProfile>
<PushPublishProfile>
    <Name>cupertino-http</Name>
    <Protocol>HTTP</Protocol>
    <BaseClass>com.mycompany.wms.example.pushpublish.protocol.cupertino.PushPublishHTTPCupertinoHTTPHandler</BaseClass>
    <UtilClass></UtilClass>
    <Implementation>
     <Name>Cupertino HTTP</Name>
    </Implementation>
    <HTTPConfiguration>
    </HTTPConfiguration>
</PushPublishProfile>

そのまま上書きでもいいですが、ちゃんと確認してから行うようにしてください

3)Stream Targetsの機能をWowza Streaming Engine上で有効にし、Wowzaをリスタート

この時、Stream Targetsには何も設定されている感じが無いと思いますが、それでOKです

4)confフォルダ内にあるPushPublishMap.txtの中身を書き換え(超重要)

とりあえずサンプルは以下の通りです

cupertino-fileはローカル接続されているフォルダに対して出力する際に使用します

cupertino-httpはS3やその他WebサーバーなどへHLSをプッシュする際に使用します

#cupertino-file entries
myStream={"entryName":"myStream", "profile":"cupertino-file", "streamName":"myOutputStream", "destinationName":"filesystem", "file.root":"c:\temp\hlsfile"}

myStream={"entryName":"myStreamBackup", "profile":"cupertino-file", "streamName":"myOutputStream", "destinationName":"filesystem", "file.root":"c:\temp\hlsfile", "destinationServer":"backup" }

myStream={"entryName":"myStreamRedundant", "profile":"cupertino-file", "streamName":"myOutputStream", "destinationName":"filesystem", "file.root":"c:\temp\hlsfile", "destinationServer":"redundant" }

#cupertino-http entries
myStream={"entryName":"myStream-http", "profile":"cupertino-http", "streamName":"myOutputStream", "destinationName":"webserver", "host":"example.com", "http.path":"hls"}

myStream={"entryName":"myStreamBackup-http", "profile":"cupertino-http", "streamName":"myOutputStream", "destinationName":"webserver", "host":"example.com", "http.path":"hls", "destinationServer":"backup" }

myStream={"entryName":"myStreamRedundant-http", "profile":"cupertino-http", "streamName":"myOutputStream", "destinationName":"webserver", "host":"example.com", "http.path":"hls", "destinationServer":"redundant" }

最初見たときにある程度理解できましたが、色々と不明な箇所もありました

実際に私が使用した設定はこちらです

live1={“entryName”:”live1″, “profile”:”cupertino-http”, “streamName”:”live1″, “destinationName”:”webserver”, “http.playlistCount”:”3600″, “host”:”s3.wasabisys.com”, “http.path”:”whls”}
streamnameやentryNameは全てlive1に統一していますが、これは変更しても問題ありません
出力先は、この設定のままで行くと私が個人的に契約しているS3と互換性100%のWasabiストレージに投げることになるので、ここは適宜S3を使う場合はS3のURLに変更したり、各種Webサーバーへ投げる場合は、WebサーバーのIPアドレスなりホスト名を入力してください
続けてベースとなるバケットの名前(パス)をhttp.pathに入力してください
例えば、私の使っているWasabiの場合は、以下のようなパスに投げる事になります
https://s3.wasabisys.com/whls
設定が完了したら、PushPublishMap.txtを保存し、Wowza Streaming Engineを再起動してください
5)実際に動かしてみる
OBSなり何なりで、とりあえずlive1というストリーム名でWowzaに投げ込んでみましょう
すると、S3の指定したバケットの中にlive1-2というフォルダが作成されると思います
このフォルダの名前は、entryNameとstreamnameをlive1-3のように変更すると、S3にはlive1-3というフォルダが自動作成されます
自動作成された各種バケットの中に、これまた自動でランダム名称のフォルダが自動生成されます(live1-2/83d8r1u7など)
実際に作成されたフォルダ構造はこのようになります
m3u8ファイルが複数できていますが、これはplaylist.m3u8の配下にchunklist.m3u8がぶら下がる形になります
複数解像度の設定をした場合に使用するのだと思いますが、今回はシングルビットレートでしかテストしていません

総括

とりあえず複雑ではありますが、WowzaからHLSでS3などのストレージに直接出力する事が出来る事が分かりました

最後にとても重要な事を書きますが、実はこの出力方法にはバグ?が含まれており、Wowzaのheapサイズが最大になるとハングアップして止まってしまうという致命的な問題があります

具体的には、Wowzaの内部に蓄積されるTSファイルのファイルサイズが、合計で10GBもしくは9.8GBぐらい?になるとWowza自身がハングアップするという問題です

解決するにはWowzaを再起動するしかないので、当然HLSやMP4などで収録していた場合はダウンタイムが発生します

2018/12/01現在、この問題は改善されていません。メーカー側で修正してくれるとより使いやすくなるんですけどね・・・

【追記】

上記のエラーですが、解決したようです。これで結構汎用的に使えるようになりそうです

というわけで、この辺に注意して使えば割と便利に使える機能だと思いますよ