あ…ありのまま今起こった事を話すぜ! 俺は縦長動画をアップしたのに、いつのまにか横長になっていた。 な…何を言っているのかわからねーと思うが、俺も何をされたのかわからなかった…
こんにちは、あまりの暑さに朝5時に犬の散歩を済ます streampack の木村です。
もうね、6時過ぎると暑いんですよ!
それはさておき、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
動画解像度が 1920×1080、それとメタデータに 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 で再エンコして縦長(1080×1920)にして、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
にしておけば勝手にやってくれます。
カシコイ!!!