VoD 動画配信環境がサクッと作れるソリューション「Video on Demand on AWS Foundation」を触ってみた

サクッと VoD 環境、作ってみませんか
2020.11.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、大前です。

AWS MediaServices に関するソリューションガイドで気になるものが追加されていたので、今日はこちらを触っていきたいと思います。

Introducing Video On Demand on AWS Foundation

どんなソリューションか

AWS 上で VoD 動画配信を行うソリューションとなります。今までも Video on Demand on AWS という VoD 動画配信に関するソリューションは提供されていましたが、VoD 動画配信に関する 2つ目のソリューションとして追加されました。

構成

ソリューションの紹介ページ に添付されている構成図は以下です。

元々あった Video on Demand on AWS は動画のメタデータ等の抽出のために StepFunction などを使用する複雑なアーキテクチャでしたが、今回は アップロードした動画を MediaConvert で変換し、配信出来るようにする シンプルなソリューションとなっている様です。

触ってみた

では、早速このソリューションをデプロイしてみて、実際にどんなリソースが作成されるのかなどを見ていきたいと思います。

デプロイする

本ソリューションのデプロイ方法は至って簡単です。

まず、AWS アカウントにログインした状態で、このページ の下部から「Video on Demand on AWS Foundation」タブを選択し、「AWS コンソールで起動する」をクリックします。

CloudFormation の画面がテンプレートが指定された状態で起動されるため、「次へ」をクリックして進みます。

デフォルトではバージニア北部リージョンにデプロイする形となっているため、必要に応じて変更しましょう。

スタックの詳細画面では SNS から通知する際に用いるメールアドレスの入力を求められるので、入力して「次へ」。

「スタックオプションの設定」はデフォルトの進み、最後に IAM リソースの作成確認にチェックを入れて作成を開始します。


それなりに時間がかかるのでお茶でも飲んで待ちましょう。


しばらく待つとスタックの作成が完了しました。

ちなみに、本ソリューションは AWS Cloud Development Kit を用いて実装されているそうです。興味ある方はテンプレートの中身を覗いてみては如何でしょうか。

作成されたリソースを確認してみる

上記構成図で大まかには作成されるリソースをイメージ出来ていますが、具体的にどんなリソースが作成されたのが確認していきましょう。

ソリューションの動作に関するリソースのみ確認しますが、裏では各種サービスに必要な IAM ロール等も作成されています。どんな権限が設定されているかなどを確認したい場合は、ご自身でソリューションをデプロイしてみてください。

S3

S3 では以下 3つのバケットが作成されている事が確認できます。

  • {スタック名}-source{ランダム文字列}(以下 source)
  • {スタック名}-destination{ランダム文字列}(以下 destination)
  • {スタック名}-logs{ランダム文字列}(以下 logs)

source

動画をアップロードするバケットになります。このバケットに動画ファイルをアップロードする事で本ソリューションが動作します。

また、source バケットには作成時から以下フォルダ/ファイルが作成されています。

  • assets01 フォルダ
    • ここに動画ファイルをアップロードする
  • assets01/job-settinngs.json
    • MediaConvert のジョブ設定が記載されたファイル
  • job-manifest.json
    • MediaConvert で実行するジョブ情報が記載されるファイル

MediaConvert のジョブ設定を S3 配下に配置している点が少し興味深かったです。私は MediaConvert のジョブテンプレートを使用する方法しか知りませんでしたが、S3 に配置するのも良いですね。

ジョブ テンプレートを使用したジョブの作成 AWS Elemental MediaConvert

一方で、ジョブテンプレートを使用すれば UI ベースで設定が可能なので、頻繁にジョブ設定を変更したい場合などはそちらに切り替える方が良いかもしれません。

公式ドキュメントでも以下の記載があります。必要に応じて本ソリューションをカスタマイズしていきましょう。

設定を変更するには、Amazon S3 のジョブ設定ファイルを更新するか、独自の設定に置き換えることができます。詳細については、『MediaConvert ユーザーガイド』の「AWS Elemental MediaConvert ジョブのエクスポートとインポート」を参照してください。ジョブ設定ファイルの有効性を確認するために、正常に実行され完了したジョブのみをエクスポートしてください。

また、アップロードを検知して Lambda 関数を呼び出す為のイベント設定としては以下の 5つが設定されていました。変換したいファイル形式がない場合は追加しましょう。

  • mpg
  • mp4
  • m4v
  • mov
  • m2ts

destination

MediaConvert によって変換された動画ファイルの出力先です。

特に特筆する点はありませんが、アクセスログの設定が入っていました。

logs

その名の通りログを保管するバケットです。

保管するログとしては、上記 destination バケットのアクセスログと、CloudFront のログの 2種類の様です。

Lambda

以下 3つの関数が作成されている事が確認できますが、1つはカスタムリソースであるため、実質 2つの関数が作成されている形となります。

  • {スタック名}-CustomResource{ランダム文字列}(以下 CustomResource)
    • カスタムリソース
  • {スタック名}-jobSubmit{ランダム文字列}(以下 jobSubmit)
  • {スタック名}-JobComplete{ランダム文字列}(以下 JobComplete)

各種関数の細かな確認はしませんので、興味ある方はご自身でソースを確認してみてください。

jobSubmit

S3 に動画がアップロードされた際にトリガーされる関数です。主に以下の処理を実施しています。

  • S3 のイベント通知からアップロードファイルを特定
  • source バケットの assets01/job-settinngs.json を取得し、MediaConvert にて実行させるジョブ設定を作成
  • MediaConvert のジョブを実行
  • 処理中にエラーが発生した場合、SNS にメッセージを発行
JobComplete

MediaConvert のジョブステータスに応じて各種処理を実行する関数です。主に以下の処理を実施しています。

  • ジョブのステータスに応じて source バケットの job-manifest.json ファイルを更新
    • ジョブの詳細情報や出力情報などを書き込む
  • ジョブの完了時や失敗時に SNS にメッセージを発行

SNS

CloudFormation の作成時にパラメータとして入力してメールアドレス宛に通知を飛ばすためのトピックが作成されています。

通知先を増やしたい場合はこのトピックにサブスクリプションを追加しましょう。

CloudWatch Event(EventBridge)

{スタック名}-EventTriggerEventsRule{ランダム文字列} というルールが 1つ作成されている事が確認できます。

イベントパターンとしては以下が設定されています。

{
  "source": [
    "aws.mediaconvert"
  ],
  "detail": {
    "userMetadata": {
      "StackName": [
        "aws-vod-test"
      ]
    },
    "status": [
      "COMPLETE",
      "ERROR",
      "CANCELED",
      "INPUT_INFORMATION"
    ]
  }
}

