如何从八度/通过图创建mp4视频

时间:2019-02-25 15:58:11

标签: octave

这是对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之类的函数可以替代我的方法?

1 个答案:

答案 0 :(得分:2)

您的初始代码在我的计算机上花费了15.5s。优化的第一步是保留图并更新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秒。

请记住,如果您要创建图像(我想就像您的涡流视频一样),您就不会花时间了