映像をAWSに渡し、変換してから視聴したい(MediaConnectとMediaConvert)

記事タイトルとURLをコピーする

こんにちは、矢野(喬)です。
今回はAWS Elemental MediaConnectとAWS Elemental MediaConvertを使って、映像をAWSに取り込み、変換する構成を試してみました。

AWS公式ハンズオンの以下2つ両方を試すような形です。

HLS VOD 配信 :: AWSで動画配信をはじめよう
映像伝送 :: AWSで動画配信をはじめよう

構成図

f:id:swx-kyosuke-yano:20210214151824p:plain

外からの映像をAWSに取り込み、AWS Elemental MediaLiveで配信をアーカイブ、アーカイブされたライブ映像をmp4ファイルに変換してCloudFrontから視聴する構成

手順概要と構築順

前述通りAWS公式ハンズオン2つを参考にしながら進めます。

MediaConnect

  • ffmpegを使って自端末からMedia Connectへ映像データを伝送
  • MediaLiveがMedia Connectからの映像データを引き受け、S3にアーカイブとして保存する

MediaConvert

  • S3にアーカイブされた.tsファイルを.mp4ファイルに変換するジョブを作成

CloudFront

  • 変換された.mp4をCloudFrontから視聴できるように設定
  • OAIを使ってバケットへのアクセスを制御

構築順

1.MediaConnect設定
2.MediaLive設定
3.動画配信とアーカイブ
4.MediaConvert設定
5.CloudFront設定
6.視聴確認

  • MediaLive、CloudFrontの基本設定については本記事では省略します

手順詳細

1.MediaConnect設定

1-1.AWS Elemental MediaConnectに移動し、「Create flow」をクリック f:id:swx-kyosuke-yano:20210215192523j:plain
1-2.以下項目を入力しflowを作成

  • Name
    • 本ブログでは handson-flow
  • Availability Zone
    • Any
  • Source Type
    • Standard source
  • Source Name
    • 本ブログでは handson-source
  • Protocol
    • RTP-FEC
  • Inbound Port
    • 5000
  • Whitelist CIDR block
    • 自分のグローバルIP/32
  • Source description
    • 不要
  • Maximum bitrate - optional
    • 不要 f:id:swx-kyosuke-yano:20210215192804j:plain
      1-3.作成したFlowからSources→Inbound IP addressとARNを控える f:id:swx-kyosuke-yano:20210215193242j:plain
      1-4.作成したFlowからSources→Inbound IP addressとARNを控える




2.MediaLive設定

2-0.AWS Elemental MediaLiveにて、以前の記事にて作成したチャンネルの「Channel Acctions」から、「Download custom template」でテンプレートをダウンロードしておけば、次回から簡単にチャンネル設定を行うことが可能です
今回もこのテンプレートを用いて設定します f:id:swx-kyosuke-yano:20210105174039j:plain
2-1.Input → Create inputをクリックし、以下の通り入力し作成 f:id:swx-kyosuke-yano:20210216200759j:plain f:id:swx-kyosuke-yano:20210216200812j:plain

  • 入力名 
    • 本ブログでは hanson-input としました
  • 入力タイプ
    • MediaConnect
  • Channel class
    • SINGLE_PIPELINE
  • フローAのARN
    • 1-4.で控えたMediaConnectのARN
  • ロールARN
    • テンプレートからロールを作成 → MediaLiveAccessRole
    • 既にある人は「既存のロールの使用」

2-2.「チャネルの作成」をクリック f:id:swx-kyosuke-yano:20201114210654j:plain
2-3.「Channel template」の「Select custom template」から、事前にダウンロードしておいたテンプレート.jsonを選択します
キャプチャのように各設定が入力されますが、一部設定はこの後に手動設定が必要です f:id:swx-kyosuke-yano:20210105174921j:plain
2-4.残りの設定をそれぞれ設定します。詳細は以前の記事にありますが、MediaPackageからS3のアーカイブに変更する部分が異なります

  • Channel name (任意)
  • Input attachments (2-1.で作成したInputを選択)
  • Output groups (MediaPackageは削除)


