如何根据 Octave/via 情节创建 mp4 视频
How to create a mp4 video out of Octave/via plot
这是问题 54847941 的后续。我使用打印命令从 Octave 创建的图像序列制作视频,例如:
clear;
for kt=1:100
t(kt)=0.1*kt;
clf,plot(t,sin(t),'linewidth',1);axis([0,10,-1,1]);
fname=strcat('img',num2str(kt,"%0.2i"),'.png');
eval(['print -dpng ' fname ' -r100']);
endfor
##use ffmpeg to make mp4 with:
##ffmpeg -framerate 20 -i img%02d.png -vf scale=1080:-1 Example1.mp4
这在图像较小时有效,但如果图像较大,则打印操作需要很长时间。使用 getframe 和 imwrite 等函数可以替代我的方法吗?
您的初始代码在我的机器上花费了 15.5 秒。第一个优化步骤是保留绘图并更新 xdata 和 y 数据:
t = linspace (0, 10, 100);
for k = 1:numel(t)
y = sin (t(1:k));
if (k == 1)
p = plot (t(1:k), y, 'linewidth', 1);
axis ([0, 10, -1, 1]);
else
set (p, "xdata", t(1:k));
set (p, "ydata", y);
endif
fname = sprintf ("img%03i.png", k);
print ("-dpng", "-r100", fname);
endfor
这在我的机器上需要 13.1 秒。接下来我们可以使用getframe:
out_dir = "temp_img";
mkdir (out_dir);
t = linspace (0, 10, 100);
for k = 1:numel(t)
y = sin (t(1:k));
if (k == 1)
p = plot (t(1:k), y, 'linewidth', 1);
axis ([0, 10, -1, 1]);
else
set (p, "xdata", t(1:k));
set (p, "ydata", y);
endif
fname = fullfile (out_dir, sprintf ("img%03i.png", k));
imwrite (getframe (gcf).cdata, fname);
endfor
cmd = sprintf ("ffmpeg -framerate 20 -i ./%s/img%%03i.png -vf scale=1080:-1 Example1.mp4", out_dir)
system (cmd)
即使使用 运行 ffmpeg 也需要 3.7 秒。
请记住,如果您正在创建图像(我想就像您的漩涡视频),那么您还没有经过情节
这是问题 54847941 的后续。我使用打印命令从 Octave 创建的图像序列制作视频,例如:
clear;
for kt=1:100
t(kt)=0.1*kt;
clf,plot(t,sin(t),'linewidth',1);axis([0,10,-1,1]);
fname=strcat('img',num2str(kt,"%0.2i"),'.png');
eval(['print -dpng ' fname ' -r100']);
endfor
##use ffmpeg to make mp4 with:
##ffmpeg -framerate 20 -i img%02d.png -vf scale=1080:-1 Example1.mp4
这在图像较小时有效,但如果图像较大,则打印操作需要很长时间。使用 getframe 和 imwrite 等函数可以替代我的方法吗?
您的初始代码在我的机器上花费了 15.5 秒。第一个优化步骤是保留绘图并更新 xdata 和 y 数据:
t = linspace (0, 10, 100);
for k = 1:numel(t)
y = sin (t(1:k));
if (k == 1)
p = plot (t(1:k), y, 'linewidth', 1);
axis ([0, 10, -1, 1]);
else
set (p, "xdata", t(1:k));
set (p, "ydata", y);
endif
fname = sprintf ("img%03i.png", k);
print ("-dpng", "-r100", fname);
endfor
这在我的机器上需要 13.1 秒。接下来我们可以使用getframe:
out_dir = "temp_img";
mkdir (out_dir);
t = linspace (0, 10, 100);
for k = 1:numel(t)
y = sin (t(1:k));
if (k == 1)
p = plot (t(1:k), y, 'linewidth', 1);
axis ([0, 10, -1, 1]);
else
set (p, "xdata", t(1:k));
set (p, "ydata", y);
endif
fname = fullfile (out_dir, sprintf ("img%03i.png", k));
imwrite (getframe (gcf).cdata, fname);
endfor
cmd = sprintf ("ffmpeg -framerate 20 -i ./%s/img%%03i.png -vf scale=1080:-1 Example1.mp4", out_dir)
system (cmd)
即使使用 运行 ffmpeg 也需要 3.7 秒。
请记住,如果您正在创建图像(我想就像您的漩涡视频),那么您还没有经过情节