32 動画作り -- FreeFem++ と ffmpeg で

FreeFem++ でシミュレーションした結果の動画を作る、 というのはいかにも必要そうだけど、 ずっと手をつけないで来た。

初めてなもので、多分間抜けなことをたくさんしていると思うけれど、 とりあえず記録しておく。

  1. FreeFem++ プログラムでは、連番ファイル名をつけて、 PostScript 形式で出力する。 (plot() で出力できるのは、PostScript データのみ。)
      string fname, dirname;
      dirname="graph/"; // 保存するディレクトリィの名前
      ...
      // 3桁の連番ファイル名を用意
      if (count < 10)
        fname="fig00"+count+".ps";
      else if (count < 100)
        fname="fig0"+count+".ps";
      else
        fname="fig"+count+".ps";
    
      plot(...., ps=dirname+fname);
    
  2. ffmpeg は PostScript フォーマットを読めないようなので、 ImageMagick の convert で PNG フォーマットに変換する。 オプションが問題で、色々試したうちで、 -density 300x300 を採用する。
    cd graph
    for i in `ls *.ps`
    do
      name=`basename $i .ps`
      convert -density 300x300 ${name}.ps ${name}.png
    done
    
    (2018/1/27追記) mogrify を使えば単に
    mogrify -density 300x300 -format png graph/*.ps
    
    で良いみたいだ。
  3. ffmpeg で MP4 形式の動画ファイルを作る。 オプション無指定で作ったファイルは、 Mac の QuickTime で再生できなかったので、 Mac 用のおまじない -pix_fmt yuv420p をつける。 それと画像の縦横のサイズが奇数になると文句を言われることの対策をする。
    ffmpeg -i graph/fig%03d.png -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" \
     -pix_fmt yuv420p ball.mp4
    
(本当にこうすべきものか、全然まったく自信がない。)

サンプル

http://nalab.mind.meiji.ac.jp/~mk/ball.mp4

余談     流体の方程式を解いて流速ベクトル場を書いているのに、 塗り絵状態になっているのは、三角形分割が細かすぎるから、 ということに気がついた。ベクトル場らしく描くには、 適当に間引かないといけない。 色々ノウハウが必要ですね。

桂田 祐史
2018-11-04