2014-05-25 16 views
5

Sto cercando di ottenere un'animazione semplice salvata usando ffmpeg. Ho seguito un tutorial per installare ffmpeg e ora posso accedervi dal prompt dei comandi.Impossibile salvare animazioni matplotlib

Ora ho eseguito questo pezzo di codice:

import numpy as np 
from matplotlib import pyplot as plt 
from matplotlib import animation 

fig = plt.figure() 
ax = plt.axes(xlim=(0, 2), ylim=(-2, 2)) 
line, = ax.plot([], [], lw=2) 

def init(): 
    line.set_data([], []) 
    return line, 

def animate(i): 
    x = np.linspace(0, 2, 1000) 
    y = np.sin(2 * np.pi * (x - 0.01 * i)) 
    line.set_data(x, y) 
    return line, 

anim = animation.FuncAnimation(fig, animate, init_func=init, 
           frames=200, interval=20, blit=True) 

mywriter = animation.FFMpegWriter() 
anim.save('mymovie.mp4',writer=mywriter) 

plt.show() 

ottengo questo errore:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 523, in runfile 
    execfile(filename, namespace) 
    File "C:\Users\Renger\.xy\startups\b.py", line 23, in <module> 
    anim.save('mymovie.mp4',writer=mywriter) 
    File "C:\Python27\lib\site-packages\matplotlib\animation.py", line 609, in save 
    with writer.saving(self._fig, filename, dpi): 
    File "C:\Python27\lib\contextlib.py", line 17, in __enter__ 
    return self.gen.next() 
    File "C:\Python27\lib\site-packages\matplotlib\animation.py", line 166, in saving 
    self.setup(*args) 
    File "C:\Python27\lib\site-packages\matplotlib\animation.py", line 156, in setup 
    self._run() 
    File "C:\Python27\lib\site-packages\matplotlib\animation.py", line 183, in _run 
    stdin=subprocess.PIPE) 
    File "C:\Python27\lib\subprocess.py", line 711, in __init__ 
    errread, errwrite) 
    File "C:\Python27\lib\subprocess.py", line 948, in _execute_child 
    startupinfo) 
WindowsError: [Error 2] Het systeem kan het opgegeven bestand niet vinden 

L'ultima frase olandese vuol dire qualcosa come: il sistema non riesce a trovare il file specificato.

Cosa significano questi errori e come posso risolverli?

risposta

10

È necessario specificare il percorso per ffmpeg:

su Linux utilizzare:

import numpy as np 
from matplotlib import pyplot as plt 
from matplotlib import animation 
plt.rcParams['animation.ffmpeg_path'] = '/usr/bin/ffmpeg' 

Sarà, ovviamente, deve puntare alla vostre finestre .exe, invece di '/ usr/bin/ffmpeg'

Se non si dispone di ffmpeg installato, si può ottenere here

+0

In un primo momento ancora non ha funzionato in questo modo, ma si scopre che dovevo usare una doppia barra ovunque. Non so perché. – renger

+2

usando/slash o stringa raw funzionerà r'C: ... '\ escapes caratteri in python. –

+1

Ho dovuto impostare 'rcParam' prima di importare' matplotlib.animation'. Può essere correlato alle modifiche in Matplotlib ('__version__ == '1.5.2'') o alle peculiarità della mia installazione di Windows. – kazemakase

0

La riga 183 in animation.py è la chiamata subprocess.Popen allo ffmpeg. Sembra che l'exe ffmpeg non sia dove Matplotlib si aspetta che sia.

Il mio primo tentativo sarebbe quello di mettere il percorso di installazione (directory) a ffmpeg nella variabile ambientale di Windows Path. Immagino che animation.py si aspetti che sia disponibile a livello globale (come sarebbe sotto Linux).

Se ciò non funziona, ispezionerei la chiamata subprocess.Popen in animation.py per vedere esattamente cosa sta facendo. Potresti interromperlo o regolare la variabile verbose.report nel tuo file matplotlibrc per sputarlo. Linea 179 c'è:

verbose.report('MovieWriter.run: running command: %s' % 
        ' '.join(command)) 
5

per un po 'di animazione "anim" Io uso sulle finestre:

plt.rcParams['animation.ffmpeg_path'] ='E:\\Media\\ffmpeg\\bin\\ffmpeg.exe' 
FFwriter = animation.FFMpegWriter() 
anim.save('basic_animation.mp4', writer = FFwriter, fps=30) 

dove percorso dovrebbe essere con \ \ e non con/o \ tra le cartelle

+1

Le risposte di solo codice sono contrassegnate automaticamente come bassa qualità e quindi scoraggiate su StackOverflow. In futuro, abbellisci la tua risposta con i dettagli e spiega perché è una soluzione alla domanda. –

+0

Questo ha risolto perfettamente il mio problema. Grazie! – sfortney