Elastic TranscoderからMediaConvertへのPresets変換ツール「VOD Preset Converter」を動かしてみた!
はじめに
清水です。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自体、サポート終了が(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
を選択して次に進みます。
続くStep 2のAdd permissionsではAmazonElasticTranscoder_ReadOnlyAccess
を選択しました。複数のPermissions policiesがリストアップされますが、ElasticTranscoder
などで検索すると探しやすいです。Set permissions boundaryはデフォルトのCreate role without a permissions boundary
のまま(Next)で進みます。
Step 3のName, review, and createではRole nameを適切に入力します。各項目を確認して、(Create role)ボタンでIAMロールを作成します。
IAMロールが作成できました。EC2インスタンス起動時にこのIAMロール(インスタンスプロファイル)を指定するので、名称をメモしておきましょう。
EC2インスタンスの起動
続いてEC2インスタンスの起動です。EC2のマネジメントコンソール、Instances一覧画面の(Launch instances)ボタンから進みます。Nameを適切に設定し、AMI(Application and OS Imagesの項目)はAmazon Linux 2を選択します。インスタンスタイプで最小のt4g.nanoを使用したかったため、Architectureは64-bit (Arm)
を選択しました。今回、実際に選択したAMIはami-057ce021fb4e80e38
となります。
インスタンスタイプは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ロールを選択します。
また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には対応していないのかな、と推測してます。
EC2インスタンスが起動できました。
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 ConverterのREADMEやWhite 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
を入力しました。
(3) Output group typeについてはMeidiaConvertのOutput groupが該当する認識です。今回はfile
を入力しました。
以下、実際の実行結果です。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.json
と1351620000001-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してみました。
Create preset画面に遷移しますので、Nameの項目だけ入力します。その後、画面下部の(Create)ボタンを押下するとMediaConvert用のプリセットとして取り込むことができました。
あとはこの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
はつきません!
さて、ところでこのAmazon VOD Preset Converterが対象としたAWSのサービス名も確認しておきましょう。移行元のサービスは「Amazon Elastic Transcoder」ですね。最後の単語は Transcoder で、er
がつきます。(ちなみに、上記スクリーンショット内、GitHubリポジトリの右上Aboutの箇所では「ElasticTranscoder」とスペースなしとなっていますが、typoかと思われます。正しくはElasticのあとに半角スペースが入りますね。)
移行先となるサービスは「AWS Elemental MediaConvert」です。MediaConvert で、ここにはer
がつきません! Amazon ではなく AWS はじまりである点にも注意しましょう。