MediaConvert が回転しない！





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

こんにちは、あまりの暑さに朝5時に犬の散歩を済ます streampack の木村です。
もうね、6時過ぎると暑いんですよ！

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

# 追記

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

[AWS Elemental MediaConvert が新たに動画の回転と広告マーカーの挿入をサポート](https://aws.amazon.com/jp/about-aws/whats-new/2019/02/aws-elemental-mediaconvert-adds-support-for-video-rotation-and-ad-marker-insertion/)



# 困ったこと

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


## 理想

<img width="1147" alt="スクリーンショット 2018-08-03 13.14.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/172426/2df4aace-2a39-1c05-f000-569e40aea5b2.png">


## 現実

<img width="1150" alt="スクリーンショット 2018-08-03 13.00.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/172426/be5bde1f-5f38-3195-ff17-9bcff79f6342.png">

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
```

動画解像度が <font color="Red">1920x1080</font>、それとメタデータに　<font color="Red">rotate          : 90</font>　が記載されています。

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

![Screen-Shot-2015-06-10-at-16.48.07.png](https://qiita-image-store.s3.amazonaws.com/0/172426/22566805-23ad-dc29-4bf8-ed8f805a322a.png)

出典： 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 Rotation` を `auto` にしておけば勝手にやってくれます。
ｶｼｺｲ！！！

<img width="501" alt="スクリーンショット 2018-08-03 14.37.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/172426/b2e05040-dc9f-07e4-351a-ea15df39e134.png">