2012-03-02 80 views
2

我正在使用VideoWriter從一系列地塊中製作視頻。它大多工作正常(在遵循this SO answer的建議後)。然而,似乎Matlab試圖在完成動畫之後按順序渲染全部3000幀,這導致我的窗口管理器出現異常,計算機凍結幾分鐘。將視頻幀直接寫入文件,繞過屏幕渲染

有沒有辦法將視頻幀直接寫入磁盤,繞過屏幕渲染?看起來getframewriteVideo(vid, getframe(f))必然使這個數字可見;有沒有辦法避免這種情況?

+1

不幸的是,我不這麼認爲,雖然這將是很好的。來自http://www.mathworks.com/help/techdoc/ref/getframe.html:「注意:在MATLAB軟件在當前不可見的虛擬桌面上運行的情況下,調用getframe將完成,但將捕獲顯示器上與隱藏桌面上的圖形或軸佔據的位置相對應的區域,因此,請確保當前活動桌面上存在由getframe捕獲的窗口。這看起來像是一個非常頑固的行爲。 – tmpearce 2012-03-02 04:41:12

+0

我的經驗是一樣的,我也歡迎任何可以允許此功能的未公開的功能。 – macduff 2012-03-02 06:19:53

回答

2

如果你只有3000幀,你可以將它們保存爲圖像,並使用類似ffmpeg的圖像製作視頻。請記住爲圖像使用無損格式,例如PNG。

0

使用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); 

當然,這種方法被棄用,因此,最終你將無法使用它。

+0

由於此方法已被棄用,因此希望不會犧牲時間的事情的首選方式是什麼? – hyiltiz 2017-08-21 20:47:46

1

不要使用get框架,但使用im2frame代替

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