[アップデート] AWS Elemental MediaPackageでライブ配信動画からVODクリップを作成できるようになりました (Live-to-VOD)

AWS Elemental MediaPackageでライブ配信動画からVODクリップを作成するLive-to-VOD機能が追加されました。本エントリではこの機能、Harvest jobを実際に作成し、HLS形式のVODクリップを作成してみました。
2019.10.31

はじめに

清水です。AWS Media Servicesの細かなアップデートを追っていくコーナーです。本エントリーでお伝えするのはこちら、動画配信におけるジャストインタイムパッケージングサービスであるAWS Elemental MediaPackageで、ライブ配信動画からVODクリップを作成するLive-to-VOD機能が追加されました!(2019/10/01にポストされたアップデート内容となります。)

ライブ配信動画からVODクリップを作成し公開することを考えた場合、これまで14日以内であればMediaPackageのタイムシフト機能の利用も検討できました。ただこちらはMediaPackageのアーカイブ機能を利用しており14日を超えてのアーカイブができません。14日以上の公開や保存を考えた場合は、別途AWS Elemental MediaLiveからアーカイブ用動画を出力しAWS Elemental MediaConvertで配信形式に変換、などの処理が必要でした。

今回アップデートされたMediaPackageのLive-to-VOD機能では、Harvest Jobというジョブリクエストを作成しMediaPackageのエンドポイントから指定時間のコンテンツを抽出します。抽出先はS3となります。保存用途にも最適ですし、またS3からの配信も行えますね。またVODクリップはHLS形式で作成されますので、MediaPackageのVODパッケージング機能を使っての他形式も含めた配信も可能です。

本エントリでは、実際にMediaPackageのLive-to-VOD機能(Harvest job)を使ってライブ配信動画からVODクリップを作成してみたのでまとめてみます。

MediaPackageのLive-to-VOD機能でVODクリップを作成してみた

それでは実際に、MediaPackageのLive-to-VOD機能を使ってVODクリップを作成してみます。以下のドキュメントを参考に行いました。いくつか要件もあるのであわせてご確認ください。

IAMロールの作成

MediaPackageの設定に入る前に、Harvest job実行時に指定するIAMロールを作成しておきます。手順はドキュメントの下記ページを参考にしました。

IAMポリシーの作成

まずはIAMロールにアタッチするIAMポリシーを作成します。IAMのマネジメントコンソール、ポリシー画面から[Create policy]で進み、JSON編集画面で以下を入力します。{bucket_name}はMediaPackageがアクセスするS3バケット名に置き換えてください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:PutObject",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::{bucket_name}/*",
                "arn:aws:s3:::{bucket_name}"
            ],
            "Effect": "Allow"
        }
    ]
}

今回はポリシー名をMediaPackageLivetoVOD-Policyとしました。ポリシー名などを入力、確認のうえ[Create policy]ボタンでIAMポリシーを作成します。

IAMロールの作成

続いてIAMロールを作成します。こちらもIAMマネジメントコンソール、ロールの画面から[Create role]で進みます。現時点でロール作成時に信頼済みエンティティとしてAWS Elemental MediaPackageが選択できないため、一度EC2を選択しておきます。ロールの作成完了後に信頼関係を編集します。

ポリシー選択画面では、さきほど作成したポリシーMediaPackageLivetoVOD-Policyを選択します。

ロール名などを入力して、[Create role]でIAMロールを作成します。今回はロール名をMediaPackageLivetoVOD-Roleとしました。

IAMロールが作成できたら、さきほどの信頼関係の編集を行います。Trust relationships(信頼関係)のタブから編集画面へ遷移し、JSON中の"Service": "ec2.amazonaws.com"の箇所を"Service": "mediapackage.amazonaws.com"とします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"  // ここを"mediapackage.amazonaws.com"に
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

以上でIAMロールが準備できました。

MediaPackageのChannel作成とライブ配信の開始

