[FFmpeg] 動画の向きを変える (回転、反転)
動画(映像)の回転・反転をするには、映像フィルターの機能を使う方法と、映像メタデータ情報の設定で行う方法があります。
映像フィルター機能による回転・反転 (要エンコード)
映像ストリームにフィルターを適用して回転・反転する方法です。
この手法の場合、映像ストリームのエンコードが必要となります。なお、音声は無劣化コピーできるため、コード内に -c:a copy
を記述しています。
回転、回転+反転 (transpose)
transpose=[値/文字列]
フィルターを使うと回転と回転+反転の指定ができます。
値や文字列の指定による結果は以下の通りです。
値 | 文字列 | 結果 |
---|---|---|
0 | cclock_flip | 反時計回りに90度回転+反転 |
1 | clock | 時計回りに90度回転 |
2 | cclock | 反時計回りに90度回転 |
3 | clock_flip | 時計回りに90度回転+反転 |
回転
ffmpeg -i INPUT.mp4 -vf "transpose=1" -c:a copy OUTPUT.mp4
ffmpeg -i INPUT.mp4 -vf "transpose=clock" -c:a copy OUTPUT.mp4
回転+反転
ffmpeg -i INPUT.mp4 -vf "transpose=0" -c:a copy OUTPUT.mp4
ffmpeg -i INPUT.mp4 -vf "transpose=cclock_flip" -c:a copy OUTPUT.mp4
180度回転
ffmpeg -i INPUT.mp4 -vf "transpose=1,transpose=1" -c:a copy OUTPUT.mp4
※180度回転したい場合は、transpose の指定を2回書けばよいです。
縦長・横長を保持したまま回転
横長、縦長の状態を保持したまま動画を回転させたい場合に使うコードです。
縦長を保持して回転する (portrait
)
ffmpeg -i INPUT.mp4 -vf "transpose=1:portrait" -c:a copy OUTPUT.mp4
横長を保持して回転する (landscape
)
ffmpeg -i INPUT.mp4 -vf "transpose=1:landscape" -c:a copy OUTPUT.mp4
※縦長・横長の状態が優先されるため、場合によっては結果が変わらない (変更前の状態と同じになる) こともあります。
参考URLFFmpeg Filters Documentation: transpose反転 (hflip, vflip)
映像を単純に反転させるコマンドです。
インカメラ撮影などで被写体が反転しているときなどに使えます。
水平方向に反転 (hflip
)
ffmpeg -i INPUT.mp4 -vf "hflip" -c:a copy OUTPUT.mp4
参考URLFFmpeg Filters Documentation: hflip
垂直方向に反転 (vflip
)
ffmpeg -i INPUT.mp4 -vf "vflip" -c:a copy OUTPUT.mp4
参考URLFFmpeg Filters Documentation: vflip
回転と組み合わせることもできる
ffmpeg -i INPUT.mp4 -vf "vflip,transpose=clock" -c:a copy OUTPUT.mp4
映像のメタデータを設定して回転させる (無劣化コピー)
映像ストリームのメタデータに回転の情報を設定 (上書き) すると、無劣化のまま変更することができます。
回転 (-display_rotation)
ffmpeg -display_rotation 90 -i INPUT.mp4 -c copy OUTPUT.mp4
設定された回転情報はメタデータから確認できる
メタデータに設定された回転情報は、ffmpeg -i [ファイル名]
で確認できます。
ffmpeg -i INPUT.mp4
~中略~
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '20250926_102459.mp4':
~中略~
Stream #0:0[0x1](eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 156 kb/s, start 0.014104 (default)
Metadata:
creation_time : 2025-09-26T01:30:26.000000Z
handler_name : SoundHandle
vendor_id : [0][0][0][0]
Stream #0:1[0x2](eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080, 17506 kb/s, 29.97 fps, 29.97 tbr, 90k tbn (default)
Metadata:
creation_time : 2025-09-26T01:30:26.000000Z
handler_name : VideoHandle
vendor_id : [0][0][0][0]
Side data:
displaymatrix: rotation of -90.00 degrees
上記の最後の行にある displaymatrix: rotation of -90.00 degrees が該当する回転情報です
-display_rotation 0
をセットすると、変更後はメタデータ(Side data)に回転情報が表示されなくなります。(削除される)
反転はうまくいかない?
反転設定として -display_vflip
と -display_hflip
もあるのですが、指定の方法が間違っているのか思った通りの動きをしないのでここでは割愛します。
映像を反転したいときは -vf "hflip"
を使うのがおすすめです。
(うまくいくようになったら追記する予定。もしうまくいく人いたら教えてほしい)