AWS Elemental MediaConvertを使ってスマホで撮影した縦長動画を上手にHLS形式に変換してみる

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

はじめに

清水です。スマホで撮影した動画をAWS Elemental MediaConvertでHLSなど配信用の形式に変換することがよくあるかと思います。スマホでの動画を撮影する場合、テレビなどで普段目にする横長動画(Landscape、16:9など)のほかに縦長動画(Portrait、9:16など)で動画を撮影することもできますね。本エントリではこの縦長動画をAWS Elemental MediaConvertで変換することを扱ってみます。縦長動画もAWS Elemental MediaConvertで問題なく処理できるのですが、ちょっと気をつけておかないと変換に失敗するパターンもあるのでまとめてみたいと思います。

なお結論を先に述べておきますと、変換する際の解像度(Resolution)の指定に注意しましょう、という話です。

縦長動画を変換するときに失敗してしまうケース

まず縦長動画を変換するときにありがち(?)になりそうな失敗パターンについて、なぜか発売日に入手したiPhone XSで撮影した縦長動画(iPhoneを縦に構えて撮影できる状態)を使って試してみます。縦長動画はこんな具合のものですね。

S3にファイルをアップロード *1後、MediaConvertでジョブを作成します。ここでジョブを作成する際、Output groupsについては一から作成するのではなくSystem presetsを使うことが多いのではないでしょうか。私はだいたいそうします。ということで今回もSystem presetsからジョブを作成することにします。撮影は1080p HD/30 fpsで行ったのですが、配信することを想定して720pあたりに変換しましょう。今回は「System-Avc_16x9_720p_29_97fps_3500kbps」のPresetを選択してみます。

Resolution (w x h)の指定が1280 x 720となっているのはうまくフィットしてくれるのかな…、などと考え少し不安にながらジョブ完了を待ち、作成された動画を再生してみました。なお今回はHLSで出力しているので、macOS上のSafariでm3u8ファイルに直アクセスして再生しています。

見事に左右に黒帯が入ってしまっていることがおわかりいただけますでしょうか…。考えてみれば当然なのですが、入力としては1080x1920(9:16)であるものを、1280x720(16:9)に変換して出力しているのでこうなってしまいますよね。 *2

MediaConvertで縦長動画を上手に変換する方法

変換時のResolutionを指定して変換する

では改めて縦長動画をAWS Elemental MediaConvertで上手に変換する方法です。先ほどのスクリーンショットにあったとおりResolution (w x h)の指定が1280 x 720と16:9のLandscapeになっていることが問題点となるので、これを変更しましょう。といってもPreestを一から作成することは手間なので、Custom Presets機能を使います。使用したいPresetsのdetail画面でDuplicateボタンを押してPresetを複製します。

複製したらName項目などを埋めつつ、Resolution (w x h)の箇所を修正します。配信することを想定して720p、正確には720x1280を指定しました。

Output設定のResolution (w x h)が720x1280であることを確認して、ジョブを作成します。すると以下のように、きちんと縦長動画で変換ができました!(左右にグレーの部分がありますが、これはSafariの背景?の色で、いわゆる黒帯、Letter boxは入っていません。)

変換時のResolutionをPassthroughするように設定して変換する

変換時にOutputの解像度(Resolution)をきちんと指定すれば縦長動画でも問題なく変換できることが確認できました。ただ場合によっては、入力するファイルにかかわらず同じPresetを使用したい、入力ファイルに応じて解像度を入力するのを避けたい、ということもあるかと思います。

MediaConvertでは解像度(Resolution)の指定であえて数値を入力しないと、Passthroughとして入力ファイルの解像度をそのまま使用することができるので、これを使えば良さそうです。

ただこの場合、H.264/AVCのレベルに注意する必要があります。例えば本エントリでは「System-Avc_16x9_720p_29_97fps_3500kbps」を使用してCustom Presetを作成しましたが、こちらはLEVEL_3_1(=レベル 3.1)が指定されています。そのため入力ファイルが1080x1920といったフルHDの縦長動画の場合、MediaConvertジョブ実行時に以下のようなエラーが発生してしまいます。

対策として、入力ファイルの最大解像度を決めておき、それに適合したレベルを設定しておくようにしましょう。1080x1920といったフルHDの縦長動画の入力が想定される場合は、レベル 4以上が必要となります。(参考: プロファイルとレベル / H.264 - Wikipedia

このようにResolutionをPassthroughするよう設定し、かつH.264/AVCのレベルにも注意しておけば、例えば以下のような3:4、480x640のPortraitな動画も上手に変換できます。

まとめ

AWS Elemental MediaConvertでスマホで撮影したような縦長動画(Portrait動画)を変換する際の注意点についてまとめてみました。変換後の出力解像度の指定を正しく行うこと、また入力ファイルの解像度を引き継ぐPassthrough設定もできますが、H.264/AVCの場合は解像度の上限が決まるレベル設定にも注意すること、以上がポイントでした!

脚注

  1. なお撮影した動画はAirDropを使ってMacを経由してS3にアップロードしています。iPhone内部ではHEVCで保存されている動画ですが、AirDropを使ってMacに転送した時点でAVCに変換されていました。
  2. 設定項目「Stretch to output」がDefaultのままなのでこのように黒帯(Letterbox)が追加されています。Stretch to outputにすると黒帯は入らず引き伸ばされ変換されるようです。(どちらにしろ意図した変換にはなりませんね…)