スマートフォンで縦撮りした動画が PC で横向きに表示されるときや、動画が90度傾いているときは、FFmpeg の 1 コマンドで直せます。回転メタデータだけを修正する方法(再エンコードなし)と、映像のピクセルを回転する方法があり、用途に合わせて選べます。


動画回転の前後比較。左が横長の元映像、右は transpose=1 で時計回りに 90 度回転した縦長の状態

左が元映像、右が transpose=1(時計回り 90 度)。回転すると縦横比が入れ替わるため、右は左右に余白が付いています。

素材: Tears of Steel (CC) Blender Foundation | mango.blender.org、CC BY 3.0。映画の1フレームを切り出し、フィルターで加工しています。

transpose フィルタの値と回転方向

値 エイリアス 変換内容
0 cclock_flip 90度反時計回り + 垂直反転
1 clock 90度時計回り(最も多いケース)
2 cclock 90度反時計回り
3 clock_flip 90度時計回り + 垂直反転

コマンド例

1. 90度時計回り

# 映像を時計回りに90度回転
ffmpeg -i input.mp4 -vf transpose=1 -c:a copy output.mp4
  • transpose=1 — 90度時計回り
  • -c:a copy — 音声はコーデックを変えずにコピー

スマートフォンの縦動画のように回転メタデータが付いている動画(コマンド例7で確認)は、FFmpeg が再エンコード時に自動で回転させます。その場合は transpose を付けずに ffmpeg -i input.mp4 -c:a copy output.mp4 とすれば正しい向きになり、transpose を付けると二重に回転します。メタデータを無視して画素だけを回したいときは、-i の前に -noautorotate を付けます。

2. 90度反時計回り

ffmpeg -i input.mp4 -vf transpose=2 -c:a copy output.mp4

3. 180度回転

# transpose を2回チェーンして180度回転
ffmpeg -i input.mp4 -vf "transpose=1,transpose=1" -c:a copy output.mp4

# または hflip + vflip でも同じ結果(こちらが高速な場合あり)
ffmpeg -i input.mp4 -vf "hflip,vflip" -c:a copy output.mp4

4. 水平反転(左右ミラー)

# 左右を鏡像に反転(セルフィー動画・ミラー効果)
ffmpeg -i input.mp4 -vf hflip -c:a copy output.mp4

5. 垂直反転(上下ミラー)

# 上下を鏡像に反転(逆さまに撮影した動画は、3 の180度回転で直します)
ffmpeg -i input.mp4 -vf vflip -c:a copy output.mp4

6. 回転 + リサイズの同時処理

# 90度時計回りに回転してから、幅720にリサイズ(1920x1080 なら 720x1280)
ffmpeg -i input.mp4 -vf "transpose=1,scale=720:-2" -c:v libx264 -crf 23 -c:a copy output.mp4

transpose は scale より前に置いてください。回転後の寸法に対して scale が適用されます。

7. スマートフォン動画の回転メタデータを確認

# 回転メタデータを確認
ffprobe -v error -select_streams v:0 \
  -show_entries stream_side_data=rotation \
  -of default=noprint_wrappers=1 input.mp4

出力例: rotation=-90(iPhone の縦撮りでよく見られる値。表示するときに時計回りに90度回す指定で、transpose=1 と同じ向きです。rotation=90 なら反時計回りで transpose=2 と同じ。何も表示されなければ回転メタデータはありません)

メタデータ回転 vs 再エンコード回転

方式 処理 品質 互換性 速度
メタデータ修正(-c copy) 回転情報のみ変更 劣化なし プレイヤー依存 高速
transpose フィルタ ピクセル再エンコード 若干の変化 どのプレイヤーでも確実 通常

使い分け:

  • 再エンコードを避けたい(品質最優先) → メタデータ修正
  • どのプレイヤーでも確実に正しく表示させたい → transpose フィルタ

メタデータのみ修正する場合:

# 回転メタデータを0にリセット(映像ピクセルは変更しない)
ffmpeg -display_rotation 0 -i input.mp4 -c copy output.mp4

回転メタデータを変更しても画素は回転しないため、再生アプリによっては反映されません。画素を回転するには再エンコードが必要です。保存後、実際に渡す相手のアプリで向きと音声を確認してください。

transpose 値早見表

目的 コマンド
90度時計回り -vf transpose=1
90度反時計回り -vf transpose=2
180度回転 -vf "transpose=1,transpose=1" または "hflip,vflip"
水平反転(左右) -vf hflip
垂直反転(上下) -vf vflip
90度時計回り+垂直反転 -vf transpose=3