続いてMediaPackageでライブ配信を行う設定をします。今回はMediaLive+MediaPackageという構成としました。MediaLiveなど含めた詳細な設定は下記エントリなどをご参照ください。

ここではMediaPackageのEndpoint作成時のポイントをまとめます。ドキュメントの下記部分も確認しましょう。

まずHarvest jobに対してHLSコンテンツを提供する必要がありますので、EndpointをHLSで作成する必要があります。またMediaPackageでタイムシフト再生を可能にするオプションであるStartover windowを設定する必要があります。このStartover windowの値は作成したいクリップの長さ(尺)よりも長くする必要があります。例えばStartover windowの値が60分(=3600秒)であれば、60分より長いVODクリップは作成できません。今回はStartover windowの値が60分(=3600秒)としています。

またHLSについても、暗号化されていないコンテンツである必要があります。もしコンテンツを暗号化する必要がある場合、別途VODクリップ作成用に暗号化なしのEndpointを作成、このEndpointについてはAllow originationを無効にして再生に利用できないようにすることが推められています。(以下、スクリーンショットでは、このAllow originationは無効にしていませんのでご注意ください。)

MediaPackageのChannel、Endpointを作成後、MediaLiveについてもリソースを作成し、ライブ配信を開始しておきます。

Harvest jobの作成

それではいよいよライブ配信動画からVODクリップを作成してみます。VODクリップ作成にはAWSマネジメントコンソールのMediaPackage画面、メニュー項目にあるLive > Harvest jobsを使用します。

[Create job]からHarverst job作成画面に進みます。

Basic detailsではIDとして任意の文字列を入力、Origin endpointとしてさきほど作成したMediaPackageのHLS Endpointを選択します。

Start/End date and timeの項目で作成するVODクリップの開始時間、終了時間を入力します。対象はライブ配信されたもの(つまり過去)であること、また開始時間と終了時間はEndpointのStartover windowの時間内に収まっている必要があります。具体的な開始時間、終了時間はMediaPackageのタイムシフト再生機能を使って確認するのがよさそうですね。

Destinationの項目、IAM roleにはさきほど作成したIAMロールのARNを入力します。S3 bucket nameは出力先となるS3バケットを選択します、IAMロールで権限を付与したS3バケットである必要があります。Manifest keyの項目で出力先S3バケット内でのKeyを設定し、[Create job]でHarvest jobを作成します。

作成後は以下の画面に遷移します。StatusがSucceededに変わったら、抽出先のS3バケットを確認してみましょう。VODクリップとしてHLS形式で出力されていることがわかります。(今回は抽出したVODクリップの尺があまり長くなかったこともありますが、2,3分後には完了していた印象です。)

S3にHLS形式で抽出されれば、あとはCloudFrontと連携して配信したり、またMediaPackageのVODパッケージング機能を使ってmpeg-DASHやCMAF形式に変換して配信することができますね!

今回はシンプルにS3バケットを公開設定にして再生確認してみました。(あまり良い画ではなかったので動画本編はモザイク処理をしています。)再生PlayerはVideo.jsのvideojs-http-streaming(VHS)を使用しています。シークバー部分に注目すると、5分24秒となっています。クリップ作成の開始は2019-10-31T22:17:00+09:00、終了は2019-10-31T22:22:22+09:00と指定したので5分22秒となりますが、ここはドキュメントにもあるとおり、HLSの6秒のセグメントでの抽出となっているようです。

m3u8ファイルについても確認すると、以下のようにすべてのファイルが6秒のセグメントのようでした。

$ curl https://my-s3-bucket.s3-ap-northeast-1.amazonaws.com/201910-mediapackage/live-to-vod-test1/index.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=6993996,AVERAGE-BANDWIDTH=3735732,RESOLUTION=1280x720,FRAME-RATE=29.970,CODECS="avc1.640029,mp4a.40.2"
index_1.m3u8

