以下のワンライナーは、カレントディレクトリ以下のflvをmp4に一括変換します。
コードを短くするためにzshの機能を使っています。
for f (*.flv) ffmpeg -i $f:r{*,.mp4}
一般化した表現は以下のようになります。
CODEC_FROM=flv
CODEC_TO=mp4
for f (*.$CODEC_FROM) ffmpeg -i $f:r{*,.$CODEC_TO}
なぜ動くのか
- for文とffmpegの組み合わせ
-
for name ... ( word ... ) sublist
はzshの短縮for文 -
$val:r
のように変数に:rを付加するとfilename($val)
と同じ意味になる - グループ識別子の
{}
を使って部分的に異なる引数を記述している。通常ならffmpeg -i video.flv video.mp4
と書くべきところをffmpeg -i video.{flv,mp4}
と書くことが出来る。 - 今回は最初にファイルを絞込んでおり、インプットする動画の拡張子は指定する必要が無いので、ワイルドカードを指定して記述を省略している。
変化形
カレントディレクトリに動画しか無い状況で、すべての動画のフォーマットを統一する
CODEC_TO=mp4
for f (*) ffmpeg -i $f:r{*,.$CODEC_TO}