OBSとWowza Streaming Engineを使ってApple Low-Latency HLSライブストリーミング配信してみる

2021.01.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS上に構築したWowza Streaming Engineを使い、Apple Low Latency HLS でライブストリーミング配信してみます。 どれぐらい遅延が解消されるのか気になります。

構成

OBS

ローカルPCにインストールしたOBSをエンコーダーとして使用します

インストーラーのDLはこちら

Wowza Streaming Engine

Apple Low Latency HLSに対応したWowza Streaming EngineをEC2上に構築します(構築手順は割愛)。

OSはAmazon Linux2です。

Wowza StreamingEngineをインストール に沿ってインストールしました。

ライセンスは無料トライアルのものを使います。

Wowzaのアカウントも必要ですので、free-trialからWowza Streaming Engineのトライアルを申し込みます。

また、 aws marcketplaceから構築することも可能です。

THEOPlayer

Low Latency HLSを再生できるプレイヤーとしてTHEOPlayerを使用します。

LL-HLSの再生を試すことのできるページがありますので、そこを使います

TEST YOUR LL-HLS STREAM

Wowza Streaming EngineでLow-Latency HLSをストリーミングする設定

Wowza Streaming Engineの構築が終わった後、LL-HLSを配信するための設定を行っていきます。

HTTPSで配信できるようにする

LL-HLS再生は、SSL/TLSで保護されたポートがないと機能しないため、証明書を取得して設置する必要があります。

今回はWowza StreamLockというサービスを使い証明書を取得します。

証明書取得

アカウント管理ページをブラウザで開き、StreamLockのタブをクリックします。

Wowza Streaming Engineのライセンスキーを選択し、Wowza Streaming EngineをインストールしたEC2インスタンスのPublic IPアドレスを入力して証明書を申請します。

申請完了後、ページ下部にダウンロードリンクが表示されるのでクリックして取得しまう。

また、Hostnameはストリーミングの再生に必要ですので控えておきます。

ダウンロードする際、証明書のパスワードを設定する必要があります。

ここで設定したパスワードは、Wowza Streaming Engineを構成するときに入力する必要がありますので控えておきます。

証明書をインストール

ダウンロードした証明書(.jks)ファイルをWowza Streaming EngineをインストールしたEC2インスタンスの[install-dir]/confフォルダーにコピーします.

今回はLinuxの環境なのでパスは /usr/local/WowzaStreamingEngine/conf/ です。

証明書を使用したアクセスができるようにWowza Streaming Engineの設定を行う

StreamLockで取得した証明書を使用できるように構成します。

Wowza Streaming EngineでVirtual Hostを設定してあげることで可能となります。

Virtual HostはApacheのように複数のサイトに対応できる設定で、1つのWowza Streaming Engineライセンスで使えます。

StreamLockで払い出されたxxxxxxx.streamlock.net を Wowza Streaming EngineをインストールしたEC2インスタンスで利用する ということです。

