【小ネタ】ffmpegで動画を180°回転させるコマンドの指定が長いのでaliasにする

Posted by 雅楽斎 on Friday, August 9, 2024

TOC

何回も実行すると引数が多くて面倒だし間違えかねないffmpeg

動画関連の色々なことができるffmpegですが、何をするにも引数が多くてたまに引数の順序が決まってるものがあるので、繰り返し実行するのが面倒だなとなっており、aliasにすることにしました。弊blogで久々の小ネタです。

【小ネタ】mkdirした後にそのディレクトリにcdするエイリアスを作る

前提として、aptか何かでffmpegをインストールしてください。

ffmpegで180°回転させる方法は2種類ある

割と需要のあるコマンドのようで、回転させる方法は2つ見つかります(手元でエラーが出なかったもの)

$ ffmpeg -i input.mp4 -vf "hflip,vflip" -c:a copy output.mp4
$ ffmpeg -i input.mp4 -vf "transpose=2,transpose=2" -c:a copy output.mp4

前者は水平回転と垂直回転、後者は90°回転を2回繰り返すということのようです。後者は90°回転させたい場合はtranspose=2を1回、270°回転なら3回にすれば良さそうです。今回は見た目のわかりやすさから前者を使っています。

再エンコードがかかっているかは不明(情報では再エンコードしないことになっている)

上記の2つの180°回転、書き方が違うけど結果に違いが出るのでは?と思ってどちらも試しましたが、どちらも実行結果のファイルサイズは変わりませんでしたので、2つのコマンドは等価であると判断しています。

ただ、ffmpegのビデオフィルタの仕組みをよく知らないんですが、元の動画ファイルと180°回転した動画ファイルでサイズは変わります。しかも

  • mp4ファイルの場合、少し小さくなる(メタ情報を削除したのかな?)
  • webmファイルの場合、結構大きくなる(??)

という事象に遭遇しており、手元の結果では再エンコードしないとは言い切れないと考えています。動画フォーマットによるのかもしれません。

aliasにする

~/.bash_aliasesに以下の内容を追記します。

rotate180() {
  time nice ffmpeg -i "$1" -vf "hflip,vflip" -c:a copy _"$1"
}
alias rotate180="rotate180"

出力ファイル名を指定するのが面倒なので、引数の入力ファイル名の先頭に_を付けることで出力ファイル名にしています。出力ファイル名を実行時に指定する場合は_"$1"$2に変更します。また、処理に結構時間がかかるので、timeで時間を計測するのとniceで他のコマンド実行の邪魔に極力ならないようにしています。

あとはこれが反映されるように別ターミナルを開くなり、bashを実行するなりしてrotate180を実行するだけです。引数は入力動画ファイル名、出力ファイル名を$2にしている場合は出力ファイル名も必要です。

~/.bash_aliasesがないtermuxのための~/.bashrc

aliasとしての記述は終わりなのですが、便利なのでスマホでもやろうと思って~/.bash_aliasesを書いてみたところ、bashログインでも反映されずどうしたことかと思って確認したところtermuxでは~/.bashrc自体がなかったので、以下の内容で作成しました。

if [ -f ~/.bash_aliases ]; then
  . ~/.bash_aliases
fi

export PATH="/data/data/com.termux/files/home/bin:$PATH"

スポンサーリンク


comments powered by Disqus