【问题标题】:Write video frames directly to file, bypassing screen rendering将视频帧直接写入文件,绕过屏幕渲染
【发布时间】:2012-03-02 04:02:25
【问题描述】:

我正在使用VideoWriter 从一系列情节中制作视频。它几乎可以正常工作(在遵循this SO answer 中的建议之后)。但是,似乎 Matlab 在完成动画后尝试将所有 3000 帧依次渲染到屏幕上,这导致我的窗口管理器崩溃并且计算机冻结了几分钟。

有没有办法绕过屏幕渲染将视频帧直接写入磁盘?似乎writeVideo(vid, getframe(f)) 中的getframe 必然使图形可见;有没有办法避免这种情况?

【问题讨论】:

  • 不幸的是,我不这么认为,虽然它会很好。来自mathworks.com/help/techdoc/ref/getframe.html:“注意在 MATLAB 软件在当前在您的显示器上不可见的虚拟桌面上运行的情况下,对 getframe 的调用将完成,但将在您的显示器上捕获与图形占据的位置相对应的区域或隐藏桌面上的轴。因此,请确保 getframe 要捕获的窗口存在于当前活动的桌面上。这似乎是一种非常固定的行为。
  • 我的经验是一样的,我也欢迎任何允许此功能的未记录功能。

标签: matlab


【解决方案1】:

如果您只有 3000 帧,您可以将它们保存为图像,并使用 ffmpeg 之类的工具将图像制作成视频。记得对图片使用无损格式,例如 PNG。

【讨论】:

    【解决方案2】:

    不要使用get frame,而是使用im2frame

    writerObj = VideoWriter('awesomeMovie.mp4', 'MPEG-4');
    open(writerObj);
    masterFrame = rand(10,10,3);
    f = im2frame(masterFrame);
    writeVideo(writerObj,f);
    

    【讨论】:

      【解决方案3】:

      使用 avifile 和 addframe 将允许您创建视频而不是将其显示到屏幕上。不过,这似乎是一种较慢的处理方式。

      这是一个基于引用帖子的示例:

      mov = avifile('myPeaks2.avi','fps',15);
      set(gcf, 'visible', 'off')
      
      for k=1:20
          surf(sin(2*pi*k/20)*Z,Z);
          mov = addframe(mov, gcf);
      end
      mov = close(mov);
      

      当然,此方法已被弃用,因此最终您将无法使用它。

      【讨论】:

      • 由于此方法已被弃用,希望不会浪费时间的首选方法是什么?
      猜你喜欢
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 2020-11-20
      • 1970-01-01
      相关资源
      最近更新 更多