マスタプレイリストによるHLS冗長構成


はじめに

動画配信を行う構成は色々ありますが、
今回はEC2を2台作成して、マスタプレイリストを使ってHLSを冗長化する構成を試してみます。

構成図

構成はこのようなイメージです。
映像の入力から配信までの経路を2つ用意して冗長化する仕組みになります。

  • Main : 配信ソフト - EC2 - S3 - CF - Player
  • Backup : 配信ソフト - EC2 - S3 - CF - Player

 
※動画ファイルをS3に格納してライブ配信する方法は、チームメンバーの記事に掲載されているため割愛します。
➡︎「HLSライブストリーミングサーバーs3配信」

構築の流れ

  1. 事前にマスタプレイリストを作成し、S3バケットに配置する。
  2. 配信ソフトからEC2インスタンスのMain/Backup両方にストリームを流す。

視聴側の想定動作

  1. プレイヤー側ではマスタプレイリストを視聴するため、通常時はMainストリームの方が表示される。
  2. Main側でインスタンス停止やS3転送が上手くいかない場合は、Backupストリームに切り替わる。

マスタプレイリスト作成

Apple Developer Documentを参考に以下のように作成しました。
(今回はABRを導入しています。)

【参考】
Using HTTP Live Streaming
→「Redundant Streams」

master_playlist.m3u8
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=400000,RESOLUTION=480x270
https://xxxxxxxxxxxxx.cloudfront.net/main/teststream_a_low.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=400000,RESOLUTION=480x270
https://xxxxxxxxxxxxx.cloudfront.net/backup/teststream_b_low.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1000000,RESOLUTION=960x540
https://xxxxxxxxxxxxx.cloudfront.net/main/teststream_a_mid.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1000000,RESOLUTION=960x540
https://xxxxxxxxxxxxx.cloudfront.net/backup/teststream_b_mid.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2000000,RESOLUTION=1280x720
https://xxxxxxxxxxxxx.cloudfront.net/main/teststream_a_high.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2000000,RESOLUTION=1280x720
https://xxxxxxxxxxxxx.cloudfront.net/backup/teststream_b_high.m3u8

検証

Safariの開発モードで動画を視聴する。
「開発」タブ - 「Webインスペクタを表示」 - 「ネットワーク」

通常時

マスタプレイリストの順番が上に記述されているメインストリームの方が表示されることを確認できました。
想定通りの挙動となりました。

障害時

Main/Backup両方のインスタンスにストリームを流している状態で、
Mainインスタンスを停止させます。

結果、わずかな寸断のみで、Backupストリームの動画に切り替わることが確認できました。

 
ちなみに、Video.jsを利用してChromeから確認したところ、
切り替わるタイミングで、下記のようなメッセージが出力されました。

VIDEOJS: WARN: Problem encountered with the current HLS playlist. Playlist no longer updating. Switching to another playlist.

<Google翻訳>:現在のHLSプレイリストで問題が発生しました。プレイリストが更新されなくなりました。別のプレイリストに切り替えます。

このように、Redundant Streamsでは、
一定期間プレイリスト(m3u8ファイル)が更新されないと、別のストリームに切り替わる挙動となることが分かりました。

ブラウザによる違い

上記のようにSafariでは冗長化は問題なく、障害時にBackupの方に切り替わりことが確認されました。
ただ、Chromeでは、上手く切り替わる時と切り替わらない時があり、挙動は安定しませんでした。

おわりに

今回の検証を行う前は、インスタンス停止だとS3にプレイリストとtsファイルが残ってしまい、
プレイヤーではS3に残ったtsファイルを読み込み続けて、動画がループすることを想定していました。

実際には、一定期間プレイリストが更新されないと別のストリームに切り替わってくれたので、一安心でした。
ブラウザによる挙動が違うという謎は未だ残っていますが……それはまたの機会に。