技術部の中野です。
今回は、数ヶ月前のとあるオンラインイベントにおいて、AWSを用いてライブ配信を行いましたのでその紹介です。
なにをやったの?
数ヶ所からReal Time Messaging Protocol(RTMP)にて送られてくるH.264のライブ映像を、HTTP Live Streaming(HLS)に変換し、受信拠点に向けて配信を行いました。
RTMPからHLSへの変換は、自社データセンターで行うことも検討しましたが、動画のエンコード負荷の予測がしづらく、またイベントまでの準備期間が短いこともあり、今回はAmazon Web Services(AWS)を採用することに。
AWSの構成
AWSは、ap-northeast-1(東京)/ap-northeast-2(ソウル)の2つのリージョンに全く同じ構成を用意しました。
ライブ映像は配信拠点よりAWS Elemental MediaLive(MediaLive)のRTMPのエンドポイントに向けて送信し、MediaLiveにてエンコードしてAWS Elemental MediaPackage(MediaPackage)に保管し、受信拠点ではMediaPackageのHLSのエンドポイントからHLSにて映像を受信する流れとなっています。
今回利用したMediaLive/MediaPackageは以下の機能をもったサービスとなっています。
- AWS Elemental MediaLive
- ライブ動画ストリームをエンコードするサービス
- H.264/AVC、H.265/HEVCなどのコーデックに対応
- RTP/HLS/RTMPなどの通信プロトコルに対応
- AWS Elemental MediaPackage
- 動画ストリーミング配信するためのサービス
- MPEG-DASH、MSS、MPEG-2 TS、HLS、CMAFの動画ストリームに対応
- デジタル著作権管理(DRM)対応
AWS Elemental MediaLive/MediaPackageは可用性に優れたサービスですが、このイベント自体が1回限りでリージョン障害等による映像停止のリスクを検討した結果、東京/ソウルの2リージョンに対してライブ映像を送信し、受信側も2リージョンから受信し、万全を期すこととしました。
なお、今回の配信においてAWSの映像の入出力は、以下のようなパラメータにて設定しました。
AWSへの入力 | AWSからの出力 | |
---|---|---|
プロトコル | RTMP | HLS |
解像度 | 1080p(1920×1080) | 1080p(1920×1080) |
コーデック | H.264 | H.264 |
ビットレート | 最大10 Mbps (CBR/VBR) | 4.5 〜 9.0 Mbps(VBR) |
フレームレート | 60 fps | 60 fps |
設定手順
設定は「MediaPackageの作成」「MediaLiveの作成」の順に行います。
ただし本記事ではビットレートとフレームレートの設定は省略しています。
MediaPackageの設定
MediaPackageの設定は「Channelの作成」「Endpointの作成」の順に行います。
Channelの作成
MediaPackageのChannelページを開き、「Create」をクリック。
Channel detailsのIDに適当な名前を入力し、「Create」をクリック。このIDは後のMediaLiveの設定にて使用します。
Endpointの作成
作成したChannelのEndpointsの「Add endpoints」をクリック。
IDに適当な名前を入力し、「Save」をクリック。
Endpointが作成されてChannelのページに戻ります。このEndpointsのURLがHLSにて映像受信するためのURLとなります。
MediaLiveの設定
MediaLiveの設定は「Input security groupの作成」「Inputの作成」「Channelの作成」の順に行います。
Input security groupの作成
MediaLiveのInput security groupsページを開き、「Create input security group」をクリック。
フォームにRTMPの送信元のIPアドレスをCIDR形式(AAA.BBB.CCC.DDD/NN)で入力し、「Create」をクリック。
Inputの作成
MediaLiveのInputsページを開き、「Create input」をクリック。
Input nameに名前を入力し、Input typeは「RTMP(push)」を選択。この名前はChannelの作成にて使用します。
Input security groupは「Use existing」を選択し、先ほど作成した「Input Security Group」を選択。 Input classは「SINGLE_INPUT」を選択。 Destination AのApplication nameとApplication instanceは適当な文字列を入力し、「Create」をクリック。
ここまででInputが作成されます。このEndpointsのURLが、RTMPにて映像送信するためのURLになります。
Channelの作成
MediaLiveのChannelsページを開き、「Create channel」をクリック。
General infoのChannel nameに適当な名前を入力。IAM roleは、初めてChannelを作成する際は「Create role form template」を選択、Channelを作成済みの場合は「Use existing role」を選択しプルダウンよりRoleを選択。
Channel templateはプルダウンより「 HTTP live streaming MediaPackage」を選択。
Channel classは「SINGLE_PIPELINE」を選択。Input codecは「AVC」、Input resolutionは「HD」、Maximum input bitrateは「MAX_10_MBPS」を入力。
Input attachmentsの「Add」をクリック。
InputはMediaLiveのInputで作成したものを選択し、「Confirm」をクリック。
「MediaPackage group」をクリック。
MediaPackage channel IDは、MediaPackageのChannelで作成したものを選択。
HLSではアダプティブビットレートと呼ばれる1つのURLで複数のビットレートに対応した配信が可能となっています。必要なビットレート以外は「✕」をクリックして削除。なお、WebVTTとは字幕などを利用する際に使用するもので、今回使用しません。
「Create channel」をクリック。
「Start」をクリックして、ライブ配信を開始。
配信テスト
作成した環境は、OBS Studioを用いると簡単にテストが可能です。
RTMP送信: OBS Studio
OBS Studioの「設定」→「配信」の画面にて、以下の通り入力することで、MediaLiveに対してRTMP送信が可能です。
設定項目 | 設定内容 |
---|---|
サービス | カスタム |
サーバ | MediaLiveのInputのEndpointのURLのApplication nameまでを設定 |
ストリームキー | MediaLiveのInputのEndpointのURLのApplication instanceを設定 |
HLS受信: MediaPackage
MediaLiveにてエンコード/HLS変換された動画は、MediaPackageのEndpointsのPreviewの「Play」から確認することが可能です。
まとめ
普段、オンプレミスのサーバの構築/運用していますが、単発のイベントなどではAWSなどのクラウドを活用すると、月並みな表現ですが、物理サーバの準備、セットアップの時間、スケーラビリティの観点から非常に有用だと感じました。
ただオンプレミスのサーバと違い、想定していない動作となった場合の切り分けが非常に難しく、Webコンソールに表示される情報のみを頼りに切り分けをするため、見るべきポイント等を事前に把握しておく必要があり、そのノウハウ蓄積が大切だと感じました。
今回は受信拠点のみへの配信だったためCloudFront(CDN)までは不要でしたが、今後、機会があればCloudFrontまで含めた構成を試してみようと思います。