[FFmpeg覚書] 動画の反転・回転 2023/02a
[Table of Contents]はじめに
[ [memo] FFmpeg 自分用覚書 2020/09b ] の記述が
増えてきましたので、整理のため一部内容を切り離してこのページに引っ越してきました。
[Table of Contents]動画の左右反転
% ffmpeg -i in.mp4 -vf hflip out.mp4 (左右反転)
% ffmpeg -i in.mp4 -vf vflip out.mp4 (上下反転)
% ffmpeg -i in.mp4 -vf crop=300:200:50:20,vflip out.mp4 (トリミングしたのち上下反転)
[Table of Contents]動画の回転(基本)
% ffmpeg -i in.mp4 -vf transpose=1 out.mp4 (90度 時計回り)
% ffmpeg -i in.mp4 -vf transpose=2 out.mp4 (90度 反時計回り)
% ffmpeg -i in.mp4 -vf transpose=3 out.mp4 (90度 時計回り+上下反転)
% ffmpeg -i in.mp4 -vf transpose=0 out.mp4 (90度 反時計回り+上下反転)
基本的に 1,2 だけ使って、0,3 は使わないほうが良さげ。混乱する。
[Table of Contents]動画の回転(ラジアン・角度指定)
ラジアンて何だっけ? 全然覚えてないんですけど、
約 57.29578 度、(180/π)度 なんだそうです。ラジアンの角度、つまり約 57.29578 度
動画を回転させたいときは以下:
% ffmpeg -i in.mp4 -vf rotate=1 out.mp4
こんな感じに書けます。
この rotate を使うことで、割と細かい角度で動画を回転させる
ことができるみたいで、たとえば 45度動画を回転させたいときは以下:
% ffmpeg -i in.mp4 -vf rotate=45*PI/180 out.mp4 (45度 時計回り)
% ffmpeg -i in.mp4 -vf rotate=-45*PI/180 out.mp4 (45度 反時計回り)
こんな感じで回転させることができます。なおMacの「ターミナル」からこれをやろうとすると
コマンドラインの中にある * (アスタリスク)文字にシェルが反応してしまって
コマンドが実行できないことがあるので、そのときは -vf オプションの中身をダブルクオート
で囲ってやるなどしましょう。こんな感じ:
% ffmpeg -i in.mp4 -vf "rotate=-45*PI/180" out.mp4
しかしrotateを使った回転においては、元の動画のタテヨコのドット数が基本そのままで、
動画だけが回転する感じになるため、四隅近辺に写っていた内容が見切れてしまう可能性が高くなります。
そのときは動画のタテヨコのドット数も調整すると良いかもしれません。こんな感じ:
% ffmpeg -i in.mp4 -vf rotate=45*PI/180:ow='hypot(iw,ih)':oh=ow out.mp4
ただ rotate コマンドを実際にコマンドラインで入力する時に
(そんな頻繁に使うものでもないので) hypot を思い出せない
ことがよくあります😅 そんなとき
ow=iw+200
のような感じ、
「入力データの横幅(iw)より200dot(左右それぞれ100dot)広げる」なんて感じで
指定すると良いのかな? 私はよくコレをやります。
ちなみに私がよく使うやり方は以下のような感じ:
% ffmpeg -i in.mp4 -vf rotate=45*PI/180:ow=iw+100:oh=ow,crop=320:240:50:250 out.mp4
テキトーに多めに空間をつけて rotate した動画を crop でそのまま切り出してしまう
ものです。切り出しの範囲指定も最初は割といい加減に数値を指定しておいて、
何度か試行錯誤して調整していってます。試行錯誤は ffplay を使って、
最後、実際に動画の切り出しを行うときだけ ffmpeg を使ってます。
回転させた動画の端が見切れないように動画を crop すると、どうしても動画の画面サイズが
元動画よりも大きくなってしまいがちです。そんなときは更に‥
% ffmpeg -i in.mp4 -vf rotate=45*PI/180:ow=iw+100:oh=ow,crop=360:270:50:250,scale=320:-2 out.mp4
こんな感じで crop したあと scale で画面サイズの微調整をすることもできます。
たいした処理はしてないんですけど -vf オプション文字列がかなり呪文化してきましたね😅
さらに。回転させたときは動画の四隅に動画の「背景」というのか? それが見えてしまいます。
背景色は黒が基本ですし、大抵の場合は黒がいちばん良いと思うんですけど
背景色を変えるときは c=green のようなオプションをつけると背景色が変更されます。
% ffmpeg -i in.mp4 -vf rotate=45*PI/180:c=green out.mp4
% ffmpeg -i in.mp4 -vf rotate=45*PI/180:ow='hypot(iw,ih)':oh=ow:c=green out.mp4
こうやって背景色を付けておくと、
クロマキー合成との合わせ技で
嬉しいこともある、かもしれません。
[Table of Contents]動画の傾き補正
テレビ画面やPC画面をスマホのビデオカメラで撮影すると、
がんばれば手ブレは何とかできますけど、微妙な画面の傾きまではさすがに
対処が難しい‥。そんなときは perspective が使えます。こんな感じ:
% ffmpeg -i in.mp4 -vf perspective=x0:y0:x1:y1:x2:y2:x3:y3,scale=xx:-2 out.mp4
テレビ画面の左上座標が (x0, y0)、右上座標が (x1, y1)、左下座標が (x2, y2)、
右下座標が (x3, y3) のときはこんな感じにすると
指定した4つの座標を四隅にした動画 out.mp4 ができます。
perspective を使うときは crop とか scale とかも一緒に使うと良い、と
あちこちで書かれてましたので、ここでも scale を入れてみました。
ここでは out.mp4 の横幅を xx に指定しています(実際に使うときはここに数字を入れます。960 とか)。