movie2avi - 如何修复帧大小?

时间:2013-09-22 21:42:23

标签: matlab animation ffmpeg movie

我在stackoverflow中搜索了类似的问题,我发现了一个问题“movie2avi-frame-size-error-and-keeping-frame-size-constant”。不幸的是,那里给出的答案并没有解决我的问题(有人建议使用xlim,ylim和zlim)。

在下文中,我发送了一个在别处给出的一个着名例子的轻微修改版本。

%# figure
figure, set(gcf, 'Color','white')
Z = peaks; surf(Z);  axis tight
set(gca, 'nextplot','replacechildren', 'Visible','off');
[az,el]=view;
xl=xlim;
yl=ylim;
zl=zlim;

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

%# create movie
for k=1:nFrames
   view([(az-k*10) el]);
   xlim(xl);ylim(yl);zlim(zl);
   drawnow;pause(0.1);
   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);

想法是旋转图形并创建一部电影。除了最后一个命令,即movie2avi,一切正常。错误消息是

Error using avifile/addframe>ValidateFrame (line 290)
Frame must be 435 by 344.

Error in avifile/addframe (line 158)
ValidateFrame(aviobj,width, height,dims);

Error in movie2avi (line 67)
avimov = addframe(avimov,mov);

Error in more_video_test (line 24)
movie2avi(mov, 'myPeaks1.avi', 'compression','None', 'fps',10); 

我已经在stackoverflow中查看了在matlab中创建视频的方法,并发现:

a)解决方案ffmpeg有效,但我想避免它 b)即使是QTWriter,所有其他解决方案也都失败了。如何修复框架尺寸以便所有其他解决方案都能正常工作?

非常感谢。

3 个答案:

答案 0 :(得分:3)

问题在于,由于图形的旋转,轴的大小会发生变化,因此最终会得到一系列不同大小的帧。如果插入行

,可以看到这个
s = size(mov(k).cdata);
fprintf('%d %d\n', s(2), s(1))
在你通过

抓取框架之后直接在循环内

mov(k) = getframe(gca);

结果是

435 344
435 343
435 343
436 342
435 343
435 343
435 343
435 343
435 343
435 343
435 343
435 343
435 343
435 343
435 343
435 343
435 343
435 343
435 343
435 343

由于第一帧的大小为435 x 344,movie2avi期望以下帧具有相同的大小 - 但它们不是。

为了解决此问题,您可能希望使用set(gca, 'Position', [...])显式设置轴大小(和位置)。但更简单的解决方法是不是从轴上抓取框架,而是从图中抓取框架。也就是说,而不是mov(k) = getframe(gca);使用

mov(k) = getframe(gcf);

然后框架具有560 x 420的统一尺寸。

在我的机器上,生成的avi框架颠倒了。为了解决这个问题,您还可以插入一行

mov(k).cdata = mov(k).cdata(end :-1: 1, :, :);
抓住框架后

答案 1 :(得分:1)

我找到了另一种解决方案。

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

% With VideoWriter

writerObj = VideoWriter('myPeaks3.avi');
open(writerObj);

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

%# create movie
for k=1:nFrames
   camorbit(360/nFrames,0,'data','z');
   drawnow;
   mov(k) = getframe(gcf);
   writeVideo(writerObj,mov(k));
end;

% Close file

close(writerObj);

答案 2 :(得分:0)

我遇到了同样的问题,在制作视频时帧的大小正在变化。在互联网上搜索了很长一段时间后,我找不到一个好的解决方案。但是当我尝试在getframe调用之后和writeVideo调用之前添加drawow时。问题已解决,并且不再出现。

我正在使用matlab 2017b。

例如

mov(k) = getframe(gcf);
drawnow;
writeVideo(writerObj,mov(k));