8.2 movie2avi() の簡単なサンプル

draw.m

function draw(c)
n=10
m=100;
dt = 2 * pi / n;
x=0:2*pi/m:2*pi;
plot(x,sin(x));
for i=1:n
    t=i*dt;
    plot(x,sin(x-c*t));
    % (gcf)がないと幅・高さの警告が出る(gcf=get current figure handle)
    % gca=get current axes handle
    F(i)=getframe(gcf);
    drawnow;
end
disp('movie');
%movie(F,1);
% movie2avi() で圧縮の形式を指定しないと、デフォールトの Indeo5 が選ばれるが、
% Windows Vista では CODEC がないため、圧縮できず、avi ファイルは出来ない。
% Windows XP では一応 avi ファイルができたが、Windows MediaPlayer や
% QuickTime では表示できなかった。RealPlayer ではOKだったけれど。
% そういうわけで、Mathworks 推奨の Cinepak を指定することに。
movie2avi(F,'nantoka.avi','compression','Cinepak');

いくつか注意点を書いておく (bad knowhow のような気がする)。

  • 単に F(i)=getframe; のようにしてある サンプル・プログラムも散見されるが、 指定しなくてはいけない場合がある。
  • 実際に画面に表示しているイメージを取り込んでいるらしく、 描画中に他の作業をしていると、その内容が動画ファイルに入ってしまうことがある。 従って、 drawnow (今描け) という命令をつけるのは、 バッファリングせずにアニメーションをちゃんと見せるという意味もあるが、 動画ファイルを作るためにも必須である。 なお、スクリーン・セーバーにも気をつける必要があるらしい (何だかなあ…少しお粗末のような気が)。
  • movie2avi() で出力可能なフォーマットは環境に依存する。 少なくとも Windows 版 MATLAB の古いバージョンでは、 Indeo5 というフォーマットがデフォールトであったようだが、 現在の Windows には CODEC が含まれなくなっている。 そのため上のサンプル・プログラムでは、 'compression','Cinepak' としている (この選択は Mathworks 社の推奨)。
  • 他に使いそうなオプションとして
    fps
    frame per second. 'fps',5 とすると毎秒 5 フレームになる。 デフォールトのフレーム・レートは 15 である。
    quality
    圧縮する場合、どの程度きれいにするかはサジ加減ということになるが、 デフォールトは 75% で、 それを変えたい場合は 'quality',90 のようにして数値を指定する。
  • なお Mac 向けの古いバージョンでは、 一切の圧縮がサポートされていなかった (思わず目を疑ってしまったが)。

桂田 祐史
2017-06-19