私は MediaConvert のジョブステータスに IMPUT_INFORMATION というものがある事を初めて知りました。

Events that AWS Elemental MediaConvert sends to CloudWatch によると、以下の記載があります。ジョブ開始時に情報を取得できるのは便利そうですね、勉強になりました。

次の場合に送信: MediaConvert でジョブの処理が開始された直後。 詳細: フレームの高さと幅、フレームレート、コーデックなどのメディア情報。MediaConvert はすべての入力に関する情報を 1 つのイベントに含めます。

CloudFront

MediaConvert によって変換された動画を配信するためにディストリビューションが 1つ作成されています。

OAI やログの設定がされている以外はほぼデフォルトに近い形で設定されているため、必要に応じてカスタマイズしましょう。

一点、Price Class が Use Only U.S., Canada and Europe で作成されているため、日本で使用する際には All Edge Locations もしくは U.S., Canada, Europe, Asia, Middle East and Africa に設定変更するのが良さそうです。

MediaConvert

本ソリューションでは S3 に配置したジョブ設定をベースに MediaConvert を呼び出す為、特にリソースが作成されていたりするわけではありませんが、実行するジョブのベースとなる job-settinngs.json の中身を見てみます。

1000行近くあるファイルである為、折りたたんで表示しています。興味ある方は覗いてみてください。

