あ…ありのまま今起こった事を話すぜ! 俺は縦長動画をアップしたのに、いつのまにか横長になっていた。 な…何を言っているのかわからねーと思うが、俺も何をされたのかわからなかった…
こんにちは、あまりの暑さに朝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度回転させればいいんでね?
設定をこねくり回したり、不親切なドキュメントを読み漁りましたが、肝心の動画を回転させる機能が見当たりません。
ものすげー調べたところ、やっぱ無いじゃん。
無い証拠
あうあう、詰んだ・・・
対応策
すいません、これしか思い浮かばなかった。
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 Rotation
を auto
にしておけば勝手にやってくれます。
カシコイ!!!