我在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也是如此。我如何确定帧大小,以便所有其他解决方案都能正常工作?
非常感谢。
边缘
发布于 2013-09-28 22:30:31
问题是,由于图形的旋转,轴的大小发生了变化,因此您最终得到了一系列不同大小的帧。如果您插入以下行,就会看到这一点
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', [...])显式设置轴大小(& position)。不过,一种更容易的解决方法是不从轴而是从图形中抓取帧。也就是说,使用mov(k) = getframe(gca);而不是
mov(k) = getframe(gcf);然后,这些帧具有560 x 420的统一大小。
在我的机器上,生成的avi的帧颠倒了。为了解决这个问题,您还可以另外插入一行
mov(k).cdata = mov(k).cdata(end :-1: 1, :, :);在抓取相框之后。
发布于 2013-10-03 00:32:20
对于我的问题,我找到了另一种解决方案。
%# 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);发布于 2019-12-18 22:21:33
我也有同样的问题,在制作视频的过程中,帧的大小也在变化。在互联网上找了很长一段时间,我没有找到一个好的解决方案。但是当我尝试在getframe调用之后和writeVideo调用之前添加drawnow时。问题解决了,不再出现了。
我使用的是matlab 2017b。
例如:
mov(k) = getframe(gcf);
drawnow;
writeVideo(writerObj,mov(k));https://stackoverflow.com/questions/18949050
复制相似问题