2-5.Output groupsにS3アーカイブを追加
Output groupsから「Add」を押下し、Archiveを選択します
f:id:swx-kyosuke-yano:20210216201300j:plain

2-6.Archive設定でS3バケットを指定
URLに s3ssl://{S3バケット名}/ファイル名 の形で指定します f:id:swx-kyosuke-yano:20210216201441j:plain

2-7.各設定を埋め、「Create channel」をクリックしMediaLiveチャンネル作成 f:id:swx-kyosuke-yano:20201114231137j:plainf:id:swx-kyosuke-yano:20201114231140j:plain

3.動画配信とアーカイブ

3-1.映像データをAWSに伝送するために自端末に ffmpeg をインストール
Releases · BtbN/FFmpeg-Builds · GitHub
環境にあったものをインストール願います

3-2.伝送する映像データを準備
今回は EC2にログインして配信開始 :: AWSで動画配信をはじめよう に記載されている動画を使わせていただきます

wget https://aws-mediaservices-jp.workshop.aws/handson8/_index.ja.files/file_example_MP4_1920_18MG.mp4

3-3.インストールした ffpmeg を使ってMediaConnectに映像を伝送
コマンドはffmpegの実行ファイルがあるパスに、サンプル動画も配置して実行しています
rtp以降は1-2.と1-4.で設定したポート、IPアドレスを記載してください

$ ./ffmpeg -stream_loop -1 -re -i file_example_MP4_1920_18MG.mp4 -c copy -map 0 -f rtp_mpegts -fec prompeg=l=5:d=20 rtp://{コピーしたMediaConnectのIP}:5000

下記のように映像伝送されている様子が流れたらOKです

ffmpeg version N-101082-gbbf6183e11 Copyright (c) 2000-2021 the FFmpeg developers
  built with gcc 9.3-win32 (GCC) 20200320
~ 中略 ~
frame=    0 fps=0.0 q=-1.0 size=       0kB time=00:00:00.53 bitrate=   0.0kbits/s speed=1.
frame=    8 fps=8.0 q=-1.0 size=     125kB time=00:00:01.00 bitrate=1017.4kbits/s speed=0.
frame=   18 fps= 12 q=-1.0 size=     377kB time=00:00:01.51 bitrate=2041.2kbits/s speed=
frame=   33 fps= 16 q=-1.0 size=    1025kB time=00:00:02.02 bitrate=4141.4kbits/s speed=
frame=   48 fps= 19 q=-1.0 size=    2031kB time=00:00:02.56 bitrate=6499.0kbits/s speed=1.
frame=   64 fps= 21 q=-1.0 size=    3704kB time=00:00:03.05 bitrate=9946.1kbits/s speed=
frame=   79 fps= 22 q=-1.0 size=    5145kB time=00:00:03.58 bitrate=11759.4kbits/s speed=1
~


3-4.MediaConnectにて、作成したFlowをStartし、ステータスがActiveになることを確認
f:id:swx-kyosuke-yano:20210217194807j:plain 3-5.しばらくするとSourceのステータスが Connected に切り替わります
f:id:swx-kyosuke-yano:20210217195118j:plain f:id:swx-kyosuke-yano:20210217195115j:plain
3-6.映像がAWSに伝わったので、MediaLiveで作成したチャネルから「開始」をクリック。チャネルの状態が「Running」になるまで待機 f:id:swx-kyosuke-yano:20201114231544j:plain
3-7.今回はS3アーカイブのみをアウトプットする設定なので、映像確認はできません。
S3に映像がアーカイブされていることを想像しながら1分くらい待機し、チャネルを「停止」にします

3-8.ステータスが「Idle」に戻ったことを確認し、S3の該当バケットに移動
.tsファイルで映像データがアーカイブされていましたので、次の手順からこのファイルを変換(Convert)していきます f:id:swx-kyosuke-yano:20210218091924j:plain

4.MediaConvert設定

