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

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

こんにちは、大前です。

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 事業本部の大前でした。

参考