オプション詳解

オプション/フィルタ 意味 使いどき
-vf transpose=1 90度時計回り回転 回転メタデータのない横倒し映像の修正
-vf transpose=2 90度反時計回り 過剰に回転した映像の修正
-vf hflip 水平反転 左右ミラー・セルフィー補正
-vf vflip 垂直反転 上下のミラー効果
-c copy 再エンコードなしコピー メタデータ修正時
-c:a copy 音声のみ無劣化コピー 映像フィルタ適用時(音声はコピー)

トラブルシューティング

エラー1: 回転後も映像が傾いたまま

原因: transpose の値が間違っています(1→時計回り、2→反時計回りの混同)
解決策: 値を変えて試します:

# まず transpose=1 を試し、逆なら transpose=2
ffmpeg -i input.mp4 -vf transpose=1 -c:a copy test.mp4

エラー2: Unrecognized option 'vf=transpose=1' と表示される

原因: -vf と値を = でつないでいます。FFmpeg のオプションと値はスペースで区切ります
解決策: -vf の後ろにスペースを入れます:

# 間違い
ffmpeg -i input.mp4 -vf=transpose=1 output.mp4

# 正しい
ffmpeg -i input.mp4 -vf transpose=1 -c:a copy output.mp4

エラー3: 180度回転で Trailing option(s) found と表示され、回転されない

原因: -vf などのオプションを出力ファイル名の後ろに書いています。出力ファイル名より後ろのオプションは無視されます
解決策: オプションは出力ファイル名より前に書きます:

# 間違い(出力ファイル名の後ろにオプション)
ffmpeg -i input.mp4 output.mp4 -vf "transpose=1,transpose=1"

# 正しい
ffmpeg -i input.mp4 -vf "transpose=1,transpose=1" -c:a copy output.mp4

エラー4: メタデータ修正後もプレイヤーで横向きになる

原因: プレイヤーが回転メタデータを無視しています
解決策: 再エンコードして映像ピクセル自体を回転させます。回転メタデータが付いた動画は FFmpeg が再エンコード時に自動で回転させるので、transpose は付けません(付けると二重に回転します):

ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a copy output.mp4

エラー5: 回転後に解像度が期待と違う(縦横が入れ替わる)

原因: 90度回転すると幅と高さが入れ替わります(1920×1080 → 1080×1920)
解決策: 縦長のまま小さくしたいときは、コマンド例6のように回転の後に scale を付けます。1920×1080 の枠で出力したいときは、回転後の映像を高さ1080に縮小し、左右に黒帯を付けます:

# 回転してから、左右に黒帯を付けて 1920x1080 に収める
ffmpeg -i input.mp4 -vf "transpose=1,scale=-2:1080,pad=1920:1080:(ow-iw)/2:0" -c:v libx264 -crf 23 output.mp4

FAQ

Q1. スマートフォン動画が横向きになる場合、常に transpose=1 でいいですか?
A. いいえ。まずコマンド例7の ffprobe で rotation を確認します。値が表示される動画は FFmpeg が再エンコード時に自動で回転させるので、transpose なしの ffmpeg -i input.mp4 -c:a copy output.mp4 で正しい向きになります(transpose を付けると二重に回転します)。値が表示されない動画は画素そのものが横向きなので、transpose=1(時計回り)か transpose=2(反時計回り)で回転させます。

Q2. 再エンコードなしで回転できますか?
A. メタデータのみの修正であれば再エンコードなしで可能です。ffmpeg -display_rotation -90 -i input.mp4 -c copy output.mp4 のように回転メタデータを書き込みます(-display_rotation は反時計回りの角度なので、-90 は時計回りに90度)。ただし映像ピクセルは変わらないため、プレイヤーがメタデータを読まないと正しく表示されません。

Q3. iPhone・Android の縦動画を横に変換するには?
A. transpose=1 で映像を90度回転させます。FFmpeg は回転メタデータを先に反映するので、画面で見えている縦向きの映像が基準になります。縦横比が変わるため、必要に応じてリサイズも組み合わせてください。

Q4. 任意の角度(45度など)で回転できますか?
A. rotate フィルタで任意の角度を指定できます(空いた部分は黒になります):

# 45度回転
ffmpeg -i input.mp4 -vf "rotate=PI/4" -c:v libx264 -crf 23 output.mp4

Q5. バッチ処理で複数動画を一括で回転するには?

for f in *.mp4; do
  ffmpeg -nostdin -i "$f" -vf transpose=1 -c:a copy "rotated_${f}" -y
done

関連記事