Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MATLAB中制作电影需要太多的RAM和硬盘空间。。。我应该用什么电影编剧?_Matlab_Memory_Movie_Memory Efficient - Fatal编程技术网

在MATLAB中制作电影需要太多的RAM和硬盘空间。。。我应该用什么电影编剧?

在MATLAB中制作电影需要太多的RAM和硬盘空间。。。我应该用什么电影编剧?,matlab,memory,movie,memory-efficient,Matlab,Memory,Movie,Memory Efficient,我面临着使用imagesc制作约10000帧和每帧约10000像素的电影。然而,尽管我的计算机配备了8GB的RAM,运行32位MATLAB,但MATLAB在大约1000帧时内存不足。另外,我想我的电影压缩以及。制作大型电影的最佳选择是什么?为了找出最佳选择,我测试了Windows 7 MATLAB 2012a 32位的几个电影编写功能 太久没看书了 关键是要确保该功能在电影完成之前将帧刷新到磁盘。VideoWriter与MPEG-4相结合,可产生恒定的小内存大小和压缩视频 代码 结果 内存与帧编

我面临着使用imagesc制作约10000帧和每帧约10000像素的电影。然而,尽管我的计算机配备了8GB的RAM,运行32位MATLAB,但MATLAB在大约1000帧时内存不足。另外,我想我的电影压缩以及。制作大型电影的最佳选择是什么?

为了找出最佳选择,我测试了Windows 7 MATLAB 2012a 32位的几个电影编写功能

太久没看书了 关键是要确保该功能在电影完成之前将帧刷新到磁盘。VideoWriter与MPEG-4相结合,可产生恒定的小内存大小和压缩视频

代码 结果 内存与帧编号

正如我们所看到的,VideoWriter、IMWrite和Movie2AVI对内存的需求几乎是恒定的,而AVI2File和MPGWrite所需的内存随着帧数的增加而增加。这是有道理的,因为后者需要在写入电影之前保持每一帧,而前者似乎定期刷新到磁盘

电影大小 VideoWriter-AVI:154529KB

VideoWriter-MPEG-4:19355KB

IMWrite:13385KB

电影2AVI-AVI:992276 KB

MPGWrite:24301KB


正如预期的那样,MPEG-4产生了比AVI更高效的压缩。有趣的是,VideoWriter和IMWrite在这项测试中都优于MPGWrite,尽管我认为MPGWrite比VideoWriter早很多年

为了找出您的最佳选择,我测试了Windows 7 MATLAB 2012a 32位的几个电影编写功能

太久没看书了 关键是要确保该功能在电影完成之前将帧刷新到磁盘。VideoWriter与MPEG-4相结合,可产生恒定的小内存大小和压缩视频

代码 结果 内存与帧编号

正如我们所看到的,VideoWriter、IMWrite和Movie2AVI对内存的需求几乎是恒定的,而AVI2File和MPGWrite所需的内存随着帧数的增加而增加。这是有道理的,因为后者需要在写入电影之前保持每一帧,而前者似乎定期刷新到磁盘

电影大小 VideoWriter-AVI:154529KB

VideoWriter-MPEG-4:19355KB

IMWrite:13385KB

电影2AVI-AVI:992276 KB

MPGWrite:24301KB


正如预期的那样,MPEG-4产生了比AVI更高效的压缩。有趣的是,VideoWriter和IMWrite在这项测试中都优于MPGWrite,尽管我认为MPGWrite比VideoWriter早很多年

根据我的经验,从MATLAB绘图制作视频的最强大、一致和灵活的方法是将单个帧导出为图像,然后将图像与另一个程序(如ffmpeg)组合成电影。这也使您有机会在需要时批量处理图像。我创建了一个完整的过程,您可以在这里找到:

根据我的经验,从MATLAB绘图制作视频最强大、一致和灵活的方法是将单个帧导出为图像,然后将图像与另一个程序(如ffmpeg)结合成电影。这也使您有机会在需要时批量处理图像。我创建了一个完整的过程,你可以在这里找到:

