Approaches to create a video in matlab

There is http://www.mathworks.de/help/techdoc/ref/videowriterclass.html

My approach is to print the single frames/figures to png files using the print function giving them filenames like 1.png, 2.png, ... and then I use the free FFMPEG converter to make a video.

ffmpeg -r 20 -i %d.png foo.avi

This allows for a lot of finetuning, when it comes to the parameters of the conversion (bitrate, codec, geometry etc.).


Matlab has a built in 'movie' command to play movies. I find it pretty easy to work with. I've used it on plots to show changes in time, as well as individual images to make a real movie.

http://www.mathworks.com/help/techdoc/ref/movie.html

I believe the general procedure is:

for ii=1:100
   plot(something(ii))
   F = getframe;
end
movie(F)

To save a movie, you can use a similar procedure as above, but use the

writeVideo

command.

http://www.mathworks.com/help/techdoc/ref/videowriterclass.html


Here are some of the different ways to create movies in (core) MATLAB.

MOVIE2AVI

(deprecated, use VIDEOWRITER instead)

%# figure
figure, set(gcf, 'Color','white')
Z = peaks; surf(Z);  axis tight
set(gca, 'nextplot','replacechildren', 'Visible','off');

%# preallocate
nFrames = 20;
mov(1:nFrames) = struct('cdata',[], 'colormap',[]);

%# create movie
for k=1:nFrames
   surf(sin(2*pi*k/20)*Z, Z)
   mov(k) = getframe(gca);
end
close(gcf)

%# save as AVI file, and open it using system video player
movie2avi(mov, 'myPeaks1.avi', 'compression','None', 'fps',10);
winopen('myPeaks1.avi')

AVIFILE

(deprecated, use VIDEOWRITER instead)

%# figure
figure, set(gcf, 'Color','white')
Z = peaks; surf(Z);  axis tight
set(gca, 'nextplot','replacechildren', 'Visible','off');

%# create AVI object
nFrames = 20;
aviobj = avifile('myPeaks2.avi', 'fps',10);

%# create movie
for k=1:nFrames
   surf(sin(2*pi*k/20)*Z, Z)
   aviobj = addframe(aviobj, getframe(gca));
end
close(gcf)

%# save as AVI file, and open it using system video player
aviobj = close(aviobj);
winopen('myPeaks2.avi')

VIDEOWRITER

%# figure
figure, set(gcf, 'Color','white')
Z = peaks; surf(Z);  axis tight
set(gca, 'nextplot','replacechildren', 'Visible','off');

%# create AVI object
nFrames = 20;
vidObj = VideoWriter('myPeaks3.avi');
vidObj.Quality = 100;
vidObj.FrameRate = 10;
open(vidObj);

%# create movie
for k=1:nFrames
   surf(sin(2*pi*k/20)*Z, Z)
   writeVideo(vidObj, getframe(gca));
end
close(gcf)

%# save as AVI file, and open it using system video player
close(vidObj);
winopen('myPeaks3.avi')

IMWRITE

(technically not a movie, but an animated GIF image)

%# figure
figure, set(gcf, 'Color','white')
Z = peaks; surf(Z);  axis tight
set(gca, 'nextplot','replacechildren', 'Visible','off');

%# preallocate
nFrames = 20;
f = getframe(gca);
[f,map] = rgb2ind(f.cdata, 256, 'nodither');
mov = repmat(f, [1 1 1 nFrames]);

%# create movie
for k=1:nFrames
    surf(sin(2*pi*k/20)*Z, Z)
    f = getframe(gca);
    mov(:,:,1,k) = rgb2ind(f.cdata, map, 'nodither');
end
close(gcf)

%# create GIF and open
imwrite(mov, map, 'myPeaks4.gif', 'DelayTime',0, 'LoopCount',inf)
winopen('myPeaks4.gif')

Tags:

Matlab

Video