在 MATLAB 中创建电影文件的问题
Posted
技术标签:
【中文标题】在 MATLAB 中创建电影文件的问题【英文标题】:Problems with movie file creation in MATLAB 【发布时间】:2011-12-21 00:00:01 【问题描述】:我尝试通过在 MATLAB 中循环帧来创建电影。
参考http://www.mathworks.com/help/techdoc/ref/movie.html 上的 mathworks.com 文档,我成功地制作了一个情节动画。但是,当我尝试将电影保存为 avi 文件时出现问题。
https://***.com/a/8038540/818608 中的 avifile
和 VideoWriter
方法都导致相同的错误。
虽然动画运行良好,但保存的电影只包含一个固定帧,有时,屏幕截图会覆盖我的背景网络浏览器。
提前谢谢你。
下面是我使用的代码,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')
【问题讨论】:
你能给我们一个你用来构建电影的代码的sn-p,或者更好的是,一个小的工作示例吗?您特别遇到了什么错误? 我已更新我的帖子以包含使用的代码。动画通过for
循环运行,我看到了所有帧。然而,当我打开保存的 avi 时,我一直只看到一个固定的帧,并且我已经包含了上面帧的截图。
【参考方案1】:
我今天遇到了这个(嗯,一个密切相关的)问题。这个 *** 主题是热门搜索引擎结果之一,所以我想我会为未来的搜索者提供更多信息。
我正在使用VideoWriter
对象,并调用frame=getframe(fig_handle)
将每一帧保存到视频中。与本主题的问题一样,仅保存了 1 帧。另外,透过它可以看到人物背后的背景,仿佛人物是部分透明的。
将渲染更改为画家或 zbuffer 工作。 (例如set(gcf,'renderer','zbuffer')
。)
我需要 openGL 渲染,因为电影使用了透明度。完成这项工作的关键是使用
opengl('software')
这规避了从视频卡发送图形可能存在的问题(我不确定......它有效,我继续前进)。
【讨论】:
+1 今天刚刚在我的 Win8 安装中遇到了这个问题。这在我的旧 WinXP 机器上没有发生(我试图在循环中使用getframe
创建一个animated GIF 文件)。另一种解决方案是使用未记录的hardcopy
这应该是公认的答案。总而言之,在@Andrey's answer 中,将f = figure();
替换为f = figure('renderer', 'zbuffer');
。【参考方案2】:
尝试以下方法:
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】:这对我来说非常有效。
如果您尝试将drawnow
放在surf
之后的循环中会怎样? (这会刷新所有事件并更新您的图形)。
可能是您的电影播放器或编解码器?可以试试 VLC/Windows Media Player/etc 等吗?
【讨论】:
【参考方案4】:根据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。说我们可以排除压缩是问题是否正确?
【讨论】:
【参考方案5】:您是否尝试将显示器设置更改为 16 位颜色? http://www.mathworks.com/matlabcentral/newsreader/view_thread/257389
【讨论】:
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。 该链接仅显示解决方案 - 将显示器设置更改为 16 位颜色 - 过去已被证明有效,并且已在 matlabcentral 上记录了几年,并且最近进行了更新。 【参考方案6】:我也遇到了今天只存储一帧的问题。从以下位置更改帧速率:
vid.FrameRate = round(0.2*fps/beatfreq);
评估为 3,简单来说:
vid.FrameRate = 10;
我不明白为什么这会产生任何影响,但在更改后它确实立即起作用了。
编辑:原来是 VLC 无法处理非常低的帧率。 Windows Media Player 播放良好,毫不费力。
【讨论】:
以上是关于在 MATLAB 中创建电影文件的问题的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 MAC OS MATLAB 读取在 windows MATLAB 中创建的 .mat 文件
使用 Matlab codegen 在 Matlab 2013 中创建 mex 文件时出错