MatLab,如何预分配帧以制作电影?

5

Matlab有以下制作AVI格式电影的指南。我的目标是能够通过PowerPoint在演示中播放视频。

nFrames = 20;
% Preallocate movie structure.
mov(1:nFrames) = struct('cdata', [],...
                    'colormap', []);

% Create movie.
Z = peaks; surf(Z); 
axis tight
set(gca,'nextplot','replacechildren');
for k = 1:nFrames 
surf(sin(2*pi*k/20)*Z,Z)
mov(k) = getframe(gcf);
end

% Create AVI file.
movie2avi(mov, 'myPeaks.avi', 'compression', 'None');

我理解这个例子,并且知道我不应该在导入PowerPoint时进行压缩。 但是,我不知道如何使用结构正确地预分配内存。


1
你可能确实需要压缩视频,因为未压缩的视频会占用大量磁盘空间。你只需要确保选择一个容器格式(例如avi)和压缩方法,以便你的PowerPoint版本支持。预分配应该是可选的,并且只会使生成电影文件的过程稍微快一点。你发布的代码似乎只是预分配了一个指针数组,而不是预分配所有需要保存电影所需的内存,因此它可能更多地存在于抑制代码风格警告而不是加速处理速度。 - user57368
谢谢你的帮助。你知道如何使用句柄与addframe命令一起使用,这样当我离开时,getframe不会保存我的屏幕保护程序图像吗? - Abid
3个回答

3
您可以使用avifile创建电影,甚至是更新的VideoWriter

avifile

Z = peaks; surf(Z); 
axis tight
set(gca,'nextplot','replacechildren');

vid = avifile('myPeaks.avi', 'fps',15, 'quality',100);
for k = 1:20 
    surf(sin(2*pi*k/20)*Z,Z)
    vid = addframe(vid, getframe(gcf));
end
vid = close(vid);

winopen('myPeaks.avi')

VideoWriter

Z = peaks; surf(Z); 
axis tight
set(gca,'nextplot','replacechildren');

vid = VideoWriter('myPeaks2.avi');
vid.Quality = 100;
vid.FrameRate = 15;
open(vid);
for k = 1:20 
    surf(sin(2*pi*k/20)*Z,Z)
    writeVideo(vid, getframe(gcf));
end
close(vid);

winopen('myPeaks2.avi')

1

你不需要预先分配。只需初始化mov = []。此外,getframe假定gcf,因此您可以直接使用mov(k) = getframe()。我同意您想要一个未压缩的视频。 Matlab附带的编解码器非常有限。如果空间很重要,您可以使用开源工具来压缩视频。


1

您不必预分配。使用moviein命令进行预分配曾经有帮助,但现在不再提供任何性能改进。以下是来自MATLAB的引用:

>> help moviein
moviein Initialize movie frame memory.
moviein is no longer needed as of MATLAB Release 11 (5.3).  
In previous revisions, pre-allocating a movie increased 
performance, but there is no longer a need to pre-allocate 
movies. To create a movie, use something like the 
following example:

  for j=1:n
     plot_command
     M(j) = getframe;
  end
  movie(M)

For code that is compatible with all versions of MATLAB, 
including versions before Release 11 (5.3), use:

  M = moviein(n);
  for j=1:n
     plot_command
     M(:,j) = getframe;
  end
  movie(M)

See also movie, getframe.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接