2011-12-21 23 views
6

我嘗試通過在MATLAB中循環幀來創建電影。在MATLAB中創建電影文件的問題

參考mathworks.com文檔http://www.mathworks.com/help/techdoc/ref/movie.html,我設法爲一個情節設置了動畫。但是,當我嘗試將電影保存在avi文件中時會出現問題。

來自https://stackoverflow.com/a/8038540/818608avifileVideoWriter方法都導致了相同的錯誤。

儘管動畫運行良好,但保存的電影只包含一個固定幀,有時屏幕捕獲包括我的後臺Web瀏覽器的疊加層。

預先感謝您。

下面是我使用的代碼,下面鏈接了avi上凍結的幀。

Z = peaks; surf(Z); 
axis tight 
set(gca,'nextplot','replacechildren'); 

vid = VideoWriter('myPeaks2.avi'); 
vid.Quality = 100; 
vid.FrameRate = 15; 
open(vid); 
for k = 1:20 
    surf(sin(2*pi*k/20)*Z,Z) 
    writeVideo(vid, getframe(gcf)); 
end 
close(vid); 

winopen('myPeaks2.avi') 

The frame that's frozen on the avi is linked below

+2

你能給我們提供一段你正在用來構建電影的代碼片段,或者甚至更好的一個小工作例子嗎?你有什麼特別的錯誤? – 2011-12-21 00:33:31

+0

我已更新我的帖子以包含使用的代碼。動畫通過'for'循環運行,我可以看到所有的幀。但是,當我打開保存的AVI時,我只能看到一個固定的幀,並且包含了上面幀的截圖。 – flamearchon 2011-12-21 06:53:31

回答

3

嘗試以下操作:

f = figure(); 
    Z = peaks; surf(Z); 
    a = axes('Parent',f); 
    axis(a,'tight'); 
    set(a,'nextplot','replacechildren'); 
    vid = VideoWriter('myPeaks2.avi'); 
    vid.Quality = 100; 
    vid.FrameRate = 15; 
    open(vid); 
    for k = 1:20 
     surf(a,sin(2*pi*k/20)*Z,Z) 
     writeVideo(vid, getframe(f)); 
    end 
    close(vid); 

    winopen('myPeaks2.avi') 

它使用的,而不是隱包含明確的手柄。很多混沌都是在Matlab中引起的,因爲人們傾向於使用隱含的,比如「gcf」,「gca」,它應該已經從語言中徹底刪除,恕我直言。

+2

當我運行你的代碼時,我沒有看到一個情節。這個數字是空的。 – flamearchon 2011-12-25 00:10:03

3

這完全適用於我。

如果您嘗試在surf之後在迴路中放置drawnow,該怎麼辦? (這會刷新所有事件並更新圖形圖形)。

難道它可能是你的電影播放器​​或編解碼器?你可以嘗試VLC/Windows媒體播放器/等等?

0

我設法得到它通過強制數字幀是無形的,按照http://www.mathworks.com/support/tech-notes/1200/1204.html工作:

aviobj=avifile('test.avi'); %creates AVI file, test.avi 
hf= figure('visible','off'); %turns visibility of figure off 
hax=axes; 

for k=1:10 
    image(k.*peaks,'parent',hax); %puts image in invisible axes 
    set(gca,'Zlim',[-20 20]); 
    aviobj=addframe(aviobj,hf); %adds frames to the AVI file 
end 

aviobj=close(aviobj); %closes the AVI file 
close(hf); %closes the handle to invisible figure 

在一天結束的時候,沒有使用壓縮,因爲我沒有Indeo5 。說我們可以排除壓縮作爲問題是否正確?

8

我今天有這個(好,密切相關)的問題。這個stackoverflow主題是最熱門的搜索引擎結果之一,所以我想我會爲未來的搜索者提供更多的信息。

我正在使用一個VideoWriter對象,並調用frame=getframe(fig_handle)將每幀保存到視頻。正如在這個話題的問題,只有1幀被保存。另外,人物背後的背景可以通過它看到,就好像這個人物是部分透明的。

將渲染更改爲畫家或zbuffer工作。 (例如set(gcf,'renderer','zbuffer'))。

雖然我需要openGL渲染,但因爲電影使用了透明度。以使這項工作的關鍵是使用

opengl('software') 

這規避了可能與發送的圖形和視頻卡(我不肯定知道的一個問題...它的工作,我感動上)。

+2

+1今天在我的Win8安裝中遇到了這個問題。這在我以前的WinXP機器上沒有發生(我試圖在循環中使用'getframe'創建一個[動畫GIF](http://stackoverflow.com/a/11054155/97160)文件)。另一種解決方案是使用未公開的['hardcopy'](http://stackoverflow.com/a/13078532/97160) – Amro 2013-09-05 23:45:33

+3

這應該是被接受的答案。總結一下,在[@ Andrey的回答](http://stackoverflow.com/a/8619687/866007)中,用'f = figure('renderer','zbuffer')替換'f = figure();''' 。 – 2014-03-30 19:13:22

0

您是否嘗試將顯示器設置更改爲16位顏色? http://www.mathworks.com/matlabcentral/newsreader/view_thread/257389

+0

雖然此鏈接可能會回答問題,但最好在此處包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – NAZIK 2013-08-30 05:10:08

+0

該鏈接僅用於顯示解決方案 - 將您的顯示器設置更改爲16位色彩 - 已被證明可以在過去使用,並且已經在matlabcentral上記錄了數年並且最近進行了更新。 – user2145660 2013-09-11 22:03:31

0

我也有今天只存儲一個幀的問題。從改變幀率:

vid.FrameRate = round(0.2*fps/beatfreq); 

其評估爲3,簡單:

vid.FrameRate = 10; 

我不明白爲什麼這會令任何區別,但它改變這種後沒有及時工作。

編輯:原來,這是VLC,無法處理非常低的framerate。 Windows Media Player播放它沒有汗水。