2011-12-21 18 views
6

Tento di creare un film eseguendo il looping dei frame in MATLAB.Problemi con la creazione di file film in MATLAB

Facendo riferimento alla documentazione di mathworks.com allo http://www.mathworks.com/help/techdoc/ref/movie.html, sono riuscito ad animare un grafico. Tuttavia, sorgono problemi quando tento di salvare il film in un file avi.

Entrambi i metodi avifile e VideoWriter da https://stackoverflow.com/a/8038540/818608 hanno provocato gli stessi errori.

Sebbene l'animazione funzioni correttamente, il film salvato è costituito da un solo fotogramma fisso e, a volte, l'acquisizione dello schermo include una sovrapposizione del mio browser di sfondo.

Grazie in anticipo.

Di seguito è riportato il codice che ho utilizzato e il frame che è stato congelato su avi è collegato di seguito.

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

Puoi darci un frammento del codice che stai usando per costruire il film, o ancora meglio, un piccolo esempio di lavoro? Che errore stai ottenendo in particolare? –

+0

Ho aggiornato il mio post per includere il codice utilizzato. L'animazione scorre attraverso il ciclo 'for' e vedo tutti i fotogrammi. Tuttavia, quando apro l'avi salvato, vedo solo una cornice fissa per tutto il tempo, e ho incluso uno screenshot del frame sopra. – flamearchon

risposta

3

provare quanto segue:

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') 

Contiene maniglie espliciti utilizzando al posto di implicita. Il caos è causato in Matlab perché le persone tendono a usare quelli impliciti, come "gcf", "gca" che dovrebbe essere stato rimosso completamente dalla lingua, IMHO.

+2

Quando eseguo il codice, non vedo una trama. La figura è vuota – flamearchon

3

Questo funziona perfettamente per me.

Cosa succede se si è tentato di inserire un drawnow nel ciclo dopo il surf? (Ciò elimina tutti gli eventi e aggiorna la figura grafica).

Potrebbe essere forse il tuo lettore di film o codec? Potresti provare VLC/Windows Media Player/etc etc?

0

sono riuscito a farlo funzionare forzando le cornici figura di essere invisibile, come da 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 

Alla fine della giornata, nessuna compressione è stato utilizzato, in quanto non ho Indeo5 . È corretto dire che potremmo escludere la compressione come problema?

8

Ho avuto questo (beh, un problema strettamente correlato) oggi. Questo argomento StackOverflow è stato uno dei principali risultati dei motori di ricerca, quindi ho pensato di fornire ulteriori informazioni ai futuri utenti.

Stavo usando un oggetto VideoWriter e chiamando frame=getframe(fig_handle) per salvare ogni fotogramma nel video. Come nella domanda relativa a questo argomento, è stato salvato solo 1 fotogramma. Inoltre, lo sfondo dietro la figura potrebbe essere visto attraverso di esso, come se la figura fosse parzialmente trasparente.

Cambiare rendering a pittori o zbuffer lavorato. (set(gcf,'renderer','zbuffer') per esempio)

Avevo bisogno del rendering di openGL, poiché il film utilizzava la trasparenza. La chiave per fare questo lavoro è stato quello di utilizzare

opengl('software') 

Questo aggirato quello che probabilmente era un problema con l'invio la grafica da e per la scheda video (non so per certo ... ha funzionato e mi sono trasferito sopra).

+2

+1, l'ho appena eseguito su questa installazione di Win8. Questo non si è verificato sulla mia vecchia macchina WinXP (stavo cercando di creare un file [GIF animato] (http://stackoverflow.com/a/11054155/97160) usando 'getframe' in un ciclo). Un'altra soluzione è usare il non documentato ['hardcopy'] (http://stackoverflow.com/a/13078532/97160) – Amro

+3

Questa dovrebbe essere la risposta accettata. Per riassumere, in [@ Andrey's answer] (http://stackoverflow.com/a/8619687/866007), sostituisci 'f = figure();' con 'f = figure ('renderer', 'zbuffer');' . –

0

Hai provato a cambiare le impostazioni del monitor a 16 bit a colori? http://www.mathworks.com/matlabcentral/newsreader/view_thread/257389

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – NAZIK

+0

Il collegamento serve solo per mostrare che la soluzione - la modifica delle impostazioni del monitor a 16 bit a colori - ha dimostrato di funzionare in passato ed è stata documentata su matlabcentral per diversi anni e aggiornata di recente. – user2145660

0

Ho anche avuto il problema di archiviare solo un frame oggi. Cambiare il framerate da:

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

che ha valutato a 3, semplicemente:

vid.FrameRate = 10; 

non riesco a capire perché questo avrebbe fatto alcuna differenza, ma lo ha fatto prontamente lavorare dopo aver cambiato questo.

MODIFICA: Risulta essere VLC che non può gestire framerate molto bassi. Windows Media Player ha giocato senza problemi.

Problemi correlati