はじめに
動画配信を行う構成は色々ありますが、
今回はEC2を2台作成して、マスタプレイリストを使ってHLSを冗長化する構成を試してみます。
構成図
構成はこのようなイメージです。
映像の入力から配信までの経路を2つ用意して冗長化する仕組みになります。
- Main : 配信ソフト - EC2 - S3 - CF - Player
- Backup : 配信ソフト - EC2 - S3 - CF - Player
※動画ファイルをS3に格納してライブ配信する方法は、チームメンバーの記事に掲載されているため割愛します。
➡︎「HLSライブストリーミングサーバーs3配信」
構築の流れ
- 事前にマスタプレイリストを作成し、S3バケットに配置する。
- 配信ソフトからEC2インスタンスのMain/Backup両方にストリームを流す。
視聴側の想定動作
- プレイヤー側ではマスタプレイリストを視聴するため、通常時はMainストリームの方が表示される。
- Main側でインスタンス停止やS3転送が上手くいかない場合は、Backupストリームに切り替わる。
マスタプレイリスト作成
Apple Developer Documentを参考に以下のように作成しました。
(今回はABRを導入しています。)
【参考】
Using HTTP Live Streaming
→「Redundant Streams」
#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ファイルを読み込み続けて、動画がループすることを想定していました。
実際には、一定期間プレイリストが更新されないと別のストリームに切り替わってくれたので、一安心でした。
ブラウザによる挙動が違うという謎は未だ残っていますが……それはまたの機会に。