这可能有助于提到这是哪个版本的Matlab。自从引入以来,VideoWriter课程发生了一些变化。另外,您使用了什么操作系统?VideoWriter使用的视频编解码器严重依赖操作系统。啊。。。我看到您的代码使用内存,这是一个仅限Windows的函数。不幸的是,您的解决方案不是跨平台的。不幸的是,您的解决方案没有文档记录。如果你能建议一个有文档记录的/跨平台的内存替代方案,我洗耳恭听。另外,写下MATLAB的版本。提到这是哪个版本的MATLAB可能会有帮助。自从引入以来,VideoWriter课程发生了一些变化。另外,您使用了什么操作系统?VideoWriter使用的视频编解码器严重依赖操作系统。啊。。。我看到您的代码使用内存,这是一个仅限Windows的函数。不幸的是,您的解决方案不是跨平台的。不幸的是,您的解决方案没有文档记录。如果你能建议一个有文档记录的/跨平台的内存替代方案,我洗耳恭听。另外,写下MATLAB的版本。有趣的替代品。。。如果有人可以建议Windows或其他版本的convert命令行版本,我可以尝试这种方法。@Petard ImageMagick提供convert和许多其他实用程序,可用于Windows、OSX和Linux。有趣的选择。。。如果有人可以建议Windows或其他版本的convert命令行版本,我可以尝试这种方法。@Petard ImageMagick提供convert和许多其他实用程序,可用于Windows、OSX和Linux。
%%%
% General Setup
%%%
number_of_frames = 1000;
Z = peaks; 

%%%
% Video Writer -- AVI
%%%
%%
f = figure('renderer', 'zbuffer');
a = axes('parent', f);
axis(a, 'tight');
surf(a, Z);
current_zlim = zlim();
set(a, 'nextplot', 'replacechildren', 'zlimmode', 'manual', 'zlim', current_zlim);
vid = VideoWriter('myPeaks - VideoWriter.avi');
vid.Quality = 100;
vid.FrameRate = 15;
open(vid);
current_memory_used_Bytes(1, number_of_frames + 1) = 0;
current_memory_struct = memory();
current_memory_used_Bytes(1) = current_memory_struct.MemUsedMATLAB;
for(k = 1 : number_of_frames)
    surf(a, sin(2*pi*k/20)*Z, Z);
    writeVideo(vid, getframe(f));
    current_memory_struct = memory();
    current_memory_used_Bytes(k + 1) = current_memory_struct.MemUsedMATLAB;
end
close(vid);
figure;
plot((current_memory_used_Bytes(2 : end) - current_memory_used_Bytes(1)) / 1e6);
xlabel('Frame Number');
ylabel('Movie Memory in RAM (MB)');
title('VideoWriter -- AVI');
saveas(gcf, 'myPeaks - VideoWriter -- AVI.png');
close all;
clearvars -except number_of_frames Z

%%%
% Video Writer -- MPEG-4
%%%
%%
f = figure('renderer', 'zbuffer');
a = axes('parent', f);
axis(a, 'tight');
surf(a, Z);
current_zlim = zlim();
set(a, 'nextplot', 'replacechildren', 'zlimmode', 'manual', 'zlim', current_zlim);
vid = VideoWriter('myPeaks - VideoWriter.mp4', 'MPEG-4');
vid.Quality = 100;
vid.FrameRate = 15;
open(vid);
current_memory_used_Bytes(1, number_of_frames + 1) = 0;
current_memory_struct = memory();
current_memory_used_Bytes(1) = current_memory_struct.MemUsedMATLAB;
for(k = 1 : number_of_frames)
    surf(a, sin(2*pi*k/20)*Z, Z);
    writeVideo(vid, getframe(f));
    current_memory_struct = memory();
    current_memory_used_Bytes(k + 1) = current_memory_struct.MemUsedMATLAB;
end
close(vid);
figure;
plot((current_memory_used_Bytes(2 : end) - current_memory_used_Bytes(1)) / 1e6);
xlabel('Frame Number');
ylabel('Movie Memory in RAM (MB)');
title('VideoWriter -- MPEG-4');
saveas(gcf, 'myPeaks - VideoWriter -- MPEG-4.png');
close all;
clearvars -except number_of_frames Z

