AWS MediaLiveの「Input Loss Action」に要注意！

こんにちは。streampackのtsuchiです。

#はじめに

MediaLiveとMediaPackageの構成で、ライブ配信環境を構築していたところ、
MediaPackageの入力冗長が上手く切り替わらないという問題にハマったので、解決策をここで共有します。

# 構成
**Source×2（RTMP） - MediaLive（HLS） - MediaPackage - CloudFront**

<img width="1084" alt="product-page-diagram-Elemental-MediaLive@2x.2570dba1da7763ff116d3dc2897e772ff238b63e.png" src="https://qiita-image-store.s3.amazonaws.com/0/277934/2d00f143-d63f-1fff-0f0a-160dae13039c.png">
（出典：https://aws.amazon.com/jp/medialive/ ）

# Input Loss Action

MedialiveのHLSアウトプット設定の中に「**Input Loss Action**」という項目があります。
今回の主役（というか黒幕？）は、このパラメータです。

Input Loss Actionは、文字通り**映像入力が喪失したときの挙動を設定するパラメータ**です。
現在は下記の2つの設定値のうち、どちらかを選ぶ仕様になっています。

- **EMIT_OUTPUT**：映像入力が止まっても、黒い画面をアウトプットに流し続ける。
- **PAUSE_OUTPUT**：映像入力が止まると、アウトプットへの送信を停止する。

※ちなみに、**DEFAULT**では「**EMIT_OUTPUT**」となっています。

<img width="795" alt="ScreenShot 2019-03-28 18.05.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/277934/6ec1f695-35c9-04c8-c109-df9089ef6d3d.png">



このパラメータについて、AWSドキュメントには下記の記載があります。
[Fields for the HLS Group - HLS Group Destinations - HLS Settings](
https://docs.aws.amazon.com/ja_jp/medialive/latest/ug/hls-group-fields.html)

>If you're sending output to AWS Elemental MediaPackage, set this field to PAUSE_OUTPUT. In this way, if MediaLive stops producing output on one pipeline, MediaPackage will detect the lack of content on its current input and will switch to the other input. Content loss will be minimized. (If you set this field to EMIT_OUTPUT, MediaLive sends filler frames to MediaPackage. MediaPackage doesn't consider filler frames to be lost content and therefore won't switch to its other input.)

ポイントを要約してみます。

- MediaPackageをOutputに指定している場合は「**PAUSE_OUTPUT**」を設定するように。
- MediaLiveの片方のPipelineが止まった場合、MediaPackageはそれを検知してもう一方のInputに切り替える。
- 「**EMIT_OUTPUT**」を設定すると、（Pipeline停止時に）MediaLiveからMediaPackageにfiller frameを送る。
- MediaPackageはfiller frameを**"コンテンツの喪失"**とはみなさないため、他のInputに切り替えない。

つまり、

**「MediaLiveのInputが止まった場合にもう片方のInputに切り替えたかったら、PAUSE_OUTPUTに設定してね！」**

ということだと僕は解釈しました。

# 検証

2つの設定値でどのような挙動の違いがあるか検証してみます。
MediaLiveのInputにSourceを2本流し込みます。
##1. EMIT_OUTPUTの場合

Input1の入力を止めると、アラートが上がりました。
※Input1（=PipelineA）でストリーム入力が検知できていないことを示しています。

<img width="1671" alt="ScreenShot 2019-03-28 18.36.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/277934/ace483e1-e3e4-b21e-6f7d-5376e941e05d.png">


視聴画面では、動画ファイルの映像から黒い画面に変わり、動画が再生され続けています。
しばらくそのままにしていても、Input2には切り替わりません。

![ScreenShot 2019-03-28 18.32.26.png](https://qiita-image-store.s3.amazonaws.com/0/277934/c5b972b7-75d3-ed00-1e88-06361911b765.png)
##2. PAUSE_OUTPUTの場合

input1を停止させると、ストリーム入力が検知しないのは先程と同様。
ただ、視聴画面は先程と違って黒い画面にはならずに、Input2に送った動画に切り替わりました。
![ScreenShot 2019-03-28 18.30.12.png](https://qiita-image-store.s3.amazonaws.com/0/277934/3722e527-27a0-d2f2-7cd2-31371b960da2.png)
# おわりに

MediaLiveとMediaPackageの構成を組む際に、注意が必要なパラメータを紹介しました。
設定値1つだけで、再生時の挙動が大きく変わってしまうのは怖いですね…

ポチポチと設定できてしまうAWSマネージドサービスだからこそ、
公式ドキュメントには目を通しておく必要があるという教訓を得ました。

ということで、MediaLiveとMediaPackageを使用して冗長化させたい場合は、
「Input Loss Action」を**PAUSE_OUTPUT**にするのをお忘れなく！！
# 参考

[AWSドキュメント : 入力冗長の仕組み](https://docs.aws.amazon.com/ja_jp/mediapackage/latest/ug/what-is-flow-ir.html)
[AWSドキュメント : Fields for the HLS Group - HLS Group Destinations - HLS Settings](
https://docs.aws.amazon.com/ja_jp/medialive/latest/ug/hls-group-fields.html)