$ curl https://my-s3-bucket.s3-ap-northeast-1.amazonaws.com/201910-mediapackage/live-to-vod-test1/index_1.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:7
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-MEDIA-SEQUENCE:14
#EXTINF:6.006,
index_1_14.ts
#EXTINF:6.006,
index_1_15.ts
#EXTINF:6.006,
index_1_16.ts
#EXTINF:6.006,
index_1_17.ts
#EXTINF:6.006,
index_1_18.ts
#EXTINF:6.006,
index_1_19.ts
#EXTINF:6.006,
index_1_20.ts
#EXTINF:6.006,
index_1_21.ts
#EXTINF:6.006,
index_1_22.ts
#EXTINF:6.006,
index_1_23.ts
#EXTINF:6.006,
index_1_24.ts
#EXTINF:6.006,
index_1_25.ts
#EXTINF:6.006,
index_1_26.ts
#EXTINF:6.006,
index_1_27.ts
#EXTINF:6.006,
index_1_28.ts
#EXTINF:6.006,
index_1_29.ts
#EXTINF:6.006,
index_1_30.ts
#EXTINF:6.006,
index_1_31.ts
#EXTINF:6.006,
index_1_32.ts
#EXTINF:6.006,
index_1_33.ts
#EXTINF:6.006,
index_1_34.ts
#EXTINF:6.006,
index_1_35.ts
#EXTINF:6.006,
index_1_36.ts
#EXTINF:6.006,
index_1_37.ts
#EXTINF:6.006,
index_1_38.ts
#EXTINF:6.006,
index_1_39.ts
#EXTINF:6.006,
index_1_40.ts
#EXTINF:6.006,
index_1_41.ts
#EXTINF:6.006,
index_1_42.ts
#EXTINF:6.006,
index_1_43.ts
#EXTINF:6.006,
index_1_44.ts
#EXTINF:6.006,
index_1_45.ts
#EXTINF:6.006,
index_1_46.ts
#EXTINF:6.006,
index_1_47.ts
#EXTINF:6.006,
index_1_48.ts
#EXTINF:6.006,
index_1_49.ts
#EXTINF:6.006,
index_1_50.ts
#EXTINF:6.006,
index_1_51.ts
#EXTINF:6.006,
index_1_52.ts
#EXTINF:6.006,
index_1_53.ts
#EXTINF:6.006,
index_1_54.ts
#EXTINF:6.006,
index_1_55.ts
#EXTINF:6.006,
index_1_56.ts
#EXTINF:6.006,
index_1_57.ts
#EXTINF:6.006,
index_1_58.ts
#EXTINF:6.006,
index_1_59.ts
#EXTINF:6.006,
index_1_60.ts
#EXTINF:6.006,
index_1_61.ts
#EXTINF:6.006,
index_1_62.ts
#EXTINF:6.006,
index_1_63.ts
#EXTINF:6.006,
index_1_64.ts
#EXTINF:6.006,
index_1_65.ts
#EXTINF:6.006,
index_1_66.ts
#EXTINF:6.006,
index_1_67.ts
#EXT-X-ENDLIST

まとめ

AWS Elemental MediaPackageに追加されたLive-to-VOD機能、Harvest jobについて確認してみました。VODクリップ作成が簡単にできる、非常に強力な機能だと思います。作成されるファイルがHLS形式であるため、作成したVODクリップを配信するのも容易ですね。抽出されるファイルがセグメント分割されており、抽出時間についてもこれが適用されることにも注意しましょう。セグメント分割されていない1つのファイルとしてライブ配信動画を保存する場合はMediaLiveのArchive機能を利用、MediaConvertなどで変換することになると思いますが、この処理もMediaPackageでできるようになる(=抽出後のファイル形式を選択できる)とさらに強力になるなぁと思いました。(これは今後のアップデートに期待ですね!)引き続き、AWS Elemental MediaPackageをはじめとしたAWS Media Servicesの機能アップデートに注目していきたいと思います。