Elastic TranscoderからMediaConvertへのPresets変換ツール「VOD Preset Converter」を動かしてみた!

Elastic TranscoderからMediaConvertへのPresets変換ツール「VOD Preset Converter」を動かしてみた!

Python 2.7がデフォルトでインストールされているAmazon Linux 2上でBoto(Boto3じゃありません)をインストールするなどして、Amazon VOD Preset Converterを動作させる環境を整えてみました。
Clock Icon2025.02.13

はじめに

清水です。2013年にリリースされたAWSのファイルベース動画変換サービスAmazon Elastic Transcoder、今年2025年11月にサービス終了することがアナウンスされています。

移行先となるサービスとしてAWS Elemental MediaConvertが挙げられます。Elastic Transcoderと同じファイルベースの動画変換サービスでありながら、例えばAV1など最新のコーデックやフォーマットなどにも対応しています。ファイルの入出力をS3経由で行うなど、MediaConvertの基本的な使い方はElastic Transcoderと同様です。

ただし、出力のエンコードパラメータを定義しているプリセット(Preset)についてはMediaConvertとElastic Transcoderで共通化されておらず、Elastic TranscoderのプリセットをMediaConvertのプリセットに変換する対応が必要となります。このプリセットの変換の1つの手段として、AWSが提供している Amazon VOD Preset Converter というツール(スクリプト)を用いることが検討できます。Elastic TranscoderからMediaConvertへの移行を案内しているAWS for M&E Blogのブログエントリ、How to migrate workflows from Amazon Elastic Transcoder to AWS Elemental MediaConvert | AWS for M&E Blogの「Migrate your settings using this new guide and script」で紹介されているものですね。

使い方などは上記GitHubのREADMEのほか、以下のWhite paperのPDFにもまとめられてます。

このツール、「Amazon VOD Preset Converter」を使えばElastic TranscoderからMediaConvertへのプリセット変換が捗りそうだな、と試してみようと思ったのですが、READMEを読んでいくと以下の文言が目に入りました。Setting up Enviromentの項目です。

You will need to install Python 2.7 onto the machine where you are running the script

動作のためにはPython 2.7の環境が必要とのことです。そのほか、実際のスクリプトets_mediaconvert_preset_v2.pyを確認するとわかるのですが Boto(Boto3ではなく)も必要になります。(どうやらまだPython 2.7の時代に書かれたツールなのかな、という印象を持っています。)

2025年の現在、Python 2.7はサポートが終了している状況です。Python 3でこのAmazon VOD Preest Convertを動作させることはできないかな、と調べてみたところ、該当のGitHubリポジトリでPython 3.13でスクリプトが動作しなかったというIssueを見つけました。どうやらPython 3環境で動作させる、ということは簡単ではなさそうです。そもそも筆者はPython自体に疎く、スクリプトをPython 3環境に移行するということは現実的ではないと判断しました。

ところでこのAmazon VOD Preest Convertは、遅くとも2025年11月には役目を終えるはずのツールです。であれば割り切って、一時的なPython 2.7の環境をEC2インスタンス上に構築して動作させてしまおう、と考えました。またPython 2.7の環境の準備も可能な限り簡略化しようということで、デフォルトでインストールされているAmazon Linux 2のAMIを使用することとしました。Amazon Linux 2のサポート終了が2026年6月に予定されていますが、これも一時的な利用と割り切ります。本エントリでは、そんな一時的に準備したAmazon Linux 2、Python 2.7な環境でAmazon VOD Preset Convertを動作させるまでの手順をまとめてみます。

Amazon VOD Preset Convertを動かすために

まずは今回、Amazon VOD Preset Convertを動かすための方針、ならびに注意点などについて改めてまとめておきます。上記でも少し触れた、Python 2.7の実行環境の選定理由、また実行に必要なAWSの認証情報についてもまとめます。

Pythonのバージョンと実行環境について

現在GitHubで公開されているAmazon VOD Preset ConvertのスクリプトはPython 2.7を前提としたものです。Python 3への移行は行わず、一時的なPython 2.7の環境を準備してそこで動作させることとします。この一時的な環境にはAWSクラウド上の仮想サーバ、EC2インスタンスを使用することとしました。

またPython 2.7の環境について、ツールの使い方を紹介しているWhite paperではソースコードからconfigure, make, make installする方法が記載されています。ですが、コンパイルエラーなどで手間がかかりそうな気がしたためこの方法は避けました。

代わりにデフォルトでPython 2.7がインストールされている環境を探します。確認してみると、Amazon Linux 2ではまだPython 2.7環境が動作するとのことです。(もちろん、Python 3環境への移行が推奨されてはいます。)

Q:Python 2.7 がまだ Amazon Linux 2 の一部である理由は何ですか?

