我尝试通过在MATLAB中循环遍历来创建电影。
参考http://www.mathworks.com/help/techdoc/ref/movie.html的mathworks.com文档,我设法为一个情节制作动画。但是,当我尝试将电影保存在avi文件中时会出现问题。
来自https://stackoverflow.com/a/8038540/818608的avifile
和VideoWriter
方法导致相同的错误。
虽然动画运行正常,但保存的影片只包含一个固定的帧,有时屏幕截图包含我的后台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')
答案 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玩得很好,没有汗水。