[速報] low-latency HLSにも対応したMediaPackage v2がリリースされました![NEW]

動画配信におけるジャストインタイムパッケージングサービスであるAWS Elemental MediaPackageでLive v2機能がリリースされました。使いやすさとセキュリティの向上、そしてlow-latency HLSのサポートが謳われています。
2023.05.20

はじめに

清水です。AWS Elemental MediaPackageでlow-latency HLSにも対応したMediaPackage v2がリリースされました!AWSマネジメントコンソールならびにAWS Elemental MediaPackage User Guideから確認が可能です。AWS What's Newなどでのポストは現時点(2023/05/20 22:30 JST)で確認できていませんが、取り急ぎ速報としてまとめてみたいと思います。

MediaPackage v2を使ってみた

MediaPackage v2でのリソース作成

マネジメントコンソールからAWS Elemental MediaPackageのページに進みます。左側メニューで「Live v2」の項目がありますね、Channel groupsをクリックして進みましょう。

"Welcome to the new MediaPackage v2 experience!"と出迎えていただけます!使いやすさとセキュリティの向上、そしてlow-latency HLSのサポートが謳われています。

さっそく[Create channel group]ボタンからリソースを作成してみましょう。

Channel group nameとDescriptionを入力して[Create]します。

Channel groupsが作成できました。続いて[Create channel]ボタンからChannelの作成に進みます。

Channelの作成画面です。NameとDescriptionを入力しましょう。そしてChannel policyという設定事項もあります。なにやらクロスアカウントでMediaLiveを利用するときに役立ちそうです。今回は同じアカウントのMediaLiveを使うこととし、「Done't attach a policy」で[Create]します。

Channelが作成できると、続いてOrigin endpointsの画面に遷移します。[Create endpoint]ボタンからEndpointの作成に進みましょう。

Endpoint settingsでNameとDescriptionを入力します。Container typeはデフォルトの「TS」としました。Additional settingsではStartover windowが設定できますね。今回はデフォルトの900秒で進めました。

続いてSegment settings、Encryptionと続きます。これもデフォルトで進めます。

Endpoint policyです。CloudFrontからのみアクセスを許可するといった場合にこちらで設定できそうですね。今回は検証目的としてCloudFront(CDN)は使用せず、またEndpointのアクセス制限も行わないこととするため、「Attach a public policy」を選択します。

最後にManifest定義の設定があります。デフォルトでは以下のような状態ですが、[Add HLS manifest]または[Add LL-HLS manifest]ボタンを押下することで設定項目が現れます。

HLSとlow-latency HLSでのManifest nameの重複は許されていないようでしたので、それぞれ「hls-index」、「ll-hls-index」などとしました。これでEndpointを[Create]します。

Origin endpointが作成できました。これでMediaPackage v2の使用準備は完了です!

動作検証用のMediaLiveリソース作成

MediaPackage v2の動作確認のためのMediaLiveリソースを準備します。MediaLiveのマネジメントコンソール、[Create channel]ボタンから進みます。Channel nameを入力し使用するIAMロールを選択します。この際、以下のようにRoleをUpdateするよう表示されますので、[Update]ボタンを押下しておきましょう。(MediaPackage v2に関する権限のアップデートかと思います。詳細は後述します。)

Channel templateとして「Live event HLS」を選択します。(MediaPackageを使用する場合、通常であればMediaPackageを選択するところですが、Output groupsの設定画面でMediaPackage v2リソースが表示されませんでした。そのため今回はHLSを選択してMediaPackageのEndpointを直接入力する方法をとります。)

Channel classは「SINGLE_PIPELINE」としました。また別途作成してあるrtmp (push)のInputを選択しています。

Output GroupsのHLS group destinationに入力するURLですが、MediaPackage v2のChannelリソース、SettingsのタブでHLS ingest endpointが確認できるのでこちらを入力します。Credentialsについては空欄で進めます。

HLS settingsの項目、CDN SettingsはAWS Elemental MediaLive User Guideの記載から「HLS basic PUT」を選択しました。

HLS outputについて、今回は動作検証が目的ですので「_480p30」と「_240p30」は削除してしまします。

MediaPackage v2ではlow-latency HLSが利用できるということでMediaLive側でもなるべく遅延が少なくなるよう設定します。以下のAWS re:Postの記載内容を参考に、Manifest and SegmentsのSegment Lengthを「1」に変更します。

同様に、HLS outputsの「_1080p30」ならびに「_720p30」について、GOP StructureのGOP Sizeを1秒に変更します。

MediaPackage v2でのライブストリーミング視聴

MediaLive Channelの作成後、ChannelをStartさせます。

MediaLive ChannelがRunning状態に遷移したら、Streaming Softwareから映像を打ち上げます。今回はOBS Studioを使用しました。

