2011-12-21 26 views
6

我尝试通过在MATLAB中循环帧来创建电影。在MATLAB中创建电影文件的问题

参考mathworks.com文档http://www.mathworks.com/help/techdoc/ref/movie.html,我设法为一个情节设置了动画。但是,当我尝试将电影保存在avi文件中时会出现问题。

来自https://stackoverflow.com/a/8038540/818608avifileVideoWriter方法都导致了相同的错误。

尽管动画运行良好,但保存的电影只包含一个固定帧,有时屏幕捕获包括我的后台Web浏览器的叠加层。

预先感谢您。

下面是我使用的代码,下面链接了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') 

The frame that's frozen on the avi is linked below

+2

你能给我们提供一段你正在用来构建电影的代码片段,或者甚至更好的一个小工作例子吗?你有什么特别的错误? – 2011-12-21 00:33:31

+0

我已更新我的帖子以包含使用的代码。动画通过'for'循环运行,我可以看到所有的帧。但是,当我打开保存的AVI时,我只能看到一个固定的帧,并且包含了上面帧的截图。 – flamearchon 2011-12-21 06:53:31

回答

3

尝试以下操作:

f = figure(); 
    Z = peaks; surf(Z); 
    a = axes('Parent',f); 
    axis(a,'tight'); 
    set(a,'nextplot','replacechildren'); 
    vid = VideoWriter('myPeaks2.avi'); 
    vid.Quality = 100; 
    vid.FrameRate = 15; 
    open(vid); 
    for k = 1:20 
     surf(a,sin(2*pi*k/20)*Z,Z) 
     writeVideo(vid, getframe(f)); 
    end 
    close(vid); 

    winopen('myPeaks2.avi') 

它使用的,而不是隐包含明确的手柄。很多混沌都是在Matlab中引起的,因为人们倾向于使用隐含的,比如“gcf”,“gca”,它应该已经从语言中彻底删除,恕我直言。

+2

当我运行你的代码时,我没有看到一个情节。这个数字是空的。 – flamearchon 2011-12-25 00:10:03

3

这完全适用于我。

如果您尝试在surf之后在回路中放置drawnow,该怎么办? (这会刷新所有事件并更新图形图形)。

难道它可能是你的电影播放器​​或编解码器?你可以尝试VLC/Windows媒体播放器/等等?

0

我设法得到它通过强制数字帧是无形的,按照http://www.mathworks.com/support/tech-notes/1200/1204.html工作:

aviobj=avifile('test.avi'); %creates AVI file, test.avi 
hf= figure('visible','off'); %turns visibility of figure off 
hax=axes; 

for k=1:10 
    image(k.*peaks,'parent',hax); %puts image in invisible axes 
    set(gca,'Zlim',[-20 20]); 
    aviobj=addframe(aviobj,hf); %adds frames to the AVI file 
end 

aviobj=close(aviobj); %closes the AVI file 
close(hf); %closes the handle to invisible figure 

在一天结束的时候,没有使用压缩,因为我没有Indeo5 。说我们可以排除压缩作为问题是否正确?

8

我今天有这个(好,密切相关)的问题。这个stackoverflow主题是最热门的搜索引擎结果之一,所以我想我会为未来的搜索者提供更多的信息。

我正在使用一个VideoWriter对象,并调用frame=getframe(fig_handle)将每帧保存到视频。正如在这个话题的问题,只有1帧被保存。另外,人物背后的背景可以通过它看到,就好像这个人物是部分透明的。

将渲染更改为画家或zbuffer工作。 (例如set(gcf,'renderer','zbuffer'))。

虽然我需要openGL渲染,但因为电影使用了透明度。以使这项工作的关键是使用

opengl('software') 

这规避了可能与发送的图形和视频卡(我不肯定知道的一个问题...它的工作,我感动上)。

+2

+1今天在我的Win8安装中遇到了这个问题。这在我以前的WinXP机器上没有发生(我试图在循环中使用'getframe'创建一个[动画GIF](http://stackoverflow.com/a/11054155/97160)文件)。另一种解决方案是使用未公开的['hardcopy'](http://stackoverflow.com/a/13078532/97160) – Amro 2013-09-05 23:45:33

+3

这应该是被接受的答案。总结一下,在[@ Andrey的回答](http://stackoverflow.com/a/8619687/866007)中,用'f = figure('renderer','zbuffer')替换'f = figure();''' 。 – 2014-03-30 19:13:22

0

您是否尝试将显示器设置更改为16位颜色? http://www.mathworks.com/matlabcentral/newsreader/view_thread/257389

+0

虽然此链接可能会回答问题,但最好在此处包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 – NAZIK 2013-08-30 05:10:08

+0

该链接仅用于显示解决方案 - 将您的显示器设置更改为16位色彩 - 已被证明可以在过去使用,并且已经在matlabcentral上记录了数年并且最近进行了更新。 – user2145660 2013-09-11 22:03:31

0

我也有今天只存储一个帧的问题。从改变帧率:

vid.FrameRate = round(0.2*fps/beatfreq); 

其评估为3,简单:

vid.FrameRate = 10; 

我不明白为什么这会令任何区别,但它改变这种后没有及时工作。

编辑:原来,这是VLC,无法处理非常低的framerate。 Windows Media Player播放它没有汗水。