MediaLiveにおける"With HLS Output groups output must be segmentable"エラーについて 

初めまして。streampackのfadoです。6月に入社し、とても過ごしやすい現場に恵まれると同時に覚えないといけないことがたくさんあってあまり追いつけていない状態です。さては、今回は初投稿ということで研修の際、中々解決できなかったAWS MediaLiveに纏わる課題を紹介したいと思います。

#背景
MediaLive上でHLS配信の設定をするにあたって本題のエラーが発生しました。ネット上での有力な解決法があまり見つからないため、原因究明に時間がかかってしまいました。同じ壁にぶつかった方々の参考になれたらと思い、投稿しました。

本エラーが発生した経緯に重点を置くことにしましたのでOBSソフト、MediaStore、MediaLive、CloudFrontでの細かい設定手順や視聴結果などは割愛させていただきます。

尚、私の説明等に不備や間違いなどがあればご指摘頂けると嬉しいです。
#課題
<img width="1084" alt="product-page-diagram-Elemental-MediaLive@2x.2570dba1da7763ff116d3dc2897e772ff238b63e.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/5077c717-f678-0c43-818d-7ae19a7a07e5.png">

OBSソフト（rtmpプロトコル)でライブ配信を行い、MediaLive上で生成されたHLS用ファイル(m3u8ファイルとtsセグメントファイル）をMediaStoreに格納し、CloudFront経由で動画配信を視聴するという流れとなります。

##課題要件
HLS配信でABR技術を用いてMediaLive上にて下記要件を設定します。

①Bitrate: 2M , 解像度: 1280x720 , FrameRate:30fps
②Bitrate: 1M , 解像度: 960x540 , FrameRate:30fps
③Bitrate: 400k , 解像度: 480x270 , FrameRate:15fps
セグメント長：4s

#再現手順
##MediaStoreのcontainerを作成
![qiitq2019-07-30 17.39.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/c9237ec2-d4cd-41fe-05e0-e8920d59d44d.png)

##CloudFrontをセットアップ
OriginはMediaStoreのEndpointにします。
![スクリーンショット 2019-08-02 11.00.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/957b6c8b-0de1-e289-8965-8b0412048f9e.png)

##MediaLiveのセットアップ
###MediaLiveのInputsを作成
![スクリーンショット 2019-07-30 17.41.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/6bdcb37e-ddc7-a02c-d1bc-dc6512877314.png)
###MediaLiveのChannelを作成し、下記項目を設定
![スクリーンショット 2019-08-01 15.43.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/1e1793dd-8c49-d58c-a25c-5169163ec1ac.png)
1.Channel and input details
2.General settings
3.Input attachments(Add)
4.Output groups

Output groups（Output group type：HLS)を作成した後、課題要件に基づいて各HLS outputsを作成。下記は要件①を設定したものを掲載します。
＊要件以外の値はAWSのデフォルトにしています
![スクリーンショット 2019-07-30 15.33.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/7fe16f92-6798-10e6-954d-62ee6c422c0e.png)

![スクリーンショット 2019-07-30 15.35.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/f2cecc46-50d3-5e48-6333-39fedae2bfcd.png)
![スクリーンショット 2019-08-01 15.24.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/ad8af5ea-f37a-792d-b5b4-d3e80ed4b1e1.png)
![スクリーンショット 2019-08-01 15.24.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/202d6f4c-3b66-22e1-9890-38444704d33c.png)

①〜③の要件の設定が終わりましたら「Update Channel」をクリックします。ここで本題のエラーが出て設定の反映ができなくなります。
<img width="818" alt="スクリーンショット 2019-08-02 17.50.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/1a43e9b6-a88c-e6b1-6b86-07d0e07a2003.png">

#原因
エラー内容を見ると「HLS Output groupsのアウトプットは区分できるようにしないとダメだよ」というふうに解釈ができます。色々と調べた結果、この問題はGOP（Group of Picture)に関係があると分かりました。GOP周期（=GOPサイズ / Framerate）は全てのoutputと同じ値でなければいけないようです。AWSのデフォルト設定だとGOPサイズが60です。Framerate＝30fpsの場合GOP周期は2秒ですが最後の③の要件は15fpsのため、周期が4秒となり、区分できないというエラーが出たわけです。

#解決策
全てのoutputのGOP周期が同じ値になるように調整します。今回はframerate値が決まったのでGOPサイズのみ変更します。この場合、課題要件③、15fpsのOutput用GOPサイズを30に変更することによって全OutputのGOP周期が2秒となり、設定の反映ができるようになりました。

- Frame rate 30の場合、GOPサイズを60にします。Size unitはframesのまま（デフォルト）
![スクリーンショット 2019-06-21 10.14.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/22f0422c-7fa6-d365-8d04-a63178836d76.png)

- Frame rate 15の場合、GOPサイズを30にします。Size unitはframesのまま（デフォルト）
![スクリーンショット 2019-06-21 10.15.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429912/72337b2f-3077-b5c8-4296-e72f191d0a2a.png)

#感想
GOPを含めた動画配信の基礎知識の理解がもっと深かればもう少し早い段階で問題を解決できたのではないかと思いました。AWS MediaService(MediaLive,MediaStore等）がローンチされてからまだ約一年半というのもあって細かいエラーに対しての記事はまだまだ少ない感じがします。これから直面する問題があれば記事にしていきたいと考えています。

#用語
・AWS Media Services
クラウド上で動画ワークフローを構築可能なフルマネージドのメディアサービス群
・AWS Elemental MediaLive
ブロードキャストテレビやマルチスクリーンデバイスに配信するための高品質なライブ動画ストリームのエンコードを可能にする動画処理サービス
・AWS Elemental MediaStore
ライブ配信に必要な高パフォーマンスと即時の整合性を実現する、動画配信およびストレージサービス
・AWS CloudFront
ユーザーへの静的および動的ウェブコンテンツ (.html、.css、.js、イメージファイルなど) の配信を高速化するウェブサービス
・ABR(Adaptive Bitrate streaming)
クライアントのデバイスの通信速度に合わせてビデオの品質レベルを変えながらベストなものを提供する技術
・HLS(HTTP Live Streaming)
Apple社が開発したHTTPベース動画ストリーミング技術
・GOP(Group of Picture)
Iフレーム,Pフレーム,Bフレームの3つに分けて圧縮する技術
#参考資料
https://aws.amazon.com/jp/medialive/
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/Introduction.html
https://docs.aws.amazon.com/ja_jp/mediastore/latest/ug/what-is.html
https://aws.amazon.com/jp/medialive/features/
https://www.wowza.com/blog/adaptive-bitrate-streaming
https://en.wikipedia.org/wiki/HTTP_Live_Streaming
https://developer.apple.com/streaming/
https://aviutl.info/keyframe/