任意の角度に回転でき、時間経過で回転させたり止めたりできる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)

  • 振り子のように左右に揺れる。360/60はフレームレートのn倍をn秒で1度の左と右の揺れになる。15*PI/180はPI/180で角度計算にして15度角の揺れになる。映像のフレームレートは30の例とする。
    ffplay -f lavfi -i testsrc2=r=30 -vf "rotate=sin(n*(PI/180)*(360/60))*(15*PI/180):c=black"

    ほげさんはTwitterを使っています 「メモ追加 自分でもエンコードログ見直したときに何やってんだコイツ?ってなる事は多いし揺れる素材作りたいなーって思ったときに使いまわせるし https://t.co/dIHtFitKQo」 / Twitterより。

公式ドキュメント: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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

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