job-settinngs.json
{
    "Queue": "Default",
    "Role": "",
    "Settings": {
      "OutputGroups": [
        {
          "Name": "File Group",
          "Outputs": [
            {
              "ContainerSettings": {
                "Container": "MP4",
                "Mp4Settings": {
                  "CslgAtom": "INCLUDE",
                  "FreeSpaceBox": "EXCLUDE",
                  "MoovPlacement": "PROGRESSIVE_DOWNLOAD"
                }
              },
              "VideoDescription": {
                "Width": 1920,
                "ScalingBehavior": "DEFAULT",
                "Height": 1080,
                "VideoPreprocessors": {
                  "Deinterlacer": {
                    "Algorithm": "INTERPOLATE",
                    "Mode": "DEINTERLACE",
                    "Control": "NORMAL"
                  }
                },
                "TimecodeInsertion": "DISABLED",
                "AntiAlias": "ENABLED",
                "Sharpness": 100,
                "CodecSettings": {
                  "Codec": "H_264",
                  "H264Settings": {
                    "InterlaceMode": "PROGRESSIVE",
                    "ParNumerator": 1,
                    "NumberReferenceFrames": 3,
                    "Syntax": "DEFAULT",
                    "Softness": 0,
                    "FramerateDenominator": 1,
                    "GopClosedCadence": 1,
                    "HrdBufferInitialFillPercentage": 90,
                    "GopSize": 3,
                    "Slices": 1,
                    "GopBReference": "ENABLED",
                    "HrdBufferSize": 21250000,
                    "MaxBitrate": 8500000,
                    "SlowPal": "DISABLED",
                    "ParDenominator": 1,
                    "SpatialAdaptiveQuantization": "ENABLED",
                    "TemporalAdaptiveQuantization": "ENABLED",
                    "FlickerAdaptiveQuantization": "ENABLED",
                    "EntropyEncoding": "CABAC",
                    "FramerateControl": "SPECIFIED",
                    "RateControlMode": "QVBR",
                    "QvbrSettings": {
                      "QvbrQualityLevel": 9
                    },
                    "CodecProfile": "HIGH",
                    "Telecine": "NONE",
                    "FramerateNumerator": 24,
                    "MinIInterval": 0,
                    "AdaptiveQuantization": "HIGH",
                    "CodecLevel": "LEVEL_4",
                    "FieldEncoding": "PAFF",
                    "SceneChangeDetect": "ENABLED",
                    "QualityTuningLevel": "SINGLE_PASS_HQ",
                    "FramerateConversionAlgorithm": "DUPLICATE_DROP",
                    "UnregisteredSeiTimecode": "DISABLED",
                    "GopSizeUnits": "SECONDS",
                    "ParControl": "SPECIFIED",
                    "NumberBFramesBetweenReferenceFrames": 5,
                    "RepeatPps": "DISABLED",
                    "DynamicSubGop": "ADAPTIVE"
                  }
                },
                "AfdSignaling": "NONE",
                "DropFrameTimecode": "ENABLED",
                "RespondToAfd": "NONE",
                "ColorMetadata": "INSERT"
              },
              "AudioDescriptions": [
                {
                  "AudioTypeControl": "FOLLOW_INPUT",
                  "AudioSourceName": "Audio Selector 1",
                  "CodecSettings": {
                    "Codec": "AAC",
                    "AacSettings": {
                      "AudioDescriptionBroadcasterMix": "NORMAL",
                      "Bitrate": 160000,
                      "RateControlMode": "CBR",
                      "CodecProfile": "LC",
                      "CodingMode": "CODING_MODE_2_0",
                      "RawFormat": "NONE",
                      "SampleRate": 48000,
                      "Specification": "MPEG4"
                    }
                  },
                  "LanguageCodeControl": "FOLLOW_INPUT",
                  "AudioType": 0
                }
              ],
              "Extension": "mp4",
              "NameModifier": "_Mp4_Avc_Aac_16x9_1920x1080p_24Hz_8.5Mbps_qvbr"
            }
          ],
          "OutputGroupSettings": {
            "Type": "FILE_GROUP_SETTINGS",
            "FileGroupSettings": {
              "Destination": "s3://destinationbucket/guid/mp4/"
            }
          }
        },
        {
          "Name": "Apple HLS",
          "Outputs": [
            {
              "ContainerSettings": {
                "Container": "M3U8",
                "M3u8Settings": {
                  "AudioFramesPerPes": 4,
                  "PcrControl": "PCR_EVERY_PES_PACKET",
                  "PmtPid": 480,
                  "PrivateMetadataPid": 503,
                  "ProgramNumber": 1,
                  "PatInterval": 0,
                  "PmtInterval": 0,
                  "VideoPid": 481,
                  "AudioPids": [
                    482,
                    483,
                    484,
                    485,
                    486,
                    487,
                    488,
                    489,
                    490,
                    491,
                    492,
                    493,
                    494,
                    495,
                    496,
                    497,
                    498
                  ]
                }
              },
              "VideoDescription": {
                "Width": 480,
                "ScalingBehavior": "DEFAULT",
                "Height": 270,
                "VideoPreprocessors": {
                  "Deinterlacer": {
                    "Algorithm": "INTERPOLATE",
                    "Mode": "DEINTERLACE",
                    "Control": "NORMAL"
                  }
                },
                "TimecodeInsertion": "DISABLED",
                "AntiAlias": "ENABLED",
                "Sharpness": 100,
                "CodecSettings": {
                  "Codec": "H_264",
                  "H264Settings": {
                    "InterlaceMode": "PROGRESSIVE",
                    "ParNumerator": 1,
                    "NumberReferenceFrames": 3,
                    "Syntax": "DEFAULT",
                    "FramerateDenominator": 1,
                    "GopClosedCadence": 1,
                    "HrdBufferInitialFillPercentage": 90,
                    "GopSize": 3,
                    "Slices": 1,
                    "GopBReference": "ENABLED",
                    "HrdBufferSize": 1000000,
                    "MaxBitrate": 400000,
                    "SlowPal": "DISABLED",
                    "ParDenominator": 1,
                    "SpatialAdaptiveQuantization": "ENABLED",
                    "TemporalAdaptiveQuantization": "ENABLED",
                    "FlickerAdaptiveQuantization": "ENABLED",
                    "EntropyEncoding": "CABAC",
                    "FramerateControl": "SPECIFIED",
                    "RateControlMode": "QVBR",
                    "QvbrSettings": {
                      "QvbrQualityLevel": 7
                    },
                    "CodecProfile": "HIGH",
                    "Telecine": "NONE",
                    "FramerateNumerator": 15,
                    "MinIInterval": 0,
                    "AdaptiveQuantization": "MEDIUM",
                    "CodecLevel": "LEVEL_3_1",
                    "FieldEncoding": "PAFF",
                    "SceneChangeDetect": "ENABLED",
                    "QualityTuningLevel": "SINGLE_PASS_HQ",
                    "FramerateConversionAlgorithm": "DUPLICATE_DROP",
                    "UnregisteredSeiTimecode": "DISABLED",
                    "GopSizeUnits": "SECONDS",
                    "ParControl": "SPECIFIED",
                    "NumberBFramesBetweenReferenceFrames": 5,
                    "RepeatPps": "DISABLED",
                    "DynamicSubGop": "ADAPTIVE"
                  }
                },
                "AfdSignaling": "NONE",
                "DropFrameTimecode": "ENABLED",
                "RespondToAfd": "NONE",
                "ColorMetadata": "INSERT"
              },
              "AudioDescriptions": [
                {
                  "AudioTypeControl": "FOLLOW_INPUT",
                  "AudioSourceName": "Audio Selector 1",
                  "CodecSettings": {
                    "Codec": "AAC",
                    "AacSettings": {
                      "AudioDescriptionBroadcasterMix": "NORMAL",
                      "Bitrate": 64000,
                      "RateControlMode": "CBR",
                      "CodecProfile": "HEV1",
                      "CodingMode": "CODING_MODE_2_0",
                      "RawFormat": "NONE",
                      "SampleRate": 48000,
                      "Specification": "MPEG4"
                    }
                  },
                  "LanguageCodeControl": "FOLLOW_INPUT",
                  "AudioType": 0
                }
              ],
              "NameModifier": "_Ott_Hls_Ts_Avc_Aac_16x9_480x270p_15Hz_0.4Mbps_qvbr"
            },
            {
              "ContainerSettings": {
                "Container": "M3U8",
                "M3u8Settings": {
                  "AudioFramesPerPes": 4,
                  "PcrControl": "PCR_EVERY_PES_PACKET",
                  "PmtPid": 480,
                  "PrivateMetadataPid": 503,
                  "ProgramNumber": 1,
                  "PatInterval": 0,
                  "PmtInterval": 0,
                  "VideoPid": 481,
                  "AudioPids": [
                    482,
                    483,
                    484,
                    485,
                    486,
                    487,
                    488,
                    489,
                    490,
                    491,
                    492,
                    493,
                    494,
                    495,
                    496,
                    497,
                    498
                  ]
                }
              },
              "VideoDescription": {
                "Width": 640,
                "ScalingBehavior": "DEFAULT",
                "Height": 360,
                "VideoPreprocessors": {
                  "Deinterlacer": {
                    "Algorithm": "INTERPOLATE",
                    "Mode": "DEINTERLACE",
                    "Control": "NORMAL"
                  }
                },
                "TimecodeInsertion": "DISABLED",
                "AntiAlias": "ENABLED",
                "Sharpness": 100,
                "CodecSettings": {
                  "Codec": "H_264",
                  "H264Settings": {
                    "InterlaceMode": "PROGRESSIVE",
                    "ParNumerator": 1,
                    "NumberReferenceFrames": 3,
                    "Syntax": "DEFAULT",
                    "FramerateDenominator": 1,
                    "GopClosedCadence": 1,
                    "HrdBufferInitialFillPercentage": 90,
                    "GopSize": 3,
                    "Slices": 1,
                    "GopBReference": "ENABLED",
                    "HrdBufferSize": 3750000,
                    "MaxBitrate": 1500000,
                    "SlowPal": "DISABLED",
                    "ParDenominator": 1,
                    "SpatialAdaptiveQuantization": "ENABLED",
                    "TemporalAdaptiveQuantization": "ENABLED",
                    "FlickerAdaptiveQuantization": "ENABLED",
                    "EntropyEncoding": "CABAC",
                    "FramerateControl": "SPECIFIED",
                    "RateControlMode": "QVBR",
                    "QvbrSettings": {
                      "QvbrQualityLevel": 7
                    },
                    "CodecProfile": "HIGH",
                    "Telecine": "NONE",
                    "FramerateNumerator": 30,
                    "MinIInterval": 0,
                    "AdaptiveQuantization": "MEDIUM",
                    "CodecLevel": "LEVEL_3_1",
                    "FieldEncoding": "PAFF",
                    "SceneChangeDetect": "ENABLED",
                    "QualityTuningLevel": "SINGLE_PASS_HQ",
                    "FramerateConversionAlgorithm": "DUPLICATE_DROP",
                    "UnregisteredSeiTimecode": "DISABLED",
                    "GopSizeUnits": "SECONDS",
                    "ParControl": "SPECIFIED",
                    "NumberBFramesBetweenReferenceFrames": 5,
                    "RepeatPps": "DISABLED",
                    "DynamicSubGop": "ADAPTIVE"
                  }
                },
                "AfdSignaling": "NONE",
                "DropFrameTimecode": "ENABLED",
                "RespondToAfd": "NONE",
                "ColorMetadata": "INSERT"
              },
              "AudioDescriptions": [
                {
                  "AudioTypeControl": "FOLLOW_INPUT",
                  "AudioSourceName": "Audio Selector 1",
                  "CodecSettings": {
                    "Codec": "AAC",
                    "AacSettings": {
                      "AudioDescriptionBroadcasterMix": "NORMAL",
                      "Bitrate": 64000,
                      "RateControlMode": "CBR",
                      "CodecProfile": "HEV1",
                      "CodingMode": "CODING_MODE_2_0",
                      "RawFormat": "NONE",
                      "SampleRate": 48000,
                      "Specification": "MPEG4"
                    }
                  },
                  "LanguageCodeControl": "FOLLOW_INPUT",
                  "AudioType": 0
                }
              ],
              "NameModifier": "_Ott_Hls_Ts_Avc_Aac_16x9_640x360p_30Hz_1.5Mbps_qvbr"
            },
            {
              "ContainerSettings": {
                "Container": "M3U8",
                "M3u8Settings": {
                  "AudioFramesPerPes": 4,
                  "PcrControl": "PCR_EVERY_PES_PACKET",
                  "PmtPid": 480,
                  "PrivateMetadataPid": 503,
                  "ProgramNumber": 1,
                  "PatInterval": 0,
                  "PmtInterval": 0,
                  "VideoPid": 481,
                  "AudioPids": [
                    482,
                    483,
                    484,
                    485,
                    486,
                    487,
                    488,
                    489,
                    490,
                    491,
                    492,
                    493,
                    494,
                    495,
                    496,
                    497,
                    498
                  ]
                }
              },
              "VideoDescription": {
                "Width": 960,
                "ScalingBehavior": "DEFAULT",
                "Height": 540,
                "VideoPreprocessors": {
                  "Deinterlacer": {
                    "Algorithm": "INTERPOLATE",
                    "Mode": "DEINTERLACE",
                    "Control": "NORMAL"
                  }
                },
                "TimecodeInsertion": "DISABLED",
                "AntiAlias": "ENABLED",
                "Sharpness": 100,
                "CodecSettings": {
                  "Codec": "H_264",
                  "H264Settings": {
                    "InterlaceMode": "PROGRESSIVE",
                    "ParNumerator": 1,
                    "NumberReferenceFrames": 3,
                    "Syntax": "DEFAULT",
                    "FramerateDenominator": 1,
                    "GopClosedCadence": 1,
                    "HrdBufferInitialFillPercentage": 90,
                    "GopSize": 3,
                    "Slices": 1,
                    "GopBReference": "ENABLED",
                    "HrdBufferSize": 8750000,
                    "MaxBitrate": 3500000,
                    "SlowPal": "DISABLED",
                    "ParDenominator": 1,
                    "SpatialAdaptiveQuantization": "ENABLED",
                    "TemporalAdaptiveQuantization": "ENABLED",
                    "FlickerAdaptiveQuantization": "ENABLED",
                    "EntropyEncoding": "CABAC",
                    "FramerateControl": "SPECIFIED",
                    "RateControlMode": "QVBR",
                    "QvbrSettings": {
                      "QvbrQualityLevel": 8
                    },
                    "CodecProfile": "HIGH",
                    "Telecine": "NONE",
                    "FramerateNumerator": 30,
                    "MinIInterval": 0,
                    "AdaptiveQuantization": "HIGH",
                    "CodecLevel": "LEVEL_4",
                    "FieldEncoding": "PAFF",
                    "SceneChangeDetect": "ENABLED",
                    "QualityTuningLevel": "SINGLE_PASS_HQ",
                    "FramerateConversionAlgorithm": "DUPLICATE_DROP",
                    "UnregisteredSeiTimecode": "DISABLED",
                    "GopSizeUnits": "SECONDS",
                    "ParControl": "SPECIFIED",
                    "NumberBFramesBetweenReferenceFrames": 5,
                    "RepeatPps": "DISABLED",
                    "DynamicSubGop": "ADAPTIVE"
                  }
                },
                "AfdSignaling": "NONE",
                "DropFrameTimecode": "ENABLED",
                "RespondToAfd": "NONE",
                "ColorMetadata": "INSERT"
              },
              "AudioDescriptions": [
                {
                  "AudioTypeControl": "FOLLOW_INPUT",
                  "AudioSourceName": "Audio Selector 1",
                  "CodecSettings": {
                    "Codec": "AAC",
                    "AacSettings": {
                      "AudioDescriptionBroadcasterMix": "NORMAL",
                      "Bitrate": 96000,
                      "RateControlMode": "CBR",
                      "CodecProfile": "HEV1",
                      "CodingMode": "CODING_MODE_2_0",
                      "RawFormat": "NONE",
                      "SampleRate": 48000,
                      "Specification": "MPEG4"
                    }
                  },
                  "LanguageCodeControl": "FOLLOW_INPUT",
                  "AudioType": 0
                }
              ],
              "NameModifier": "_Ott_Hls_Ts_Avc_Aac_16x9_960x540p_30Hz_3.5Mbps_qvbr"
            },
            {
              "ContainerSettings": {
                "Container": "M3U8",
                "M3u8Settings": {
                  "AudioFramesPerPes": 4,
                  "PcrControl": "PCR_EVERY_PES_PACKET",
                  "PmtPid": 480,
                  "PrivateMetadataPid": 503,
                  "ProgramNumber": 1,
                  "PatInterval": 0,
                  "PmtInterval": 0,
                  "VideoPid": 481,
                  "AudioPids": [
                    482,
                    483,
                    484,
                    485,
                    486,
                    487,
                    488,
                    489,
                    490,
                    491,
                    492,
                    493,
                    494,
                    495,
                    496,
                    497,
                    498
                  ]
                }
              },
              "VideoDescription": {
                "Width": 1280,
                "ScalingBehavior": "DEFAULT",
                "Height": 720,
                "VideoPreprocessors": {
                  "Deinterlacer": {
                    "Algorithm": "INTERPOLATE",
                    "Mode": "DEINTERLACE",
                    "Control": "NORMAL"
                  }
                },
                "TimecodeInsertion": "DISABLED",
                "AntiAlias": "ENABLED",
                "Sharpness": 100,
                "CodecSettings": {
                  "Codec": "H_264",
                  "H264Settings": {
                    "InterlaceMode": "PROGRESSIVE",
                    "ParNumerator": 1,
                    "NumberReferenceFrames": 3,
                    "Syntax": "DEFAULT",
                    "FramerateDenominator": 1,
                    "GopClosedCadence": 1,
                    "HrdBufferInitialFillPercentage": 90,
                    "GopSize": 3,
                    "Slices": 1,
                    "GopBReference": "ENABLED",
                    "HrdBufferSize": 15000000,
                    "MaxBitrate": 6000000,
                    "SlowPal": "DISABLED",
                    "ParDenominator": 1,
                    "SpatialAdaptiveQuantization": "ENABLED",
                    "TemporalAdaptiveQuantization": "ENABLED",
                    "FlickerAdaptiveQuantization": "ENABLED",
                    "EntropyEncoding": "CABAC",
                    "FramerateControl": "SPECIFIED",
                    "RateControlMode": "QVBR",
                    "QvbrSettings": {
                      "QvbrQualityLevel": 8
                    },
                    "CodecProfile": "HIGH",
                    "Telecine": "NONE",
                    "FramerateNumerator": 30,
                    "MinIInterval": 0,
                    "AdaptiveQuantization": "HIGH",
                    "CodecLevel": "LEVEL_4",
                    "FieldEncoding": "PAFF",
                    "SceneChangeDetect": "ENABLED",
                    "QualityTuningLevel": "SINGLE_PASS_HQ",
                    "FramerateConversionAlgorithm": "DUPLICATE_DROP",
                    "UnregisteredSeiTimecode": "DISABLED",
                    "GopSizeUnits": "SECONDS",
                    "ParControl": "SPECIFIED",
                    "NumberBFramesBetweenReferenceFrames": 5,
                    "RepeatPps": "DISABLED",
                    "DynamicSubGop": "ADAPTIVE"
                  }
                },
                "AfdSignaling": "NONE",
                "DropFrameTimecode": "ENABLED",
                "RespondToAfd": "NONE",
                "ColorMetadata": "INSERT"
              },
              "AudioDescriptions": [
                {
                  "AudioTypeControl": "FOLLOW_INPUT",
                  "AudioSourceName": "Audio Selector 1",
                  "CodecSettings": {
                    "Codec": "AAC",
                    "AacSettings": {
                      "AudioDescriptionBroadcasterMix": "NORMAL",
                      "Bitrate": 96000,
                      "RateControlMode": "CBR",
                      "CodecProfile": "HEV1",
                      "CodingMode": "CODING_MODE_2_0",
                      "RawFormat": "NONE",
                      "SampleRate": 48000,
                      "Specification": "MPEG4"
                    }
                  },
                  "LanguageCodeControl": "FOLLOW_INPUT",
                  "AudioType": 0
                }
              ],
              "NameModifier": "_Ott_Hls_Ts_Avc_Aac_16x9_1280x720p_30Hz_6.0Mbps_qvbr"
            },
            {
              "ContainerSettings": {
                "Container": "M3U8",
                "M3u8Settings": {
                  "AudioFramesPerPes": 4,
                  "PcrControl": "PCR_EVERY_PES_PACKET",
                  "PmtPid": 480,
                  "PrivateMetadataPid": 503,
                  "ProgramNumber": 1,
                  "PatInterval": 0,
                  "PmtInterval": 0,
                  "VideoPid": 481,
                  "AudioPids": [
                    482,
                    483,
                    484,
                    485,
                    486,
                    487,
                    488,
                    489,
                    490,
                    491,
                    492,
                    493,
                    494,
                    495,
                    496,
                    497,
                    498
                  ]
                }
              },
              "VideoDescription": {
                "Width": 1920,
                "ScalingBehavior": "DEFAULT",
                "Height": 1080,
                "VideoPreprocessors": {
                  "Deinterlacer": {
                    "Algorithm": "INTERPOLATE",
                    "Mode": "DEINTERLACE",
                    "Control": "NORMAL"
                  }
                },
                "TimecodeInsertion": "DISABLED",
                "AntiAlias": "ENABLED",
                "Sharpness": 100,
                "CodecSettings": {
                  "Codec": "H_264",
                  "H264Settings": {
                    "InterlaceMode": "PROGRESSIVE",
                    "ParNumerator": 1,
                    "NumberReferenceFrames": 3,
                    "Syntax": "DEFAULT",
                    "FramerateDenominator": 1,
                    "GopClosedCadence": 1,
                    "HrdBufferInitialFillPercentage": 90,
                    "GopSize": 3,
                    "Slices": 1,
                    "GopBReference": "ENABLED",
                    "HrdBufferSize": 21250000,
                    "MaxBitrate": 8500000,
                    "SlowPal": "DISABLED",
                    "ParDenominator": 1,
                    "SpatialAdaptiveQuantization": "ENABLED",
                    "TemporalAdaptiveQuantization": "ENABLED",
                    "FlickerAdaptiveQuantization": "ENABLED",
                    "EntropyEncoding": "CABAC",
                    "FramerateControl": "SPECIFIED",
                    "RateControlMode": "QVBR",
                    "QvbrSettings": {
                      "QvbrQualityLevel": 9
                    },
                    "CodecProfile": "HIGH",
                    "Telecine": "NONE",
                    "FramerateNumerator": 30,
                    "MinIInterval": 0,
                    "AdaptiveQuantization": "HIGH",
                    "CodecLevel": "LEVEL_4",
                    "FieldEncoding": "PAFF",
                    "SceneChangeDetect": "ENABLED",
                    "QualityTuningLevel": "SINGLE_PASS_HQ",
                    "FramerateConversionAlgorithm": "DUPLICATE_DROP",
                    "UnregisteredSeiTimecode": "DISABLED",
                    "GopSizeUnits": "SECONDS",
                    "ParControl": "SPECIFIED",
                    "NumberBFramesBetweenReferenceFrames": 5,
                    "RepeatPps": "DISABLED",
                    "DynamicSubGop": "ADAPTIVE"
                  }
                },
                "AfdSignaling": "NONE",
                "DropFrameTimecode": "ENABLED",
                "RespondToAfd": "NONE",
                "ColorMetadata": "INSERT"
              },
              "AudioDescriptions": [
                {
                  "AudioTypeControl": "FOLLOW_INPUT",
                  "AudioSourceName": "Audio Selector 1",
                  "CodecSettings": {
                    "Codec": "AAC",
                    "AacSettings": {
                      "AudioDescriptionBroadcasterMix": "NORMAL",
                      "Bitrate": 128000,
                      "RateControlMode": "CBR",
                      "CodecProfile": "LC",
                      "CodingMode": "CODING_MODE_2_0",
                      "RawFormat": "NONE",
                      "SampleRate": 48000,
                      "Specification": "MPEG4"
                    }
                  },
                  "LanguageCodeControl": "FOLLOW_INPUT",
                  "AudioType": 0
                }
              ],
              "NameModifier": "_Ott_Hls_Ts_Avc_Aac_16x9_1920x1080p_30Hz_8.5Mbps_qvbr"
            }
          ],
          "OutputGroupSettings": {
            "Type": "HLS_GROUP_SETTINGS",
            "HlsGroupSettings": {
              "ManifestDurationFormat": "INTEGER",
              "SegmentLength": 3,
              "TimedMetadataId3Period": 10,
              "CaptionLanguageSetting": "OMIT",
              "Destination": "s3://destinationbucket/guid/hls/",
              "TimedMetadataId3Frame": "PRIV",
              "CodecSpecification": "RFC_4281",
              "OutputSelection": "MANIFESTS_AND_SEGMENTS",
              "ProgramDateTimePeriod": 600,
              "MinSegmentLength": 0,
              "DirectoryStructure": "SINGLE_DIRECTORY",
              "ProgramDateTime": "EXCLUDE",
              "SegmentControl": "SEGMENTED_FILES",
              "ManifestCompression": "NONE",
              "ClientCache": "ENABLED",
              "StreamInfResolution": "INCLUDE"
            }
          }
        },
        {
          "Name": "DASH ISO",
          "Outputs": [
            {
              "ContainerSettings": {
                "Container": "MPD"
              },
              "VideoDescription": {
                "Width": 480,
                "ScalingBehavior": "DEFAULT",
                "Height": 270,
                "VideoPreprocessors": {
                  "Deinterlacer": {
                    "Algorithm": "INTERPOLATE",
                    "Mode": "DEINTERLACE",
                    "Control": "NORMAL"
                  }
                },
                "TimecodeInsertion": "DISABLED",
                "AntiAlias": "ENABLED",
                "Sharpness": 100,
                "CodecSettings": {
                  "Codec": "H_264",
                  "H264Settings": {
                    "InterlaceMode": "PROGRESSIVE",
                    "ParNumerator": 1,
                    "NumberReferenceFrames": 3,
                    "Syntax": "DEFAULT",
                    "FramerateDenominator": 1,
                    "GopClosedCadence": 1,
                    "HrdBufferInitialFillPercentage": 90,
                    "GopSize": 3,
                    "Slices": 1,
                    "GopBReference": "ENABLED",
                    "HrdBufferSize": 1000000,
                    "MaxBitrate": 400000,
                    "SlowPal": "DISABLED",
                    "ParDenominator": 1,
                    "SpatialAdaptiveQuantization": "ENABLED",
                    "TemporalAdaptiveQuantization": "ENABLED",
                    "FlickerAdaptiveQuantization": "ENABLED",
                    "EntropyEncoding": "CABAC",
                    "FramerateControl": "SPECIFIED",
                    "RateControlMode": "QVBR",
                    "QvbrSettings": {
                      "QvbrQualityLevel": 7
                    },
                    "CodecProfile": "HIGH",
                    "Telecine": "NONE",
                    "FramerateNumerator": 15,
                    "MinIInterval": 0,
                    "AdaptiveQuantization": "MEDIUM",
                    "CodecLevel": "LEVEL_3_1",
                    "FieldEncoding": "PAFF",
                    "SceneChangeDetect": "ENABLED",
                    "QualityTuningLevel": "SINGLE_PASS_HQ",
                    "FramerateConversionAlgorithm": "DUPLICATE_DROP",
                    "UnregisteredSeiTimecode": "DISABLED",
                    "GopSizeUnits": "SECONDS",
                    "ParControl": "SPECIFIED",
                    "NumberBFramesBetweenReferenceFrames": 5,
                    "RepeatPps": "DISABLED",
                    "DynamicSubGop": "ADAPTIVE"
                  }
                },
                "AfdSignaling": "NONE",
                "DropFrameTimecode": "ENABLED",
                "RespondToAfd": "NONE",
                "ColorMetadata": "INSERT"
              },
              "NameModifier": "_Ott_Dash_Mp4_Avc_16x9_480x270p_15Hz_0.4Mbps_qvbr"
            },
            {
              "ContainerSettings": {
                "Container": "MPD"
              },
              "VideoDescription": {
                "Width": 640,
                "ScalingBehavior": "DEFAULT",
                "Height": 360,
                "VideoPreprocessors": {
                  "Deinterlacer": {
                    "Algorithm": "INTERPOLATE",
                    "Mode": "DEINTERLACE",
                    "Control": "NORMAL"
                  }
                },
                "TimecodeInsertion": "DISABLED",
                "AntiAlias": "ENABLED",
                "Sharpness": 100,
                "CodecSettings": {
                  "Codec": "H_264",
                  "H264Settings": {
                    "InterlaceMode": "PROGRESSIVE",
                    "ParNumerator": 1,
                    "NumberReferenceFrames": 3,
                    "Syntax": "DEFAULT",
                    "FramerateDenominator": 1,
                    "GopClosedCadence": 1,
                    "HrdBufferInitialFillPercentage": 90,
                    "GopSize": 3,
                    "Slices": 1,
                    "GopBReference": "ENABLED",
                    "HrdBufferSize": 3750000,
                    "MaxBitrate": 1500000,
                    "SlowPal": "DISABLED",
                    "ParDenominator": 1,
                    "SpatialAdaptiveQuantization": "ENABLED",
                    "TemporalAdaptiveQuantization": "ENABLED",
                    "FlickerAdaptiveQuantization": "ENABLED",
                    "EntropyEncoding": "CABAC",
                    "FramerateControl": "SPECIFIED",
                    "RateControlMode": "QVBR",
                    "QvbrSettings": {
                      "QvbrQualityLevel": 7
                    },
                    "CodecProfile": "HIGH",
                    "Telecine": "NONE",
                    "FramerateNumerator": 30,
                    "MinIInterval": 0,
                    "AdaptiveQuantization": "MEDIUM",
                    "CodecLevel": "LEVEL_3_1",
                    "FieldEncoding": "PAFF",
                    "SceneChangeDetect": "ENABLED",
                    "QualityTuningLevel": "SINGLE_PASS_HQ",
                    "FramerateConversionAlgorithm": "DUPLICATE_DROP",
                    "UnregisteredSeiTimecode": "DISABLED",
                    "GopSizeUnits": "SECONDS",
                    "ParControl": "SPECIFIED",
                    "NumberBFramesBetweenReferenceFrames": 5,
                    "RepeatPps": "DISABLED",
                    "DynamicSubGop": "ADAPTIVE"
                  }
                },
                "AfdSignaling": "NONE",
                "DropFrameTimecode": "ENABLED",
                "RespondToAfd": "NONE",
                "ColorMetadata": "INSERT"
              },
              "NameModifier": "_Ott_Dash_Mp4_Avc_16x9_640x360p_30Hz_1.5Mbps_qvbr"
            },
            {
              "ContainerSettings": {
                "Container": "MPD"
              },
              "VideoDescription": {
                "Width": 960,
                "ScalingBehavior": "DEFAULT",
                "Height": 540,
                "VideoPreprocessors": {
                  "Deinterlacer": {
                    "Algorithm": "INTERPOLATE",
                    "Mode": "DEINTERLACE",
                    "Control": "NORMAL"
                  }
                },
                "TimecodeInsertion": "DISABLED",
                "AntiAlias": "ENABLED",
                "Sharpness": 100,
                "CodecSettings": {
                  "Codec": "H_264",
                  "H264Settings": {
                    "InterlaceMode": "PROGRESSIVE",
                    "ParNumerator": 1,
                    "NumberReferenceFrames": 3,
                    "Syntax": "DEFAULT",
                    "FramerateDenominator": 1,
                    "GopClosedCadence": 1,
                    "HrdBufferInitialFillPercentage": 90,
                    "GopSize": 3,
                    "Slices": 1,
                    "GopBReference": "ENABLED",
                    "HrdBufferSize": 8750000,
                    "MaxBitrate": 3500000,
                    "SlowPal": "DISABLED",
                    "ParDenominator": 1,
                    "SpatialAdaptiveQuantization": "ENABLED",
                    "TemporalAdaptiveQuantization": "ENABLED",
                    "FlickerAdaptiveQuantization": "ENABLED",
                    "EntropyEncoding": "CABAC",
                    "FramerateControl": "SPECIFIED",
                    "RateControlMode": "QVBR",
                    "QvbrSettings": {
                      "QvbrQualityLevel": 8
                    },
                    "CodecProfile": "HIGH",
                    "Telecine": "NONE",
                    "FramerateNumerator": 30,
                    "MinIInterval": 0,
                    "AdaptiveQuantization": "HIGH",
                    "CodecLevel": "LEVEL_4",
                    "FieldEncoding": "PAFF",
                    "SceneChangeDetect": "ENABLED",
                    "QualityTuningLevel": "SINGLE_PASS_HQ",
                    "FramerateConversionAlgorithm": "DUPLICATE_DROP",
                    "UnregisteredSeiTimecode": "DISABLED",
                    "GopSizeUnits": "SECONDS",
                    "ParControl": "SPECIFIED",
                    "NumberBFramesBetweenReferenceFrames": 5,
                    "RepeatPps": "DISABLED",
                    "DynamicSubGop": "ADAPTIVE"
                  }
                },
                "AfdSignaling": "NONE",
                "DropFrameTimecode": "ENABLED",
                "RespondToAfd": "NONE",
                "ColorMetadata": "INSERT"
              },
              "NameModifier": "_Ott_Dash_Mp4_Avc_16x9_960x540p_30Hz_3.5Mbps_qvbr"
            },
            {
              "ContainerSettings": {
                "Container": "MPD"
              },
              "VideoDescription": {
                "Width": 1280,
                "ScalingBehavior": "DEFAULT",
                "Height": 720,
                "VideoPreprocessors": {
                  "Deinterlacer": {
                    "Algorithm": "INTERPOLATE",
                    "Mode": "DEINTERLACE",
                    "Control": "NORMAL"
                  }
                },
                "TimecodeInsertion": "DISABLED",
                "AntiAlias": "ENABLED",
                "Sharpness": 100,
                "CodecSettings": {
                  "Codec": "H_264",
                  "H264Settings": {
                    "InterlaceMode": "PROGRESSIVE",
                    "ParNumerator": 1,
                    "NumberReferenceFrames": 3,
                    "Syntax": "DEFAULT",
                    "FramerateDenominator": 1,
                    "GopClosedCadence": 1,
                    "HrdBufferInitialFillPercentage": 90,
                    "GopSize": 3,
                    "Slices": 1,
                    "GopBReference": "ENABLED",
                    "HrdBufferSize": 15000000,
                    "MaxBitrate": 6000000,
                    "SlowPal": "DISABLED",
                    "ParDenominator": 1,
                    "SpatialAdaptiveQuantization": "ENABLED",
                    "TemporalAdaptiveQuantization": "ENABLED",
                    "FlickerAdaptiveQuantization": "ENABLED",
                    "EntropyEncoding": "CABAC",
                    "FramerateControl": "SPECIFIED",
                    "RateControlMode": "QVBR",
                    "QvbrSettings": {
                      "QvbrQualityLevel": 8
                    },
                    "CodecProfile": "HIGH",
                    "Telecine": "NONE",
                    "FramerateNumerator": 30,
                    "MinIInterval": 0,
                    "AdaptiveQuantization": "HIGH",
                    "CodecLevel": "LEVEL_4",
                    "FieldEncoding": "PAFF",
                    "SceneChangeDetect": "ENABLED",
                    "QualityTuningLevel": "SINGLE_PASS_HQ",
                    "FramerateConversionAlgorithm": "DUPLICATE_DROP",
                    "UnregisteredSeiTimecode": "DISABLED",
                    "GopSizeUnits": "SECONDS",
                    "ParControl": "SPECIFIED",
                    "NumberBFramesBetweenReferenceFrames": 5,
                    "RepeatPps": "DISABLED",
                    "DynamicSubGop": "ADAPTIVE"
                  }
                },
                "AfdSignaling": "NONE",
                "DropFrameTimecode": "ENABLED",
                "RespondToAfd": "NONE",
                "ColorMetadata": "INSERT"
              },
              "NameModifier": "_Ott_Dash_Mp4_Avc_16x9_1280x720p_30Hz_6.0Mbps_qvbr"
            },
            {
              "ContainerSettings": {
                "Container": "MPD"
              },
              "VideoDescription": {
                "Width": 1920,
                "ScalingBehavior": "DEFAULT",
                "Height": 1080,
                "VideoPreprocessors": {
                  "Deinterlacer": {
                    "Algorithm": "INTERPOLATE",
                    "Mode": "DEINTERLACE",
                    "Control": "NORMAL"
                  }
                },
                "TimecodeInsertion": "DISABLED",
                "AntiAlias": "ENABLED",
                "Sharpness": 100,
                "CodecSettings": {
                  "Codec": "H_264",
                  "H264Settings": {
                    "InterlaceMode": "PROGRESSIVE",
                    "ParNumerator": 1,
                    "NumberReferenceFrames": 3,
                    "Syntax": "DEFAULT",
                    "FramerateDenominator": 1,
                    "GopClosedCadence": 1,
                    "HrdBufferInitialFillPercentage": 90,
                    "GopSize": 3,
                    "Slices": 1,
                    "GopBReference": "ENABLED",
                    "HrdBufferSize": 21250000,
                    "MaxBitrate": 8500000,
                    "SlowPal": "DISABLED",
                    "ParDenominator": 1,
                    "SpatialAdaptiveQuantization": "ENABLED",
                    "TemporalAdaptiveQuantization": "ENABLED",
                    "FlickerAdaptiveQuantization": "ENABLED",
                    "EntropyEncoding": "CABAC",
                    "FramerateControl": "SPECIFIED",
                    "RateControlMode": "QVBR",
                    "QvbrSettings": {
                      "QvbrQualityLevel": 8
                    },
                    "CodecProfile": "HIGH",
                    "Telecine": "NONE",
                    "FramerateNumerator": 30,
                    "MinIInterval": 0,
                    "AdaptiveQuantization": "HIGH",
                    "CodecLevel": "LEVEL_4",
                    "FieldEncoding": "PAFF",
                    "SceneChangeDetect": "ENABLED",
                    "QualityTuningLevel": "SINGLE_PASS_HQ",
                    "FramerateConversionAlgorithm": "DUPLICATE_DROP",
                    "UnregisteredSeiTimecode": "DISABLED",
                    "GopSizeUnits": "SECONDS",
                    "ParControl": "SPECIFIED",
                    "NumberBFramesBetweenReferenceFrames": 5,
                    "RepeatPps": "DISABLED",
                    "DynamicSubGop": "ADAPTIVE"
                  }
                },
                "AfdSignaling": "NONE",
                "DropFrameTimecode": "ENABLED",
                "RespondToAfd": "NONE",
                "ColorMetadata": "INSERT"
              },
              "NameModifier": "_Ott_Dash_Mp4_Avc_16x9_1920x1080p_30Hz_8.5Mbps_qvbr"
            },
            {
              "ContainerSettings": {
                "Container": "MPD"
              },
              "AudioDescriptions": [
                {
                  "AudioTypeControl": "FOLLOW_INPUT",
                  "AudioSourceName": "Audio Selector 1",
                  "CodecSettings": {
                    "Codec": "AAC",
                    "AacSettings": {
                      "AudioDescriptionBroadcasterMix": "NORMAL",
                      "Bitrate": 96000,
                      "RateControlMode": "CBR",
                      "CodecProfile": "HEV1",
                      "CodingMode": "CODING_MODE_2_0",
                      "RawFormat": "NONE",
                      "SampleRate": 48000,
                      "Specification": "MPEG4"
                    }
                  },
                  "LanguageCodeControl": "FOLLOW_INPUT",
                  "AudioType": 0
                }
              ],
              "NameModifier": "_Ott_Dash_Mp4_Aac_He_96Kbps"
            }
          ],
          "OutputGroupSettings": {
            "Type": "DASH_ISO_GROUP_SETTINGS",
            "DashIsoGroupSettings": {
              "SegmentLength": 30,
              "Destination": "s3://destinationbucket/guid/dash/",
              "FragmentLength": 3,
              "SegmentControl": "SEGMENTED_FILES",
              "HbbtvCompliance": "NONE"
            }
          }
        }
      ],
      "AdAvailOffset": 0,
      "Inputs": [
        {
          "AudioSelectors": {
            "Audio Selector 1": {
              "Offset": 0,
              "DefaultSelection": "DEFAULT",
              "ProgramSelection": 1
            }
          },
          "VideoSelector": {
            "ColorSpace": "FOLLOW",
            "Rotate": "DEGREE_0",
            "AlphaBehavior": "DISCARD"
          },
          "FilterEnable": "AUTO",
          "PsiControl": "USE_PSI",
          "FilterStrength": 0,
          "DeblockFilter": "DISABLED",
          "DenoiseFilter": "DISABLED",
          "TimecodeSource": "ZEROBASED",
          "FileInput": "s3://sourcebucket/assets01/test.mp4"
        }
      ]
    },
    "AccelerationSettings": {
      "Mode": "PREFERRED"
    },
    "StatusUpdateInterval": "SECONDS_60"
  }

