Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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
Octave 如何使用倍频程/通过绘图创建mp4视频_Octave - Fatal编程技术网

Octave 如何使用倍频程/通过绘图创建mp4视频

Octave 如何使用倍频程/通过绘图创建mp4视频,octave,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

这是问题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

当imgae很小时,这种方法可以工作,但如果imgae很大,则打印操作需要很长时间。使用诸如getframe和imwrite之类的函数可以替代我的方法吗?

您的初始代码在我的机器上花费了15.5秒。第一个优化步骤是保持绘图并更新扩展数据和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秒


请记住,如果您正在创建图像(我想像您的vortex视频一样),您可能没有经历plot

可能不是主要的瓶颈,但是在代码中绝对不需要“eval”语句。您可以使用打印的功能形式传递
fname
。通常,评估报表不会从任何优化中受益。其次,您可能可以通过更新绘图的ydata来节省一些时间,而不是每次都清除图形并创建新的绘图对象。话虽如此,大概主要开销是像你所说的打印图像,在这种情况下,如果视频包对你不起作用,考虑将数据导出到Python/OpenCV中的一些常见格式(例如HD5)等。然后将gca“ydir”设置为“正常”。我想我可以马上打电话给imwrite。我没想到我可以使用这个系统在我的八度脚本中包含ffmpeg命令。octave可以直接做这部分吗(不调用ffmpeg)?@ClintonWinant有一个视频包,它提供了aviread/write,因此您可以直接添加帧,但您没有那么好的控制(例如设置crf)。另一种可能是对Octave使用OpenCV绑定,这带来了cv.VideoWriter,但最后我认为调用ffmpeg为您提供了最大的灵活性