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

左が元映像、右が 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