Edited at

MediaConvert が回転しない!

あ…ありのまま今起こった事を話すぜ! 俺は縦長動画をアップしたのに、いつのまにか横長になっていた。 な…何を言っているのかわからねーと思うが、俺も何をされたのかわからなかった…

こんにちは、あまりの暑さに朝5時に犬の散歩を済ます streampack の木村です。

もうね、6時過ぎると暑いんですよ!

それはさておき、MediaConvert を使っていて困ったことがあったので記事にします。


追記

2019/2/21 に MediaConvert に動画回転機能が追加されたので、現在はちゃんと回転します。

AWS Elemental MediaConvert が新たに動画の回転と広告マーカーの挿入をサポート


困ったこと

えとですね、スマホで縦長で撮影した動画を MediaConvert で変換すると横長になっちゃうんですよ・・・


理想


現実

Big Buck Bunny

©copyright 2008, Blender Foundation | www.bigbuckbunny.org

これがですね、MediaConvert 側で設定をいくらこねくり回しても、もうどうにもならんのですよ。

とりあえず元動画の情報を見てみます

$ ffprobe IMG_0012.MOV

ffprobe version n4.0.1-5-gb5106c5aa2 Copyright (c) 2007-2018 the FFmpeg developers
built with Apple LLVM version 9.1.0 (clang-902.0.39.2)
configuration: --enable-version3 --enable-gpl --enable-libvmaf --enable-libx264 --enable-libx265 --enable-libvpx --enable-libaom --prefix=/usr/local --enable-nonfree --enable-static --disable-shared --extra-cflags='-I/usr/local/include -I/usr/include -I/Users/kimura/git/aom/aom_build' --extra-ldflags=-L/usr/local/lib --enable-libfreetype --extra-libs=-lpthread
libavutil 56. 14.100 / 56. 14.100
libavcodec 58. 18.100 / 58. 18.100
libavformat 58. 12.100 / 58. 12.100
libavdevice 58. 3.100 / 58. 3.100
libavfilter 7. 16.100 / 7. 16.100
libswscale 5. 1.100 / 5. 1.100
libswresample 3. 1.100 / 3. 1.100
libpostproc 55. 1.100 / 55. 1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'IMG_0012.MOV':
Metadata:
major_brand : qt
minor_version : 0
compatible_brands: qt
creation_time : 2018-08-03T03:23:32.000000Z
com.apple.quicktime.location.ISO6709: +35.6666+139.7495+080.740/
com.apple.quicktime.make: Apple
com.apple.quicktime.model: iPhone 7
com.apple.quicktime.software: 11.4.1
com.apple.quicktime.creationdate: 2018-08-03T12:23:32+0900
Duration: 00:00:15.91, start: 0.000000, bitrate: 11856 kb/s
Stream #0:0(und): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709), 1920x1080, 11737 kb/s, 59.96 fps, 59.94 tbr, 600 tbn, 600 tbc (default)
Metadata:
rotate : 90
creation_time : 2018-08-03T03:23:32.000000Z
handler_name : Core Media Data Handler
encoder : HEVC
Side data:
displaymatrix: rotation of -90.00 degrees
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 95 kb/s (default)
Metadata:
creation_time : 2018-08-03T03:23:32.000000Z
handler_name : Core Media Data Handler
Stream #0:2(und): Data: none (mebx / 0x7862656D), 0 kb/s (default)
Metadata:
creation_time : 2018-08-03T03:23:32.000000Z
handler_name : Core Media Data Handler
Stream #0:3(und): Data: none (mebx / 0x7862656D), 0 kb/s (default)
Metadata:
creation_time : 2018-08-03T03:23:32.000000Z
handler_name : Core Media Data Handler
Unsupported codec with id 0 for input stream 2
Unsupported codec with id 0 for input stream 3

はい、おかしな部分が二箇所ございます。


抜粋

Stream #0:0(und): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709), 1920x1080, 11737 kb/s, 59.96 fps, 59.94 tbr, 600 tbn, 600 tbc (default)

Metadata:
rotate : 90

動画解像度が 1920x1080、それとメタデータに rotate : 90 が記載されています。

どうやらこういうことらしいですわ。

出典: https://addpipe.com/blog/mp4-rotation-metadata-in-mobile-video-files/

つまりスマホで撮影すると向きにかかわらず FHD の場合の解像度は 1920x1080 で固定され、回転情報は rotate で付与される。

あとは再生側でよしなにやってね。

ということ。

まあ、ここまでは良いですよ。 つか知ってたし!

んじゃ MediaConvert で変換時に90度回転させればいいんでね? 

設定をこねくり回したり、不親切なドキュメントを読み漁りましたが、肝心の動画を回転させる機能が見当たりません。

ものすげー調べたところ、やっぱ無いじゃん。


無い証拠

https://forums.aws.amazon.com/thread.jspa?messageID=851588#851588

あうあう、詰んだ・・・


対応策

すいません、これしか思い浮かばなかった。

ffmpeg で再エンコして縦長(1080x1920)にして、rotate 情報を消す!


縦長にする

ffmpeg では読み込んだ時点で rotate 情報を解釈するので何もしなくて結構です。

いつもどおり -i で入力指定して出力すれば縦長で吐き出されます。

-vf transpose-vf hflip,vflip などは要りません。


rotate 情報を消す

以下オプションを指定します。

-metadata:s:v:0 rotate=0


実行例 (HEVC 10Mbps で再エンコ)

$ ffmpeg -i IMG_0012.MOV -vcodec libx265 -vb 10000000 -tag:v hvc1 -acodec copy -metadata:s:v:0 rotate=0 IMG_0012_rev.MOV

できあがったファイルを MediaConvert に食わせると冒頭の理想になります。

ただ、再エンコなので手間と時間がかかる・・・


おまけ Elastic Transcoder

ちなみに Elastic Transcoder だとクルクル回せるので問題ないです。

回さなくても Output Rotationauto にしておけば勝手にやってくれます。

カシコイ!!!