在MATLAB中创建电影文件的问题

时间:2011-12-21 00:00:01

标签: matlab animation video

我尝试通过在MATLAB中循环遍历来创建电影。

参考http://www.mathworks.com/help/techdoc/ref/movie.html的mathworks.com文档,我设法为一个情节制作动画。但是,当我尝试将电影保存在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

6 个答案:

答案 0 :(得分:8)

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

我使用的是VideoWriter对象,并调用frame=getframe(fig_handle)将每个帧保存到视频中。在本主题的问题中,只保存了1帧。此外,可以通过它看到数字背后的背景,好像这个数字是部分透明的。

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

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

opengl('software')

这避免了向显卡发送图像和从显卡发送图形的问题(我不确定......它有效,我继续前进)。

答案 1 :(得分:3)

这对我来说很有效。

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

它可能是你的电影播放器​​,还是编解码器?你能试试VLC / Windows Media Player /等等吗?

答案 2 :(得分: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”应该已经完全从语言中删除了,恕我直言。

答案 3 :(得分: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。说我们可以排除压缩作为问题是否正确?

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我还遇到了今天只存储一帧的问题。从以下位置更改帧速率:

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

评估为3,简单地说:

vid.FrameRate = 10;

我无法理解为什么这会产生任何影响,但在更改后会及时发挥作用。

编辑:原来是VLC无法处理非常低的帧速率。 Windows Media Player玩得很好,没有汗水。