アップストリームの Python コミュニティが 2020 年 1 月に Python 2.7 終了日を宣言した場合でも、Amazon Linux 2 コアパッケージの LTS 契約通りに引き続き Python 2 の重要なセキュリティパッチを提供します。

Q:コードを Python 3 に移行し、Python 2.7 から移行する必要がありますか?

Amazon Linux 2 システムに Python 3 をインストールし、コードとアプリケーションを Python 3 に移行することを強くお勧めします。

Q:Amazon Linux 2 は Python 2.7 から移行していますか?

デフォルトの Python インタープリタを変更する予定はありません。Amazon Linux 2 の存続期間中、Python 2.7 をデフォルトとして保持することを意図しています。必要に応じて、Python 2.7 パッケージのセキュリティ修正をバックポートします。

引用元: よくある質問 - Amazon Linux 2 | AWS

そもそもAmazon Linux 2自体、サポート終了が(1年の延びたとはいえ)2026年6月30日に予定されています。新規の環境を構築するのであれば、Amazon Linux 2ではなく後継のAmazon Linux 2023を選択するのがベストでしょう。ですが、Amazon Linux 2023にはPython 2.7の環境はインストールされておらず、Python 3を利用しているという状況です。(Python in AL2023 - Amazon Linux 2023

今回動作させるAmazon VOD Preset Convert、遅くとも2025年11月にはElastic Transcoderのサービス終了とともにその役割を終えるはずです。Amazon Linux 2のサポート終了よりも先ですよね。ということで、ここは割り切ってAmazon Linux 2を使用することとしました。最新のAmazon Linux 2 AMIからEC2インスタンスを起動することで、Python 2.7の環境を準備します。

AWSの認証情報と権限について

Amazon VOD Preset ConvertのREADME.mdを確認すると、AWS CLIのインストールならびにaws configureを実行してAWS認証情報を設定するよう記載があります。「Installing AWS CLI」の項目ですね。

実行するスクリプトetc_mediaconvert-preset_v2.pyを簡単に確認してみましたが、AWS CLIのコマンド自体を実行しているのかは不明でした。ただ、AWSの認証情報自体は必要である認識です。(認証情報込みでAWS CLIの実行環境が必要なのか、SDK実行の認証情報のみが設定されていれば十分なのかは判断がつきませんでした。)

今回は先にも述べた通り、Amazon Linux 2をAMI起動したEC2インスタンで利用します。Amazon Linux 2にはAWS CLIがデフォルトでインストールされているため、これを利用することとしました。

AWS認証情報については、IAMユーザを作成してアクセスキー・シークレットキーを生成するという方法もあります。(README.mdはこちらを想定した設定方法かと思います。)ですが、EC2インスタン上での認AWS証情報の利用ですので、IAMロールをEC2にアタッチして使用することとしました。

なお後述しますが、事情によりEC2インスタンスメタデータは推奨されているIMDSv2ではなく従来までのv1を使用します。セキュリティ面も考慮して、IAMロールには必要最低限の権限を設定するようにします。今回は実行するスクリプトetc_mediaconvert-preset_v2.pyを確認し、Elastic Transcoderの読み取り権限(ReadOnly)があれば十分であると考え、AWSマネージドポリシーのAmazonElasticTranscoder_ReadOnlyAccessを設定することとしました。

Amazon Linux 2なEC2インスタンスを起動する

それでは、実際にAmazon VOD Preset Convertを動作させるためのAmazon Linux 2なEC2インスタンスを起動していきます。以下、IAMロールの作成、続いてEC2インスタンス起動の手順についてまとめます。

IAMロールの準備

まずはEC2インスタンスにアタッチするIAMロールの作成です。IAMのマネジメントコンソール、Access managementのRolesのページ、(Create role)ボタンから進みます。Step 1のSelect trusted entityのTrusted entity typeではAWS serviceを選択、Use caseのService or user caseでEC2を選び、続くUser caseでもEC2を選択して次に進みます。

em01

続くStep 2のAdd permissionsではAmazonElasticTranscoder_ReadOnlyAccessを選択しました。複数のPermissions policiesがリストアップされますが、ElasticTranscoderなどで検索すると探しやすいです。Set permissions boundaryはデフォルトのCreate role without a permissions boundaryのまま(Next)で進みます。

em02

Step 3のName, review, and createではRole nameを適切に入力します。各項目を確認して、(Create role)ボタンでIAMロールを作成します。

em03

IAMロールが作成できました。EC2インスタンス起動時にこのIAMロール(インスタンスプロファイル)を指定するので、名称をメモしておきましょう。

em04

EC2インスタンスの起動

続いてEC2インスタンスの起動です。EC2のマネジメントコンソール、Instances一覧画面の(Launch instances)ボタンから進みます。Nameを適切に設定し、AMI(Application and OS Imagesの項目)はAmazon Linux 2を選択します。インスタンスタイプで最小のt4g.nanoを使用したかったため、Architectureは64-bit (Arm) を選択しました。今回、実際に選択したAMIはami-057ce021fb4e80e38となります。

em05

インスタンスタイプはt4g.nanoを、またストレージはgp3を3,000 IOPS、125MB/sスループットで指定しました。これらは最小限のスペックのEC2インスタンスでの起動を意図したものです。(スクリプトの実行のみですので、EC2インスタンスのスペックは低くてもよいと考えました。)ネットワークまわりも適切に設定します。今回はパブリックアクセス可能なサブネットに配置、SSH接続ができるように利用するIPアドレスからのTCP 22番ポートのみを開放したSecurity Groupをアタッチしました。要件などに応じてEC2 Instance ConnectやSession Managerなどを活用しましょう。

Advanced detailsの項目を展開し、IAM instance profileの項目で先ほど作成したIAMロールを選択します。

em06

またMetadataまわりについて、Metadata versionはデフォルトのV2 only (token required)からV1 and V2(token optional)に変更しました。これは、V2 only (token required)ではboto.exception.NoAuthHandlerFound: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV4Handler'] Check your credentialsというエラーが発生してしまったためです。このエラーはV2 only (token required)からV1 and V2(token optional)に変更することで解決しました。スクリプト内で使用している[Boto](https://docs.pythonboto.org/en/latest/](Boto3ではなく)は最新のv2.49でもリリースが2018年ということもあり、2019年リリースのIMDSv2には対応していないのかな、と推測してます。

em07

EC2インスタンスが起動できました。

em08

EC2インスタンスに実行環境を準備する

EC2インスタンス起動後の確認

EC2インスタンスを起動したらSSHで接続します。またあらかじめyumコマンドでgitをインストールしておきます。

   ,     #_
   ~\_  ####_        Amazon Linux 2
  ~~  \_#####\
  ~~     \###|       AL2 End of Life is 2026-06-30.
  ~~       \#/ ___
   ~~       V~' '->
    ~~~         /    A newer version of Amazon Linux is available!
      ~~._.   _/
         _/ _/       Amazon Linux 2023, GA and supported until 2028-03-15.
       _/m/'           https://aws.amazon.com/linux/amazon-linux-2023/

[ec2-user@ip-10-82-21-32 ~]$ 
[ec2-user@ip-10-82-21-32 ~]$ sudo yum install -y git

この段階で、pythonコマンドでPython 2.7が実行可能であること、またawsコマンドでAWS CLI 1.18が利用可能であることを確認しておきます。

[ec2-user@ip-10-82-21-32 ~]$ python --version
Python 2.7.18
[ec2-user@ip-10-82-21-32 ~]$ aws --version
aws-cli/1.18.147 Python/2.7.18 Linux/5.10.233-224.894.amzn2.aarch64 botocore/1.18.6

aws configureコマンドは実行しませんが、インスタンスメタデータを利用してAWS CLIがEC2インスタンス起動時に設定したIAMロールで実行されていることも確認しておきましょう。aws sts get-caller-identityコマンドを利用します。

[ec2-user@ip-10-82-21-32 ~]$ aws sts get-caller-identity
{
    "Account": "123456789012",
    "UserId": "ARxxxxxxxxxxxxxxxxxxx:i-0bxxxxxxxxxxxxxxx",
    "Arn": "arn:aws:sts::123456789012:assumed-role/VODPresetConvertOnEC2-IAMRole/i-0bxxxxxxxxxxxxxxx"
}

Python 2.7用のpipをインストール

Amazon VOD Preset ConverterREADMEWhite paperには記載されていませんが、スクリプトets_mediaconvert_preset_v2.pyの実行にはBotoならびにBoto3が必要です。これらをインストールするため、pipの実行環境を準備します。

起動したAmazon Linux 2環境、Python 2.7は実行できますがpipはインストールされていないようです。(pipと入力しTABキーで保管してみましたが、Python 3環境向けのpipしかインストールされていない状況とみています。)

[ec2-user@ip-10-82-21-32 ~]$ pip
-bash: pip: コマンドが見つかりません
[ec2-user@ip-10-82-21-32 ~]$ pip
pip-3    pip-3.7  pip3     pip3.7

pipをインストールする必要があるのですが、Python 2.7環境へのインストールについては一癖あるようです。以下のサイトなどを参考に進めました。

公式ドキュメントにも記載があるように、Pythonの現行バージョンであればget-pip.pyをダウンロードして実行することでpipをインストールできるようです。

$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ sudo pytho get-pip.py

ですが、Python 2.7環境では以下のようなERRORとなってしまいます。上記URLのget-pip.pyではなく、ERROR内容に記載のある(Python 2.7環境用の)URLのget-pip.pyを実行する必要があります。

$ sudo python get-pip.py
ERROR: This script does not work on Python 2.7. The minimum supported Python version is 3.8. Please use https://bootstrap.pypa.io/pip/2.7/get-pip.py instead.

Python 2.7用のget-pip.pyを指定のURLからダウンロードしスーパーユーザにスイッチして実行、pipをインストールします。

[ec2-user@ip-10-82-21-32 ~]$ ls
[ec2-user@ip-10-82-21-32 ~]$ curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1863k  100 1863k    0     0  16.5M      0 --:--:-- --:--:-- --:--:-- 16.6M
[ec2-user@ip-10-82-21-32 ~]$ ls -l
合計 1864
-rw-rw-r-- 1 ec2-user ec2-user 1908226  2月  7 09:50 get-pip.py
[ec2-user@ip-10-82-21-32 ~]$ sudo python get-pip.py
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality.
Collecting pip<21.0
  Downloading pip-20.3.4-py2.py3-none-any.whl (1.5 MB)
     |████████████████████████████████| 1.5 MB 24.8 MB/s
Collecting wheel
  Downloading wheel-0.37.1-py2.py3-none-any.whl (35 kB)
Installing collected packages: pip, wheel
Successfully installed pip-20.3.4 wheel-0.37.1
[ec2-user@ip-10-82-21-32 ~]$ 

インストールできました!確認としてバージョン情報を表示してみます。

[ec2-user@ip-10-82-21-32 ~]$ pip --version
pip 20.3.4 from /usr/lib/python2.7/site-packages/pip (python 2.7)
[ec2-user@ip-10-82-21-32 ~]$ 

BotoとBoto3のインストール

続いてBotoとBoto3をインストールします。Python環境でAWS SDKを実行する場合、通常はBoto3を使うことが一般的かと思います。しかし、Amazon VOD Preset ConvertをBoto3のみをインストールした環境下で実行すると、以下のようにImportError: No module named boto.elastictranscoderとエラーとなってしまいます。

$ python ets_mediaconvert_preset_v2.py
Traceback (most recent call last):
  File "ets_mediaconvert_preset_v2.py", line 34, in <module>
    import boto.elastictranscoder
ImportError: No module named boto.elastictranscoder

Boto3ではなく、その前身のBotoをインストールする必要があります。またBoto3についても実行に必要になるためインストールします。

Boto

まずはBotoのインストールです。pip install botoコマンドでインストールします。

[ec2-user@ip-10-82-21-32 ~]$ pip install boto
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality.
Defaulting to user installation because normal site-packages is not writeable
Collecting boto
  Downloading boto-2.49.0-py2.py3-none-any.whl (1.4 MB)
     |████████████████████████████████| 1.4 MB 24.6 MB/s
Installing collected packages: boto
Successfully installed boto-2.49.0
[ec2-user@ip-10-82-21-32 ~]$

Boto3

続いてBoto3のインストールです。pip install boto3コマンドを実行します。ERRORがでていますが、Boto3自体のインストールは成功していると判断し、次に進めました。

[ec2-user@ip-10-82-21-32 ~]$ pip install boto3
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality.
Defaulting to user installation because normal site-packages is not writeable
Collecting boto3
  Downloading boto3-1.17.112-py2.py3-none-any.whl (131 kB)
     |████████████████████████████████| 131 kB 25.1 MB/s
Collecting s3transfer<0.5.0,>=0.4.0
  Downloading s3transfer-0.4.2-py2.py3-none-any.whl (79 kB)
     |████████████████████████████████| 79 kB 11.3 MB/s
Requirement already satisfied: jmespath<1.0.0,>=0.7.1 in /usr/lib/python2.7/site-packages (from boto3) (0.9.3)
Collecting botocore<1.21.0,>=1.20.112
  Downloading botocore-1.20.112-py2.py3-none-any.whl (7.7 MB)
     |████████████████████████████████| 7.7 MB 70.6 MB/s
Requirement already satisfied: futures<4.0.0,>=2.2.0; python_version == "2.7" in /usr/lib/python2.7/site-packages (from s3transfer<0.5.0,>=0.4.0->boto3) (3.0.5)
Requirement already satisfied: urllib3<1.27,>=1.25.4 in /usr/lib/python2.7/site-packages (from botocore<1.21.0,>=1.20.112->boto3) (1.25.9)
Requirement already satisfied: python-dateutil<3.0.0,>=2.1 in /usr/lib/python2.7/site-packages (from botocore<1.21.0,>=1.20.112->boto3) (2.6.1)
Requirement already satisfied: six>=1.5 in /usr/lib/python2.7/site-packages (from python-dateutil<3.0.0,>=2.1->botocore<1.21.0,>=1.20.112->boto3) (1.11.0)
Installing collected packages: botocore, s3transfer, boto3
ERROR: pip's legacy dependency resolver does not consider dependency conflicts when selecting packages. This behaviour is the source of the following dependency conflicts.
awscli 1.18.147 requires botocore==1.18.6, but you'll have botocore 1.20.112 which is incompatible.
awscli 1.18.147 requires s3transfer<0.4.0,>=0.3.0, but you'll have s3transfer 0.4.2 which is incompatible.
Successfully installed boto3-1.17.112 botocore-1.20.112 s3transfer-0.4.2
[ec2-user@ip-10-82-21-32 ~]$

Amazon VOD Preset Convertを実行する

Amazon VOD Preset Convertの実行環境が準備できました。それでは実際に、Amazon VOD Preset Convertで提供されているスクリプトets_mediaconvert_preset_v2.pyを実行していきます。

GitHubからリポジトリをクローン

まずはGitHubのリポジトリaws-samples/amazon-vod-preset-convertから、git cloneコマンドでamazon-vod-preset-convertリポジトリをローカルにクローンします。

[ec2-user@ip-10-82-21-32 ~]$ ls
get-pip.py
[ec2-user@ip-10-82-21-32 ~]$ git clone https://github.com/aws-samples/amazon-vod-preset-convert
Cloning into 'amazon-vod-preset-convert'...
remote: Enumerating objects: 50, done.
remote: Total 50 (delta 0), reused 0 (delta 0), pack-reused 50 (from 1)
Receiving objects: 100% (50/50), 25.38 KiB | 25.38 MiB/s, done.
Resolving deltas: 100% (20/20), done.
[ec2-user@ip-10-82-21-32 ~]$ ls
amazon-vod-preset-convert  get-pip.py
[ec2-user@ip-10-82-21-32 ~]$ 

クローンしたリポジトリのディレクトリ内にChange Directoryしておきましょう。

[ec2-user@ip-10-82-21-32 ~]$ cd amazon-vod-preset-convert/
[ec2-user@ip-10-82-21-32 amazon-vod-preset-convert]$ ls
CODE_OF_CONDUCT.md  LICENSE  README.md
CONTRIBUTING.md     NOTICE   ets_mediaconvert_preset_v2.py
[ec2-user@ip-10-82-21-32 amazon-vod-preset-convert]$ ls -l
合計 68
-rw-rw-r-- 1 ec2-user ec2-user   311  2月  7 10:11 CODE_OF_CONDUCT.md
-rw-rw-r-- 1 ec2-user ec2-user  3643  2月  7 10:11 CONTRIBUTING.md
-rw-rw-r-- 1 ec2-user ec2-user 11358  2月  7 10:11 LICENSE
-rw-rw-r-- 1 ec2-user ec2-user    99  2月  7 10:11 NOTICE
-rw-rw-r-- 1 ec2-user ec2-user  3381  2月  7 10:11 README.md
-rwxrwxr-x 1 ec2-user ec2-user 38676  2月  7 10:11 ets_mediaconvert_preset_v2.py
[ec2-user@ip-10-82-21-32 amazon-vod-preset-convert]$ 

スクリプトをInteractive Modeで実行

クローンしてきたリポジトリ内のスクリプトets_mediaconvert_preset_v2.pyを実行します。まずはInteractive Modeで試してみました。-iオプションをつけ、python ets_mediaconvert_preset_v2.py -iコマンドで実行します。

実行すると (1) Amazon Elastic Transcoderの実行をサポートしているリージョン(2) Amazon Elastic TranscoderのプリセットID(3) Output group type の3つを順に入力するよう促されます。

(1)のAmazon Elastic Transcoderの実行をサポートしているリージョンについては、ap-northeast-1を入力しました。

(2)のプリセットIDについては、Elastic TranscoderのマネジメントコンソールからSystem preset: Generic 1080pのプリセットを参照、そのPreset Id1351620000001-000001を入力しました。

em10

em09

(3) Output group typeについてはMeidiaConvertのOutput groupが該当する認識です。今回はfileを入力しました。

em11

以下、実際の実行結果です。3つ目のOutput group typeを入力後、MediaConvert用のプリセットが出力されています。この出力、後半はThumbnails用のものとなっていますね。

[ec2-user@ip-10-82-21-32 amazon-vod-preset-convert]$ python ets_mediaconvert_preset_v2.py -i
Please type in a supported ETS region: ap-northeast-1
Preset ID: 1351620000001-000001
Please type in output a output group type you want to place this ETS preset into, options are file, apple, dash, smooth: file
{
    "Description": "System preset generic 1080p",
    "Name": "System preset: Generic 1080p",
    "Settings": {
        "AudioDescriptions": [
            {
                "AudioSourceName": "Audio Selector 1",
                "AudioTypeControl": "FOLLOW_INPUT",
                "CodecSettings": {
                    "AacSettings": {
                        "AudioDescriptionBroadcasterMix": "NORMAL",
                        "Bitrate": 128000,
                        "CodecProfile": "LC",
                        "CodingMode": "CODING_MODE_2_0",
                        "RateControlMode": "CBR",
                        "RawFormat": "NONE",
                        "SampleRate": 44100,
                        "Specification": "MPEG4"
                    },
                    "Codec": "AAC"
                },
                "LanguageCodeControl": "FOLLOW_INPUT"
            }
        ],
        "ContainerSettings": {
            "Container": "MP4",
            "Mp4Settings": {
                "CslgAtom": "INCLUDE",
                "FreeSpaceBox": "EXCLUDE",
                "MoovPlacement": "PROGRESSIVE_DOWNLOAD"
            }
        },
        "VideoDescription": {
            "AfdSignaling": "NONE",
            "AntiAlias": "ENABLED",
            "CodecSettings": {
                "Codec": "H_264",
                "H264Settings": {
                    "AdaptiveQuantization": "HIGH",
                    "Bitrate": 5400000,
                    "CodecLevel": "LEVEL_4",
                    "CodecProfile": "BASELINE",
                    "EntropyEncoding": "CAVLC",
                    "FlickerAdaptiveQuantization": "DISABLED",
                    "FramerateControl": "SPECIFIED",
                    "FramerateConversionAlgorithm": "DUPLICATE_DROP",
                    "FramerateDenominator": 1001,
                    "FramerateNumerator": 30000,
                    "GopBReference": "DISABLED",
                    "GopClosedCadence": 1,
                    "GopSize": 90,
                    "GopSizeUnits": "FRAMES",
                    "HrdBufferInitialFillPercentage": 90,
                    "InterlaceMode": "PROGRESSIVE",
                    "MinIInterval": 0,
                    "NumberBFramesBetweenReferenceFrames": 0,
                    "NumberReferenceFrames": 3,
                    "ParControl": "INITIALIZE_FROM_SOURCE",
                    "QualityTuningLevel": "SINGLE_PASS",
                    "RateControlMode": "CBR",
                    "RepeatPps": "DISABLED",
                    "SceneChangeDetect": "ENABLED",
                    "Slices": 1,
                    "SlowPal": "DISABLED",
                    "Softness": 0,
                    "SpatialAdaptiveQuantization": "ENABLED",
                    "Syntax": "DEFAULT",
                    "Telecine": "NONE",
                    "TemporalAdaptiveQuantization": "ENABLED",
                    "UnregisteredSeiTimecode": "DISABLED"
                }
            },
            "ColorMetadata": "INSERT",
            "Height": 1080,
            "RespondToAfd": "NONE",
            "ScalingBehavior": "DEFAULT",
            "Sharpness": 100,
            "TimecodeInsertion": "DISABLED",
            "Width": 1920
        }
    }
}
====================THUMBNAILS=====================
==================SAVING FILES=========================
{
    "Settings": {
        "VideoDescription": {
            "CodecSettings": {
                "FrameCaptureSettings": {
                    "MaxCaptures": 10000000,
                    "FramerateDenominator": 60,
                    "FramerateNumerator": 1,
                    "Quality": 80
                },
                "Codec": "FRAME_CAPTURE"
            },
            "DropFrameTimecode": "ENABLED",
            "RespondToAfd": "NONE",
            "Sharpness": 50,
            "AntiAlias": "ENABLED",
            "AfdSignaling": "NONE",
            "Width": 192,
            "ScalingBehavior": "DEFAULT",
            "ColorMetadata": "INSERT",
            "Height": 144,
            "TimecodeInsertion": "DISABLED"
        },
        "ContainerSettings": {
            "Container": "RAW"
        }
    },
    "Description": "1351620000001-000001 Thumbnails",
    "Name": "1351620000001-000001 Thumbnails"
}
[ec2-user@ip-10-82-21-32 amazon-vod-preset-convert]$

スクリプトで生成したプリセットをファイルに保存

続いてNon-interactiveなMode(バッチ、スクリプト)で実行してみます。実行時に-fオプションで生成されたプリセットをファイルに保存します。その他、オプションとして(1) -rでAWSリージョン、(2) -pでElastic TranscoderのプリセットID、(3) -cでOutput group typeをそれぞれ指定します。オプションの詳細については、README.mdの「Script Parameters」の項目やhelp messages(-hオプション付きでスクリプトを実行)を確認しましょう。

以下、実行結果です。(1)-(3)の指定内容は上記のInteractive Modeと同等としました。-fオプションは引数不要です。

[ec2-user@ip-10-82-21-32 amazon-vod-preset-convert]$ python ets_mediaconvert_preset_v2.py -r ap-northeast-1 -p 1351620000001-000001 -c file -f
{
    "Description": "System preset generic 1080p",
    "Name": "System preset: Generic 1080p",
    "Settings": {
        "AudioDescriptions": [
            {
                "AudioSourceName": "Audio Selector 1",
                "AudioTypeControl": "FOLLOW_INPUT",
                "CodecSettings": {
                    "AacSettings": {
                        "AudioDescriptionBroadcasterMix": "NORMAL",
                        "Bitrate": 128000,
                        "CodecProfile": "LC",
                        "CodingMode": "CODING_MODE_2_0",
                        "RateControlMode": "CBR",
                        "RawFormat": "NONE",
                        "SampleRate": 44100,
                        "Specification": "MPEG4"
                    },
                    "Codec": "AAC"
                },
                "LanguageCodeControl": "FOLLOW_INPUT"
            }
        ],
        "ContainerSettings": {
            "Container": "MP4",
            "Mp4Settings": {
                "CslgAtom": "INCLUDE",
                "FreeSpaceBox": "EXCLUDE",
                "MoovPlacement": "PROGRESSIVE_DOWNLOAD"
            }
        },
        "VideoDescription": {
            "AfdSignaling": "NONE",
            "AntiAlias": "ENABLED",
            "CodecSettings": {
                "Codec": "H_264",
                "H264Settings": {
                    "AdaptiveQuantization": "HIGH",
                    "Bitrate": 5400000,
                    "CodecLevel": "LEVEL_4",
                    "CodecProfile": "BASELINE",
                    "EntropyEncoding": "CAVLC",
                    "FlickerAdaptiveQuantization": "DISABLED",
                    "FramerateControl": "SPECIFIED",
                    "FramerateConversionAlgorithm": "DUPLICATE_DROP",
                    "FramerateDenominator": 1001,
                    "FramerateNumerator": 30000,
                    "GopBReference": "DISABLED",
                    "GopClosedCadence": 1,
                    "GopSize": 90,
                    "GopSizeUnits": "FRAMES",
                    "HrdBufferInitialFillPercentage": 90,
                    "InterlaceMode": "PROGRESSIVE",
                    "MinIInterval": 0,
                    "NumberBFramesBetweenReferenceFrames": 0,
                    "NumberReferenceFrames": 3,
                    "ParControl": "INITIALIZE_FROM_SOURCE",
                    "QualityTuningLevel": "SINGLE_PASS",
                    "RateControlMode": "CBR",
                    "RepeatPps": "DISABLED",
                    "SceneChangeDetect": "ENABLED",
                    "Slices": 1,
                    "SlowPal": "DISABLED",
                    "Softness": 0,
                    "SpatialAdaptiveQuantization": "ENABLED",
                    "Syntax": "DEFAULT",
                    "Telecine": "NONE",
                    "TemporalAdaptiveQuantization": "ENABLED",
                    "UnregisteredSeiTimecode": "DISABLED"
                }
            },
            "ColorMetadata": "INSERT",
            "Height": 1080,
            "RespondToAfd": "NONE",
            "ScalingBehavior": "DEFAULT",
            "Sharpness": 100,
            "TimecodeInsertion": "DISABLED",
            "Width": 1920
        }
    }
}
==================SAVING FILES=========================
====================THUMBNAILS=====================
==================SAVING FILES=========================
{
    "Settings": {
        "VideoDescription": {
            "CodecSettings": {
                "FrameCaptureSettings": {
                    "MaxCaptures": 10000000,
                    "FramerateDenominator": 60,
                    "FramerateNumerator": 1,
                    "Quality": 80
                },
                "Codec": "FRAME_CAPTURE"
            },
            "DropFrameTimecode": "ENABLED",
            "RespondToAfd": "NONE",
            "Sharpness": 50,
            "AntiAlias": "ENABLED",
            "AfdSignaling": "NONE",
            "Width": 192,
            "ScalingBehavior": "DEFAULT",
            "ColorMetadata": "INSERT",
            "Height": 144,
            "TimecodeInsertion": "DISABLED"
        },
        "ContainerSettings": {
            "Container": "RAW"
        }
    },
    "Description": "1351620000001-000001 Thumbnails",
    "Name": "1351620000001-000001 Thumbnails"
}
[ec2-user@ip-10-82-21-32 amazon-vod-preset-convert]$ 

実行後の出力はInteractive Modeと変わらないように見えますが、lsコマンドで実行ディレクトリのファイルを確認してみると、2つのJSONファイルが保存されていました。1351620000001-000001.json1351620000001-000001_Thumbnail.jsonですね。どうやら[Preset ID].jsonとサムネイル用の[Preset ID]_Thumbnail.jsonの2つのファイルが保存されるようです。

[ec2-user@ip-10-82-21-32 amazon-vod-preset-convert]$ ls -l
合計 76
-rw-rw-r-- 1 ec2-user ec2-user  3293  2月  7 10:31 1351620000001-000001.json
-rw-rw-r-- 1 ec2-user ec2-user   937  2月  7 10:31 1351620000001-000001_Thumbnail.json
-rw-rw-r-- 1 ec2-user ec2-user   311  2月  7 10:11 CODE_OF_CONDUCT.md
-rw-rw-r-- 1 ec2-user ec2-user  3643  2月  7 10:11 CONTRIBUTING.md
-rw-rw-r-- 1 ec2-user ec2-user 11358  2月  7 10:11 LICENSE
-rw-rw-r-- 1 ec2-user ec2-user    99  2月  7 10:11 NOTICE
-rw-rw-r-- 1 ec2-user ec2-user  3381  2月  7 10:11 README.md
-rwxrwxr-x 1 ec2-user ec2-user 38676  2月  7 10:11 ets_mediaconvert_preset_v2.py
[ec2-user@ip-10-82-21-32 amazon-vod-preset-convert]$

変換されたプリセットをMediaConvertにImportしてみる

Amazon VOD Preset Converterで生成した、Elastic TranscoderのプリセットからMediaConvert用の変換されたプリセットを実際にMediaConvertに取り込んでみましょう。

今回はシンプルにAWSマネジメントコンソールから行いました。Amazon VOD Preset Converterで変換、ファイルに保存したプリセットはあらかじめローカル環境にコピーしておきます。

MediaConvertのマネジメントコンソール、Output presetsの一覧画面で(Import preset)ボタンを押下します。ファイル選択のダイアログが出現するので、Amazon VOD Preset Converterで生成、保存したJSONファイルを指定します。今回は1351620000001-000001.jsonをImportしてみました。

em12

em13

Create preset画面に遷移しますので、Nameの項目だけ入力します。その後、画面下部の(Create)ボタンを押下するとMediaConvert用のプリセットとして取り込むことができました。

em14

あとはこのMediaConvertのOutput presetを使ってJobを作成、実行していけばMediaConvertでElastic Transcoderと同様の変換ができるかと思います。

まとめ

Amazon Elastic TranscoderからAWS Elemental MediaConvertへのPresets変換ツール「Amazon VOD Preset Converter」を、Python 2.7の実行環境を準備して動作させてみました。Python 2.7の環境はツールの一時的な利用と割り切り、サポート終了が予定されているAmazon Linux 2をAmazon EC2インスタンス上で実行しました。EC2にElastic Transcoderの読み取り権限を設定したIAMロールをアタッチし、またPython 2.7用のpip、BotoとBoto3をインストールすることで、無事にVOD Preset Converterを動作させることができました。

Amazon VOD Preset Convertのツールが公開され、またスクリプトの最終更新されてから日が経っていることから、無事にこのツールは動かせるのか!? そもそも2025年にPython 2.7の環境なんて準備できるのか!? などと思っていたのですが、無事に動いてよかったです。個人的に最近はPython 2系を目にする機会も少なかったことから、Amazon Linux 2にPython 2.7がデフォルトでインストールされていたのが少し意外でした。そのほか、pipのインストール方法に一癖あったり、Boto3ではなくBotoも必要だったり、IMDSv2が有効にできなかったりといろいろとありましたが、一時的な利用と割り切って、ひとまず動作させる環境は準備できたかなと思います。引き続き、このVOD Preset Convertを利用しつつ、実際のElastic TranscoderからMediaConverへの移行例も確認できればと思います。

おまけ: Converter? Convert?? このツールの名称について

最後におまけとして、このツールの名称について、少し混乱したこともありまとめておきます。

このツールの名称としては「Amazon VOD Preset Converter」である認識です。最後の単語は Converter ですね。erがつきます。ただし、GitHubのリポジトリ名は「amazon-vod-preset-convert」です。最後は convert で、erはつきません!

em16
引用元: GitHub - aws-samples/amazon-vod-preset-convert: Python script that allows users to convert Amazon ElasticTranscoder presets to AWS Elemental MediaConvert presets.

さて、ところでこのAmazon VOD Preset Converterが対象としたAWSのサービス名も確認しておきましょう。移行元のサービスは「Amazon Elastic Transcoder」ですね。最後の単語は Transcoder で、erがつきます。(ちなみに、上記スクリーンショット内、GitHubリポジトリの右上Aboutの箇所では「ElasticTranscoder」とスペースなしとなっていますが、typoかと思われます。正しくはElasticのあとに半角スペースが入りますね。)

移行先となるサービスは「AWS Elemental MediaConvert」です。MediaConvert で、ここにはerがつきません! Amazon ではなく AWS はじまりである点にも注意しましょう。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.