Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

動画配信を行う構成は色々ありますが、
今回は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ファイルを読み込み続けて、動画がループすることを想定していました。

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away