在 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 中的 avifileVideoWriter 方法都导致相同的错误。

虽然动画运行良好,但保存的电影只包含一个固定帧,有时,屏幕截图会覆盖我的背景网络浏览器。

提前谢谢你。

下面是我使用的代码,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 文件时出错

在matlab中创建视频的方法

如何使用引导程序和 for 循环在 django 中创建电影片段?

怎样在MATLAB中创建空的N维数组?

在 Windows 上使用 GFortran 在 Matlab 中创建 Mex 文件