7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-30

はじめに

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

構成図

スクリーンショット 2018-11-26 12.19.10.png

構成はこのようなイメージです。
映像の入力から配信までの経路を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ファイルを読み込み続けて、動画がループすることを想定していました。

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

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?