設定するには、 Wowza Streaming Engine Manager (http://<<EC2のPublic DNS or IP>>:8088/enginemanager) にアクセスし、 Serverタブをクリック、 Virtual Host Setup メニューを開きます。

ページ上のEditボタンをクリックし、Add Host Portボタンを押します。

追加フォームが表示されるので、以下の内容を設定して追加します。

Name host portのカスタム名
Type Streaming
IP Address ワイルドカード文字として機能するアスタリスク(*)を入力します。ワイルドカード(*)を使用すると、すべてのネットワークインターフェイスでトラフィックをリッスンできます。特定のネットワークインターフェイスのIPアドレスを指定できます。これにより、指定したインターフェイスへのトラフィックが制限されます。
Port 443
Enable SSL/StreamLock チェックする
Keystore Path (StreamLock certificate path) インストールしたStreamLockの証明書(.jksファイル)の場所を指定します。上記のように、StreamLock証明書が[install-dir]/confディレクトリにある場合は、次のように入力します。${com.wowza.wms.context.VHostConfigHome}/conf/<<インストールした証明書名>>
Keystore Password (StreamLock certificate password) StreamLock証明書のパスワードを入力します。これは、[アカウント管理]ページの[ StreamLock]タブから証明書をダウンロードしたときに作成したパスワードです。
Use WebRTC (Wowza Streaming Engine 4.8.5以降)この設定を選択すれば、ホストポートがWebRTCシグナリングをサポートできるようになります。WebRTCのホストポートを有効にした後、[アプリケーション]タブと[WebRTC]ページを使用して、WebRTCストリームを取り込んで再生するようにアプリケーションを構成します。

追加後、Saveボタンを押して保存し、ページの右上にあるRestartを押してVirtual Hostを再起動します

Wowza Streaming EngineでLL-HLSを有効にする設定

Wowza Streaming EngineがLL-HLSストリームを生成する方法ですが、

Wowza Streaming Engine は CMAF packetizer(cmafstreamingpacketizer)を使用してLL-HLSストリームを生成します。packetizerは、LL-HLSに必要なビデオとオーディオの部分的なセグメントとして使用されるチャンクを作成します。LL-HLSストリームはfMP4コンテナフォーマットを使用し、HTTP/2 を介してプレイヤーに配信されます。

とドキュメントに記載されています。

以下の手順でLL-HLSストリームを生成できるように設定していきます。

まずは、Wowza Streaming EngineをインストールしたEC2インスタンスにsshログイン/Session Manager等を利用して接続します。

Application.xmlの修正

[DIR-インストール]/conf/liveのApplication.xmlをエディタで開きます、

cd /usr/local/WowzaStreamingEngine/conf
sudo vi live/Application.xml

<Streams>要素にある <LiveStreamPacketizers>プロパティに cmafstreamingpacketizer を追加します。

<Streams>
~~~
    <LiveStreamPacketizers>cmafstreamingpacketizer,cupertinostreamingpacketizer, mpegdashstreamingpacketizer, sanjosestreamingpacketizer, smoothstreamingpacketizer</LiveStreamPacketizers>
~~~
</Streams>

<LiveStreamPacketizer>要素のPropertyに cmafLLEnableLowLatencyをtrueにするよう追加します。・

<LiveStreamPacketizer>
    <Properties>
        <Property>
            <Name>cmafLLEnableLowLatency</Name>
            <Value>true</Value>
            <Type>Boolean</Type>
        </Property>
    </Properties>
</LiveStreamPacketizer>

<HTTPStreamers>要素にcupertinostreamingが指定されているか確認します。なければ追加します。

<HTTPStreamers>cupertinostreaming, smoothstreaming, sanjosestreaming, mpegdashstreaming</HTTPStreamers>

VHost.xmlの修正

[DIR-インストール]/confのVHost.xmlをエディタで開きます、

cd /usr/local/WowzaStreamingEngine/conf
sudo vi VHost.xml

<SSLConfig>要素に、AllowHttp2プロパティを追加します。

<SSLConfig>
    <AllowHttp2>true</AllowHttp2>
    ~~~~
</SSLConfig>

LL-HLSプロパティのオプション設定

今回は必要項目以外は全てデフォルト設定で行いますが、カスタムすることも可能です。

参考情報:

Serverの設定

サーバーへのRTMPベースおよびRTSPベースのソース接続を保護するために認証を設定しておきます。

設定するには、 Wowza Streaming Engine Manager (http://<<EC2のPublic DNS or IP>>:8088/enginemanager) にアクセスし、 Serverタブをクリック、 Source Authentication メニューを開きます。

Add Sourceボタンを押して、 User NameとPasswordを設定します。

この情報はのちに出てくるOBSの配信設定で使用します。

Applicationsの設定

Wowza Streaming Engine Manager (http://<<EC2のPublic DNS or IP>>:8088/enginemanager) にアクセスし、 Applicationsタブをクリック、 デフォルトで追加されているアプリケーションliveのメニューを開きます。

Editボタンを押して、Low-latency stream (ideal for chat applications)のオプションにチェックを入れて保存します。

保存後、Applicationを再起動します。

Virtual Hostの再起動も行っておきます。

配信、視聴確認

設定が終わったので、実際に配信をして視聴できるか確認してみます

配信設定

OBSを使ってrtmpで送ります。

出力の設定を以下のように変更します

出力モード 詳細
キーフレーム間隔 1 or 2
チューン zerolatency

配信の設定を以下のように変更します。

サービス カスタム
サーバー rtmp://<>:1935/<<liveアプリケーション名>>
ストリームキー 任意の名前
認証を使用する 認証設定をしているならチェックを入れ、ユーザー名とパスワードを入力

配信開始

OBSで配信開始ボタンを押して配信します。接続が成功すると以下のような画像のようになります。

Liveの時間が進んでいっているかと思います。

Wowza Straming Engine Managerでも確認してみます。

ApplicationsIncoming Streams を確認すると、OBSから配信しているストリーム名が表示されます。

視聴確認

LL-HLSのストリームを視聴できるか確認してみます。

THEOPlayerのTEST YOUR LL-HLS STREAMにアクセスします。

ストリームの選択に、Insert Your Ownにし、LL-HLSの配信URLを入力します。

Wowza Straming Engineのストリーム再生URLは、

cmafstreamingpacketizerのみが有効の時

  • Single bitrate
    • https://[address]/[application]/[application-instance]/[stream-name]/playlist.m3u8
  • Adaptive bitrate
    • https://[address]/[application]/[application-instance]/smil:[stream-name].smil/playlist.m3u8

cmafstreamingpacketizerと cupertinostreamingpacketizerが有効になっている場合

  • Single bitrate
    • https://[address]/[application]/[application-instance]/[stream-name]/playlist_sfm4s.m3u8
  • Adaptive bitrate
    • https://[address]/[application]/[application-instance]/smil:[stream-name].smil/playlist_sfm4s.m3u8
  • [address]は、IPアドレスまたはドメインとポート(デフォルトのポート443)です。

  • [application]はWowza Straming Engine Managerで設定したアプリケーション名です
  • [application-instance]は、アプリケーションインスタンスの名前です(省略した場合、デフォルトは definstになります)
  • [stream-name]はストリーム名です

今回の設定では、cmafstreamingpacketizerと cupertinostreamingpacketizerが有効で、 ドメインはStreamLockを使用し, アプリケーション名はlive, ストリーム名はOBSで設定したものであるので

URLは

https://<<StreamLockで払い出されているランダム値>>.streamlock.net/live/<<OBSで指定>>/playlist_sfm4s.m3u8

自身の値に置き換えてテストページにセットします。

再生ボタンを押すと配信映像が見れます。

最後に

Wowza Straming Engineを使ってApple LL-HLSでのライブストリーミング配信をしてみました。

今回の環境だと、Wowza Straming Engineのインスタンスをt2-microにし、LL-HLSのパラメーターはデフォルトで行いましたが、 遅延は5秒ほどで安定していました。

Wowza Straming Engineのスペック、CMAFのパラメータチューニングなどで1秒〜2秒にすることも可能かと思います。

※ 今後別記事で CMAFパケットについて、チューニングを行った結果などがPOSTされる予定ですのでしばらくお待ちください。

参考