本ソリューションの実装ガイドによると、以下の出力を生成するとの記載があります。

MP4 @ 1920 x 1080

1920 x 1080、1280 x 720、960 x 540、640 x 360、480 x 270 の 5 つのレンディションを持つ HLS 適応ビットレート (ABR)

1920 x 1080、1280 x 720、960 x 540、640 x 360、480 x 270の5つのレンディションを持つDASH適応ビットレート(ABR)

様々な出力を生成してくれるのは検証用途には嬉しいですが、合計 11 もの出力が生成される為、大量の動画ファイルを変換するとそれなりの費用が発生する可能性があります。

その為、本ソリューションをデプロイした後は不要な出力設定を job-settinngs.json から削除したほうが良さそうです。


また、その他の主なジョブ設定は以下となっていました。

  • 映像コーデック ... 全て AVC(H.264)
  • フレームレート ... レンディション毎に異なるが、最大でも 30fps
  • 品質チューニングレベル ... 全て SINGLE_PASS_HQ
  • 高速化 ... 有効
  • レート制御モード ... 全て QVBR

上記より、ソリューションデプロイ時の料金レートとしてはプロフェッショナル階層 & 1パス & 30fps以下 で計算される形となりそうです。(料金レートはジョブが実行されるリージョンによって変化します)