4-1.ハンズオンの手順に従い、先ずはMediaConvert用のIAMロールを作成します
IAM→ロール→ロールの作成 から、ユースケースをMediaConvertとします f:id:swx-kyosuke-yano:20210218092510j:plain
4-2.権限は自動で2つ選択されているのでそのまま進み、ロールを作成
f:id:swx-kyosuke-yano:20210218092555j:plain f:id:swx-kyosuke-yano:20210218092552j:plain
4-3.MediaConvertサービスに移動し、ジョブの作成
先ずは「入力1」に、先程アーカイブしたtsファイルを選択します(参照から簡単に選べます) f:id:swx-kyosuke-yano:20210218093026j:plain
今回はそれ以外はデフォルトのままとします

4-4.出力グループに「ファイルグループ」で追加します
f:id:swx-kyosuke-yano:20210219192907j:plainf:id:swx-kyosuke-yano:20210219192903j:plain
4-5.カスタムグループ名(今回は convert-handson)と送信先(適当なS3バケット)を入力します
f:id:swx-kyosuke-yano:20210219193322j:plain 4-6.出力設定は名前修飾子を handson、拡張子をmp4としました
f:id:swx-kyosuke-yano:20210219193559j:plain 4-7.エンコード設定は解像度とビットレートを埋める必要があります。今回はサイズを小さくする為 480x360、400kbpsとしました。
f:id:swx-kyosuke-yano:20210219194441j:plain 4-8.出力グループ設定を終え、最後にジョブの設定をします。サービスロールに4-1.~で作成したIAMロールを選択します
f:id:swx-kyosuke-yano:20210219194656j:plain 4-9.ジョブを「作成」ボタンで開始し、しばし待つとステータスがCOMPLETE、選択したS3バケットに出力が成された表示が確認できます
f:id:swx-kyosuke-yano:20210219195114j:plain

5.CloudFront設定

5-0.CloudFrontのディストリビューション作成自体は前述の通り省略します
5-1.Originの編集でS3バケットを指定し、Restrict Bucket Access を Yes にして、Origin Access Identity (OAI)を作成、指定します
f:id:swx-kyosuke-yano:20210219195716j:plain
ディストリビューションを更新した段階で対象のS3バケットのOAIがバケットポリシーに書き込まれたことを確認します(パブリック・アクセスが禁止であることを確認しつつ) f:id:swx-kyosuke-yano:20210219195713j:plain f:id:swx-kyosuke-yano:20210219195710j:plain 5-2.これでCloudFrontから見られるようになったので、ディストリビューションをElableにして視聴準備完了

6.視聴確認

6-1.CloudFrontのディストリビューションURL + 変換後のファイル名で視聴可能か確認
例 : https://XXXXX.cloudfront.netconnect_1.000000handson.mp4
f:id:swx-kyosuke-yano:20210220101804j:plain
見れた

料金

MediaConnectはフローの実行時間に課金される他、
データ転送受信には課金されず、他サービスやインターネットに送信する際に課金されます。
その為計算は以下の形となり、数分の今回の稼働であれば100円に満たない料金が課金されることになります。

時間あたりの料金 0.2819USD
同じリージョン内の AWS Elemental MediaConnect のデータ転送受信 (イン) またはデータ転送送信 (アウト) 
すべてのデータ転送受信 (イン) またはデータ転送送信 (アウト)   0.01USD/GB

料金 - AWS Elemental MediaConnect | AWS

MediaConvertとしては解像度やfps、動画時間などを抑えているので殆ど掛かっていません。画質と動画時間による従量課金なので計算はしやすそうです。

HD画質 + 30fps以下 = 0.017USD 

料金 - AWS Elemental MediaConvert | AWS

おわりに

MediaConnectとMediaConvertを使った配信構成のご紹介になりました。自前の動画やEC2から動画を送り込みながらライブ配信する機会も本ブログの構成のように可能ですが、兎に角MediaServicesは組み合わせパターンが多いので、どうするのが最適か考えるのは大変ですね。同時にそこが楽しいところでもあるなと感じています。

これとこれを組み合わせれば、このサービスで新たにこれが出来るから構成がシンプルになる、などまだまだ更新が沢山入ると思いますので、2021年以降もMediaServices全体を追っていきたいです。

ありがとうございました。

矢野 喬亮 (記事一覧)

カスタマーサクセス部

ウクレレと陶芸とMediaServicesが好きです