Gnuplotから動画をつくる

研究の関係でGnuplotの出力を動画にしたいことがある。

Gnuplotで動画を作る方法は以前にも紹介しているのだが、正直言ってちょっと面倒だし気に入らない点があったりする。


そこで、別の方法を考えた。
Gnuplotで画像データを標準出力に連続的に出力させ、それを1フレーム毎に読み込み、それをリアルタイムにAVIに変換し、さらにそれをffmpegに渡すことで動画を作成するという方法だ。(ffmpegのところは単に圧縮したいだけなのでなくても良い。)
先に断っておくと、今回はソースをつけない。なんとなく面倒だったので。(欲しい人は直接僕に凸してくれれば差し上げます。)
かわりに、もう少し詳しく具体的に説明する。

Gnuplotで動画にしたいものをPNG形式で連続的にplotしていく。たとえば

#!/usr/bin/env gnuplot
set term png
phi=0
while(phi<=6*pi) {
  plot cos(x+phi), sin(x+phi)
  phi=phi+pi*0.1
}

とか。(できれば無圧縮なビットマップ形式で出力させたいのだが、その方法が見当たらないので仕方なくPNGにした。)

GnuplotからのPNG出力を受け取るプログラムはC言語で記述する。
libpngを使用すると、都合よく1フレーム分ずつ読み取ることができる。(なので、画像毎にGnuplotを起動し終了させる必要がない。)Gnuplotの出力するPNGはパレット形式なので、AVIに変換するためにフルカラーに変換して読み込むように記述すること。
libpngの扱い方はここが参考になると思う。

読み込んだPNGの画像をAVIとして出力する。それにはこのサイトのソースを参考にすると良い。

標準出力はseekできないので、AVIのインデックスに関係する部分や長さを指定する部分は無視して、ストリーミング的に出力するのがポイント。

これによって出力されるAVIをffmpegで好きな形式に圧縮すると良い。H.264にすると大分容量が抑えられると思う。


当の自分は、結局動画を作らなくてもなんとかなることになってしまったのだが。


追記 (2013/04/19) 実はPNGを連番で出力してもさほど容量を使わない(たまたま自分のケースだけかもしれないけれど)事に気づいたので、結局のところPNG連番にして、ffmpegで-vcodec copyを指定して動画化するのが一番スマートな気がする。PNG形式のまま動画になるのでエンコードは一瞬。