MediaPackage v2のマネジメントコンソール、Origin endpointのManifest settingsタブからHLSならびにlow-latency HLS manifestのURLが確認できます。また[Preview]ボタンからはhls.jsでの再生ページに遷移することができます。

以下、Low-latency HLS manifest definitionsの[Preview]ボタンから開いてみた状態です。

気になるlow-latency HLSの遅延についても確認してみましょう。OBS Studioの画面とlow-latency HLS (LL-HLS)、HLSのそれぞれのPreview画面を並べてみました。Streaming Softwareとlow-latency HLSを比べると、遅延は8秒ほどとなりました。今回の検証では例えばAmazon IVSで実現できる2,3秒の遅延とまではいきませんでしたが、通常のHLSでの遅延が27秒と30秒近いことを考えると、low-latency HLSの利用で大きく遅延が改善しているのではないでしょうか。またStreaming SoftwareやMediaLive側などの調整でさらに遅延の改善が期待できるかと思います。

ドキュメントやAPIのアップデートについて

MediaPackage v2について、速報として実際にリソースの作成や動作を確認してみました。マネジメントコンソールは「Live v2」として完全に新しいものとなっていますね。同様にUser Guideも新しい、v1とは別ものとして整理されています。

AWS Elemental MediaPackage Documentation

APIについても同様にv1と別体系となっています。以下、AWS API Changesでの情報になります。こちらは2023/05/19にアップデートされていたようです。(実は筆者はこのAWS API Changesの情報で、MediaPackage v2の存在を知りました。)

またAWS CLIにもこれまでのaws mediapackageaws mediapackage-vodというコマンドに加えてaws mediapackagev2というコマンドが追加されています。こちらも2023/05/19付の更新のようでした。

なお、これまでのMediaPackageの機能は「v1」と称されるようになっています。これらMediaPackage v1について、現在のところ廃止などの告知は確認されませんでした。

まとめ

使いやすさとセキュリティが向上しlow-latency HLSもサポートしたAWS Elemental MediaPackage v2について、速報としてお届けしました。ChannelやOrigin EndpointのPolicyでしっかりとセキュリティを保ちつつほかのAWSサービスなどとの連携が可能になるかと思います。low-latency HLSに対応した点もうれしいポイントですよね。今回は速報としての動作検証目的でしたのでlow-latencyまわりはほぼデフォルト設定で確認したのみでしたが、チューニングによってさらに遅延が小さくなるかと思います。本番運用では必須のCDN、CloudFront連携などもあわせて、引き続き確認を進めていきたいと思います。

おまけ: MediaLiveのIAM Role Updateについて

本エントリ中でMediaLiveのIAM RoleについてUpdateを行いました。変更前と変更後を比べてみるとアタッチされているインラインポリシー「MediaLiveCustomPolicy」に変更があり、mediapackagev2:PutObjectというアクションの許可が追加されていました。

変更前の「MediaLiveCustomPolicy」

Update前のMediaLiveCustomPolicy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "mediastore:ListContainers",
                "mediastore:PutObject",
                "mediastore:GetObject",
                "mediastore:DeleteObject",
                "mediastore:DescribeObject"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:DescribeLogStreams",
                "logs:DescribeLogGroups"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "mediaconnect:ManagedDescribeFlow",
                "mediaconnect:ManagedAddOutput",
                "mediaconnect:ManagedRemoveOutput"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:describeSubnets",
                "ec2:describeNetworkInterfaces",
                "ec2:createNetworkInterface",
                "ec2:createNetworkInterfacePermission",
                "ec2:deleteNetworkInterface",
                "ec2:deleteNetworkInterfacePermission",
                "ec2:describeSecurityGroups",
                "ec2:describeAddresses",
                "ec2:associateAddress"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "mediapackage:DescribeChannel"
            ],
            "Resource": "*"
        }
    ]
}

Update後の「MediaLiveCustomPolicy」

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "mediastore:ListContainers",
                "mediastore:PutObject",
                "mediastore:GetObject",
                "mediastore:DeleteObject",
                "mediastore:DescribeObject"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:DescribeLogStreams",
                "logs:DescribeLogGroups"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "mediaconnect:ManagedDescribeFlow",
                "mediaconnect:ManagedAddOutput",
                "mediaconnect:ManagedRemoveOutput"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:describeSubnets",
                "ec2:describeNetworkInterfaces",
                "ec2:createNetworkInterface",
                "ec2:createNetworkInterfacePermission",
                "ec2:deleteNetworkInterface",
                "ec2:deleteNetworkInterfacePermission",
                "ec2:describeSecurityGroups",
                "ec2:describeAddresses",
                "ec2:associateAddress"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "mediapackage:DescribeChannel"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "mediapackagev2:PutObject"
            ],
            "Resource": "*"
        }
    ]
}