動画の回転・反転 — transpose フィルタとメタデータ回転の違い
スマートフォンで縦向きに撮影した動画が横向きになってしまった、あるいは動画を90度回転させたいというケースは多くあります。FFmpeg 6.1 での回転・反転方法を解説します。
transposeフィルタの値と効果
transpose フィルタは動画を90度単位で回転させます。値によって回転方向が異なります。
| 値 | 変換 |
|---|---|
0 | 90度反時計回り + 垂直反転(cclock_flip) |
1 | 90度時計回り(clock) |
2 | 90度反時計回り(cclock) |
3 | 90度時計回り + 垂直反転(clock_flip) |
数値の代わりに clock、cclock、clock_flip、cclock_flip というエイリアスも使用できます。
90度時計回り(縦撮り動画の修正で最も多いケース)
ffmpeg -i input.mp4 -vf transpose=1 output.mp4
スマートフォンで縦向き撮影した動画がプレイヤーで横向きに表示される場合、多くはこのコマンドで修正できます。
90度反時計回り
ffmpeg -i input.mp4 -vf transpose=2 output.mp4
transpose=2 は transpose=cclock とも書けます。
180度回転
transpose を2回チェーンすることで180度回転を実現します。
ffmpeg -i input.mp4 -vf transpose=1,transpose=1 output.mp4
または hflip と vflip を組み合わせても同じ結果になります:
ffmpeg -i input.mp4 -vf "hflip,vflip" output.mp4
hflip — 水平反転(左右ミラー)
ffmpeg -i input.mp4 -vf hflip output.mp4
左右を鏡像に反転します。セルフィー動画の左右反転やミラー効果に使います。
vflip — 垂直反転(上下ミラー)
ffmpeg -i input.mp4 -vf vflip output.mp4
上下を反転します。上下逆さまに撮影されてしまった動画の修正に使います。
メタデータ回転 vs 再エンコード回転
動画の回転情報は2種類の方法で記録されます。
メタデータ回転(displaymatrix / rotate タグ)
コンテナのメタデータに回転角度を記録する方式です。映像ピクセル自体は変更せず、プレイヤーに回転して表示するよう指示するだけです。
利点: 再エンコードなしで高速、画質劣化なし
欠点: メタデータを無視するプレイヤーでは正しく表示されない(古いプレイヤー、一部の動画編集ソフト)
メタデータの回転タグを削除(=プレイヤーへの回転指示をなくす)するには:
ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=0 output.mp4
このコマンドは再エンコードせずにメタデータのみを変更します。CI テスト環境ではメタデータの確認が難しいためテキストブロックで示します。
再エンコード回転(transposeフィルタ)
transpose フィルタを使うと映像ピクセル自体を回転させて新しい動画として書き出します。
利点: どのプレイヤーでも正しく表示される、メタデータ依存なし
欠点: 再エンコードが必要で時間がかかる、エンコードによる画質の若干の変化がある
スマートフォン撮影動画の回転修正
iPhoneや Android で縦向き撮影した動画は、多くの場合メタデータに rotate=90 が記録されています。対応プレイヤーでは正しく表示されますが、編集ソフトに取り込むと横向きになることがあります。
確認方法(ffprobeで回転メタデータを調べる):
ffprobe -v error -select_streams v:0 -show_entries stream_tags=rotate -of default=nw=1 input.mp4
回転メタデータを尊重した上で映像を正規化する(再エンコード):
ffmpeg -i input.mp4 -vf transpose=1 output.mp4
メタデータの回転値が 90 の場合は transpose=1(時計回り90度)を適用します。
自動で回転を検出・適用するには:
FFmpeg 5.0以降、-vf autorotate フィルタが利用可能です(実験的機能の場合があります)。また、-noautorotate オプションを付けることで自動回転の適用を無効にできます。
複数フィルタの組み合わせ
回転と同時にリサイズや他のフィルタを適用するには、カンマで繋ぎます:
ffmpeg -i input.mp4 -vf "transpose=1,scale=1280:720" output.mp4
transpose を先に適用すると、回転後の寸法に対して scale が適用されます。順番に注意してください。
まとめ
| 目的 | コマンド |
|---|---|
| 90度時計回り | -vf transpose=1 |
| 90度反時計回り | -vf transpose=2 |
| 180度 | -vf transpose=1,transpose=1 |
| 左右反転 | -vf hflip |
| 上下反転 | -vf vflip |
| メタデータのみ修正 | -c copy -metadata:s:v:0 rotate=0 |
再エンコードを避けたい場合はメタデータ方式を、確実な表示を優先する場合は transpose フィルタによる再エンコードを選択してください。
関連記事:
動作確認: ffmpeg 6.1.1 / Ubuntu 24.04 (GitHub Actions runner)
一次ソース: ffmpeg.org/ffmpeg-filters.html / ffmpeg.org/ffmpeg.html / trac.ffmpeg.org/wiki/RotateVideo