%%%
% Movie2AVI
%%%
%%
f = figure('renderer', 'zbuffer');
a = axes('parent', f);
axis(a, 'tight');
surf(a, Z);
current_zlim = zlim();
set(a, 'nextplot', 'replacechildren', 'zlimmode', 'manual', 'zlim', current_zlim);
movie_frames(1 : number_of_frames) = struct('cdata', [], 'colormap', []);
current_memory_used_Bytes(1, number_of_frames + 1) = 0;
current_memory_struct = memory();
current_memory_used_Bytes(1) = current_memory_struct.MemUsedMATLAB;
for(k = 1 : number_of_frames)
    surf(a, sin(2*pi*k/20)*Z, Z);
    movie_frames(k) = getframe(f);
    current_memory_struct = memory();
    current_memory_used_Bytes(k + 1) = current_memory_struct.MemUsedMATLAB;
end
movie2avi(movie_frames, 'myPeaks - Movie2AVI.avi', 'compression', 'none', 'fps', 10);
figure;
plot((current_memory_used_Bytes(2 : end) - current_memory_used_Bytes(1)) / 1e6);
xlabel('Frame Number');
ylabel('Movie Memory in RAM (MB)');
title('Movie2AVI -- AVI');
saveas(gcf, 'myPeaks - Movie2AVI -- AVI.png');
close all;
clearvars -except number_of_frames Z

%%%
% IMWrite
%%%
%%
f = figure('renderer', 'zbuffer');
a = axes('parent', f);
axis(a, 'tight');
surf(a, Z);
current_zlim = zlim();
set(a, 'nextplot', 'replacechildren', 'zlimmode', 'manual', 'zlim', current_zlim);
current_frame = getframe(a);
[frame_indices, cmap] = rgb2ind(current_frame.cdata, 256, 'nodither');
movie_frames = repmat(frame_indices, [1 1 1 number_of_frames]);
current_memory_used_Bytes(1, number_of_frames + 1) = 0;
current_memory_struct = memory();
current_memory_used_Bytes(1) = current_memory_struct.MemUsedMATLAB;
for(k = 1 : number_of_frames)
    surf(sin(2*pi*k/20)*Z, Z)
    f = getframe(a);
    movie_frames(:, :, 1, k) = rgb2ind(f.cdata, cmap, 'nodither');
    current_memory_struct = memory();
    current_memory_used_Bytes(k + 1) = current_memory_struct.MemUsedMATLAB;
end
imwrite(movie_frames, cmap, 'myPeaks - IMWrite.gif', 'DelayTime', 0, 'LoopCount', inf);
figure;
plot((current_memory_used_Bytes(2 : end) - current_memory_used_Bytes(1)) / 1e6);
xlabel('Frame Number');
ylabel('Movie Memory in RAM (MB)');
title('Movie2AVI -- AVI');
saveas(gcf, 'myPeaks - IMWrite.png');
close all;
clearvars -except number_of_frames Z

%%%
% MPGWrite
%%%
%%
f = figure('renderer', 'zbuffer');
a = axes('parent', f);
axis(a, 'tight');
surf(a, Z);
current_zlim = zlim();
set(a, 'nextplot', 'replacechildren', 'zlimmode', 'manual', 'zlim', current_zlim);
winsize = get(f, 'Position');
winsize(1:2) = [0 0];
movie_frames = moviein(number_of_frames, f, winsize);
current_memory_used_Bytes(1, number_of_frames + 1) = 0;
current_memory_struct = memory();
current_memory_used_Bytes(1) = current_memory_struct.MemUsedMATLAB;
for(k = 1 : number_of_frames)
    surf(sin(2*pi*k/20)*Z, Z)
    drawnow;
    movie_frames(:, k) = im2frame(hardcopy(f, '-Dzbuffer', '-r0')); 
    current_memory_struct = memory();
    current_memory_used_Bytes(k + 1) = current_memory_struct.MemUsedMATLAB;
end
mpgwrite(movie_frames, jet, 'myPeaks - MPGWrite.mpg');
figure;
plot((current_memory_used_Bytes(2 : end) - current_memory_used_Bytes(1)) / 1e6);
xlabel('Frame Number');
ylabel('Movie Memory in RAM (MB)');
title('MPGWrite -- MPG');
saveas(gcf, 'myPeaks - MPGWrite.png');
close all;
clearvars -except number_of_frames Z