【问题标题】:MatLab, how to preallocate for frames to make a movie?MatLab,如何预先分配帧来制作电影?
【发布时间】:2011-11-05 19:40:14
【问题描述】:

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 中。但是我不明白如何使用 struct 正确预分配我的内存。

【问题讨论】:

  • 您可能确实希望压缩视频,因为未压缩的视频会占用大量磁盘空间。您只需要确保选择您的 PowerPoint 版本支持的容器格式(例如 avi)和压缩方法。预分配应该是可选的,只会使生成电影文件的过程稍微快一些。您发布的代码看起来只是预分配了一个指针数组,而不是预分配了保存电影所需的所有内存,因此它的存在可能更多是为了抑制代码样式警告而不是加快速度。
  • 感谢您的帮助。您是否知道如何在 addframe 命令中使用句柄,以便在我不在时 getframe 不会保存我的屏幕保护程序图像?

标签: matlab struct frames movie


【解决方案1】:

您可以使用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')

视频作家

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')

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您不必预先分配。它曾经帮助使用 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.
      

      【讨论】:

        猜你喜欢
        • 2012-11-13
        • 2018-10-04
        • 1970-01-01
        • 2019-01-29
        • 1970-01-01
        • 1970-01-01
        • 2012-08-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多