AWS Elemental MediaConvert 料金


注意点として、(放送レベルを意識した設定だからだと思いますが)QBVR とはいえ 1080p で最大ビットレート 8.5Mbps など、ユースケースによっては大きめのビットレートが割り当てられています。過剰なビットレートで動画変換〜配信を実施してしまうと、ストレージやデータ転送量に関するコスト増加に繋がる為、こちらはサービスに合わせてきちんと調整しましょう。

"H264Settings": {
    (...)
    "MaxBitrate": 8500000,
    (...)
    "RateControlMode": "QVBR",
    "QvbrSettings": {
        "QvbrQualityLevel": 9
    },

動画ファイルをアップロードしてみる

長々とリソースの確認をしてきましたが、とりあえずこのソリューションを使ってみましょう。

動画ファイルのアップロード

source バケットの assets01 配下に、「sample_2.mp4」という動画ファイルをアップロードしました。

MediaConvert のジョブを確認

MediaConvnert のコンソール画面を開き、ジョブ一覧画面を確認するとジョブが生成され、完了した事が確認できます。(事前に一回テストを行なった為、すでにジョブが 1つあります)

変換後の動画ファイルを確認する

destination バケットを開くと、uuid でフォルダが生成されています。

その配下には、AppleHLS1DASHISO1FileGroup1 の 3フォルダが作成されています。

試しに AppleHLS1 を開いてみると、HLS 形式に変換された動画が格納されていることを確認できます。

取得してみる

試しに、CloudFront 経由で HLS 形式に変換された動画を取得してみます。

今回は VideoJS HLS を使用して確認しました。

URL(= CloudFront ドメイン + S3 パス)を入力し、Load を行うと問題なく再生できる事が確認できます。

おわりに

AWS MediaServices に関する新たなソリューションである「Video on Demand on AWS Foundation」を触ってみました。

細かな設定変更は必要かと思いますが、本番環境等でも使えるソリューションがサクッとデプロイできる良いソリューションだと感じました。

当然、十分な検証を行う必要はありますが、要件にマッチしそうであれば導入を検討してみても良いかと思います。


以上、AWS 事業本部の大前でした。

参考