AWS Elemental MediaLiveでMP4ファイルからライブ配信してみた

はじめに

清水です。ライブ配信を行いたいけれど、映像ソースとしてはその場でカメラなどから撮影した映像ではなく、あらかじめ編集などを通してパッケージされた映像ソースファイルを使用したい、ということがあるかと思います。映像ソースがファイルになっていればVOD配信となるのでは?とも思いますが、いわゆるオンデマンドで視聴できる状態ではなく、視聴者にはリアルタイムで配信したい、という具合です。少しピンときにくいシチュエーションかもしれませんが、例えばTVドラマの放送のイメージです。(いわゆる生放送ではないもの。)定刻に始まり定刻に終わり、視聴者はみなおなじ時点を視聴しています。対して、これをVHSやBetamax、HDDレコーダなどで録画し、視聴者の任意のタイミングで見ることがVODに対応するかと思います。

ということで、このような映像ソースファイルをもとにしたライブ配信を、AWS Elemental MediaLiveを使ってやってみたいと思います。方法の一つとしては、OBS Studioなどの配信エンコーダにて、入力ソースを映像信号ではなくファイルとすることでも実現できるかと思いますが。ただ今回はAWS Elemental MediaLiveにMP4ファイルを入力(Input)として扱う機能がありますので、これを利用します。

AWS Elemental MediaLiveでMP4ファイルを入力として扱う場合は、MP4ファイルがHTTPまたはHTTPSでアクセスできるインターネット上に存在している必要があります。またはS3上のファイルにアクセスすることもできます。先述のOBS Stuidoなど配信エンコーダからファイルを入力ソースとしてライブ配信を行う場合には、ライブ配信中、常にOSB StuidoからMediaLiveへのインターネット接続が必要です。対してAWS Elemental MediaLiveでMP4ファイルを入力とする場合では、いちどファイルをインターネット上にアップロードしてしまえば、あとは配信エンコーダからのインターネット接続が不要になることも特徴ではないでしょうか。

なお今回扱うAWS Elemental MediaLiveでMP4ファイルを入力とする機能、2017/11のAWS Elemental MediaLiveのリリース当初にはなかった機能という認識です。アップデートのタイミングを追えていないのですが、2018/11のInput switching機能が追加されたあたりには実装されていたように記憶しています。(Document History for User Guide - AWS Elemental MediaLive)

MP4ファイルをAmazon S3にアップロード

まずは映像ソースとなるMP4ファイルをAmazon S3にアップロードします。今回は下記からダウンロードできる、Big Buck BunnyのStandard 2D、Full HD (1920x1080)、30fpsのファイルを使用しました。

MediaInfoでファイル情報を確認すると、以下のようになります。

S3へのアップロードは特段変わったことはありません。今回はAWS CLIを使用しました。なお、ユーザーガイドを確認すると冗長構成のため、2箇所(2つのパス)にファイルをアップロードするよう記載があります。ここでもユーザガイドにならい、同じファイルですが2箇所にアップロードしておきます。

$ aws s3 cp ./bbb_sunflower_1080p_30fps_normal.mp4 s3://mybucket/medialive/main/
upload: ./bbb_sunflower_1080p_30fps_normal.mp4 to s3://mybucket/medialive/main/bbb_sunflower_1080p_30fps_normal.mp4

$ aws s3 cp ./bbb_sunflower_1080p_30fps_normal.mp4 s3://mybucket/medialive/redundant/
upload: ./bbb_sunflower_1080p_30fps_normal.mp4 to s3://mybucket/medialive/redundant/bbb_sunflower_1080p_30fps_normal.mp4

MP4 pull inputの作成

続いてMediaLiveでMP4 pull typeのInputを作成します。マネジメントコンソールのMediaLive、Inputsの画面で[Create input]から進みます。Input detailsのInput typeにて、MP4を選択します。

続いてInput source A、Input Source BのURLにそれぞれS3にアップロードしたMP4ファイルのURLを記載します。ファイルがS3にある場合は頭にs3://をつけ、s3://bucket-name/path/to/object.mp4という具合でURLを入力します。

作成後のInputでは、Sourcesの箇所にS3のオブジェクトへのURLが記載されていることがわかります。

MediaLiveのChannel作成と配信の確認

MediaLiveのChannelについては、通常の(映像信号を入力ソースとする、例えばInput typeをRTMP pushにしたときのような)場合と変わりありません。今回はDestinationにMediaStoreを使用して配信を確認してみたいと思います。

Channel作成時、Input attachmentsでは先ほど作成した、MP4 pull inputをアタッチします。

Channle作成後Startさせ、MediaStoreに書き出されるm3u8ファイルを参照してみます。StartさせたタイミングでMP4ファイルの先頭から配信が始まるので、頭が少し途切れてしまいましたが、Big Buck BunnyをHLSライブ配信の形式で視聴ができています。視聴者ごとの時差(映像タイミングのズレ)やHLS機能で巻き戻しが可能か、などはMediaLiveのChannel設定や、DistinationにAWS Elemental MediaPackageを使っていればその設定によるかと思います。

また、実際に映像ソースファイルを入力としてライブ配信を行う場合は、Inputのスイッチングやスケジューリング機能と連携させ、定刻に目的の映像ソースの配信を始める、といったことが良いかと思います。

まとめ

AWS Elemental MediaLiveでMP4ファイルを入力映像ソースとしてライブ配信を行ってみました。これまでも配信エンコーダ側で映像ファイルを入力ソースにする、などをすれば同様のことができたかとは思いますが、映像ファイルのストレージとしてAmazon S3が使用できること、また実際のライブ配信時にはAWS側のリソースのみで完結すること、さらにAWS Elemental MediaLiveのスイッチング、スケジューリング機能などとも連携できることなど、強力な機能だと思います。引き続きAWS Elemental MediaLiveをはじめとしたAWS Media Servicesの機能について、機能アップデートのほか様々な機能の使い方にも注目していきたいと思います。