任意の角度に回転でき、時間経過で回転させたり止めたりできる rotate フィルタの使い方。似たフィルタに transpose, hflip, vflip フィルタがある。

上下左右を入れ換える vflip, hflip
ピクセル数はそのままに映像を回転させる transpose

基本コマンド

  • 角度はラジアン指定なので慣れてないと混乱しやすい。1ラジアンは時計回りに約57.3度回転。PI, hypot, min などの書き方。
    ffmpeg -i input -vf rotate=a=1 output
    ffplay -i input -vf rotate=1

    オリジナル

    rotate=1

  • 時計回りに45度回転させる。
    ffplay -i input -vf rotate=45*PI/180

    rotate=45*PI/180

  • 回転しても見切れないように出力解像度を大きくする。
    ffplay -i input -vf rotate=45*PI/180:ow='hypot(iw,ih)':oh=ow

    rotate=45*PI/180:ow=’hypot(iw,ih)’:oh=ow

  • 回転しても映像が常に映る(余白が表示されない)ように出力解像度を小さくする。
    ffplay -i input -vf rotate=t*60*PI/180:ow='min(iw,ih)/sqrt(2)':oh=ow

    rotate=t*60*PI/180:ow=’min(iw,ih)/sqrt(2)’:oh=ow

  • 映像をフレーム毎に回転させても映像が丁度見切れない解像度に縦横を調節する。
    ffplay -i input -vf rotate=2*PI*t/10:ow='hypot(iw,ih)':oh=ow

  • 1ラジアン回転させて映像が丁度見切れない解像度に縦横を調節する。
    ffplay -i input -vf rotate=1:ow=rotw(1):oh=roth(1)

    rotate=1:ow=rotw(1):oh=roth(1)

公式ドキュメント:FFmpeg Filters Documentation : rotate

オプション

特定の時間だけフィルタを当てるならタイムライン編集、特定の時間に角度を変化させるなら評価式を使う。1ラジアンは約57.3度でπが180度。

  • angle, a[string]
    時計回りに回転させる角度のラジアン指定。マイナスで反時計回り。評価式が使える
  • out_w, ow[string]
    出力解像度の横幅。回転したときの余白を調整する。フレーム間でのサイズ変更はできない。評価式が使える
  • out_h, oh[string]
    出力解像度の縦幅。回転したときの余白を調整する。フレーム間でのサイズ変更はできない。評価式が使える
  • fillcolor, c[string]
    余白の色指定。色名指定とrrggbb形式が使える。色の書式設定 を参考
    既定値:black
  • bilinear[boolean]
    回転したときに bilinear で映像補間する
    既定値:1(有効)

評価式

  • n
    0 から始まるタイムスタンプ秒。1フレーム目の経過時間が最初の値になる
  • t
    0 から始まるフレーム番号
  • hsub
    横方向のクロマサブサンプル値。yuv422p なら 2
  • vsub
    縦方向のクロマサブサンプル値。yuv422p なら 1
  • in_w, iw
    入力映像の横幅
  • in_h, ih
    入力映像の縦幅
  • out_w, ow
    出力映像の横幅。out_w, ow で変更できる
  • out_h, oh
    出力映像の縦幅。out_h, oh で変更できる
  • rotw(a)
    out_w, ow で aラジアン回転させた分だけの横幅
  • roth(a)
    out_h, oh で aラジアン回転させた分だけの縦幅

メタデータを追記して無劣化で回転させる

フィルタの他に Side data に書き込んで再生プレイヤ側で自動回転することもできる。プレイヤが Side data に対応していないと自動で回転しない。

反時計回りに90度回転させる。つまり横長の映像は右が上、左が下になり縦長になる。
ffmpeg -i input -metadata:s:v rotate="90" -c copy output

角度は90の倍数を指定する。45度などは効果が無い。またマイナス角度も指定できる。以下の例は同じ結果になる。
ffmpeg -i input -metadata:s:v rotate="270" -c copy output
ffmpeg -i input -metadata:s:v rotate="-90" -c copy output

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)