Kann Matplotlib-Animation nicht mit ffmpeg speichern

Ich versuche, eine einfache Matplotlib-Animation von Jake Vanderplas zu retten, aber ich OSError: [Errno 13] Permission denied immer OSError: [Errno 13] Permission denied .

Ich sollte beachten, dass ich zwei kleine Änderungen an Jake Vanderplas Beispiel gemacht habe. Ich habe ffmpeg von MacPorts installiert, also habe ich die Zeile plt.rcParams['animation.ffmpeg_path'] = '/opt/local/bin' und ich lief in das Problem, das in ( mit FFmpeg und IPython ) diskutiert wurde, so dass ich FFwriter = animation.FFMpegWriter() hinzugefügt FFwriter = animation.FFMpegWriter() .

Hier ist der Code:

 import numpy as np from matplotlib import pyplot as plt from matplotlib import animation plt.rcParams['animation.ffmpeg_path'] = '/opt/local/bin' 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) FFwriter = animation.FFMpegWriter() anim.save('basic_animation.mp4', writer = FFwriter, fps=30, extra_args=['-vcodec', 'libx264']) 

Hier ist die Rückverfolgung:

 File "ani_debug.py", line 34, in <module> anim.save('basic_animation.mp4', writer = FFwriter, fps=30, extra_args=['-vcodec', 'libx264']) File "/Users/Ben/Library/Enthought/Canopy_64bit/User/lib/python2.7/site- packages/matplotlib/animation.py", line 712, in save with writer.saving(self._fig, filename, dpi): File "/Applications/Canopy.app/appdata/canopy-1.3.0.1715.macosx-x86_64/Canopy.app/Contents/lib/python2.7/contextlib.py", line 17, in __enter__ return self.gen.next() File "/Users/Ben/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/animation.py", line 169, in saving self.setup(*args) File "/Users/Ben/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/animation.py", line 159, in setup self._run() File "/Users/Ben/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlib/animation.py", line 186, in _run stdin=subprocess.PIPE) File "/Applications/Canopy.app/appdata/canopy-1.3.0.1715.macosx-x86_64/Canopy.app/Contents/lib/python2.7/subprocess.py", line 709, in __init__ errread, errwrite) File "/Applications/Canopy.app/appdata/canopy-1.3.0.1715.macosx-x86_64/Canopy.app/Contents/lib/python2.7/subprocess.py", line 1326, in _execute_child raise child_exception OSError: [Errno 13] Permission denied 

Ich habe auch mit Spyders eingebautem Python versucht und einen ähnlichen Rückblick erhalten. Irgendwelche Vorschläge?


EDIT: Ich erkannte, dass ich nicht den richtigen Weg zu ffmpeg gab. Anscheinend plt.rcParams['animation.ffmpeg_path'] nicht ähnlich wie PYTHONPATH . Sie müssen dem Animationsmodul genau sagen, wo ffmpeg mit plt.rcParams['animation.ffmpeg_path'] = '/opt/local/bin/ffmpeg' .

Jetzt bekomme ich eine Filmdatei, die spielen wird, aber der Inhalt ist komplett verstümmelt. Ich kann nicht sagen, was ich mich anschaue.

Hier ist die Rückverfolgung:

 Exception in Tkinter callback Traceback (most recent call last): File "Tkinter.pyc", line 1470, in __call__ File "Tkinter.pyc", line 531, in callit File "/Applications/Spyder.app/Contents/Resources/lib/python2.7/matplotlib/backends/backend_tkagg.py", line 141, in _on_timer TimerBase._on_timer(self) File "/Applications/Spyder.app/Contents/Resources/lib/python2.7/matplotlib/backend_bases.py", line 1203, in _on_timer ret = func(*args, **kwargs) File "/Applications/Spyder.app/Contents/Resources/lib/python2.7/matplotlib/animation.py", line 876, in _step still_going = Animation._step(self, *args) File "/Applications/Spyder.app/Contents/Resources/lib/python2.7/matplotlib/animation.py", line 735, in _step self._draw_next_frame(framedata, self._blit) File "/Applications/Spyder.app/Contents/Resources/lib/python2.7/matplotlib/animation.py", line 753, in _draw_next_frame self._pre_draw(framedata, blit) File "/Applications/Spyder.app/Contents/Resources/lib/python2.7/matplotlib/animation.py", line 766, in _pre_draw self._blit_clear(self._drawn_artists, self._blit_cache) File "/Applications/Spyder.app/Contents/Resources/lib/python2.7/matplotlib/animation.py", line 806, in _blit_clear a.figure.canvas.restore_region(bg_cache[a]) KeyError: <matplotlib.axes.AxesSubplot object at 0x104cfb150> 

EDIT: Aus irgendeinem Grund geht alles jetzt gut. Ich habe Sachen auf meinem Heimcomputer und meinem Arbeitscomputer ausprobiert, und keiner kann die verstümmelte Videodatei neu erstellen, die ich bekam, nachdem ich das Problem des ffmpeg-Pfades behoben hatte.


EDIT: Aaaahaaa! Ich habe diesen Sauger nach unten verfolgt. Manchmal würde ich ein Modul importieren, das plt.rcParams['savefig.bbox'] = 'tight' darin hatte. (Ich würde das Modul nie benutzen, aber rcParams bleibt bestehen, bis du deinen Python-Interpreter neu startet.) Diese Einstellung bewirkt, dass das Video alle verstümmelt kommt. Ich werde meine Lösung unten posten.

2 Solutions collect form web for “Kann Matplotlib-Animation nicht mit ffmpeg speichern”

So stellt sich heraus, dass es zwei Fragen gab.

Ausgabe Nr. 1: Der Weg zu ffmpeg war falsch Ich dachte, ich brauche den Pfad zu dem Verzeichnis, dass ffmpeg wohnt in, aber ich brauchte, um den Weg den ganzen Weg, um die ffmpeg binäre.

Issue # 2: Vor dem Testen meines Codes, um Videos zu erzeugen, würde ich manchmal ein Modul mit der Einstellung plt.rcParams['savefig.bbox'] = 'tight' importieren. (Ich habe nicht viel darüber nachgedacht, weil ich das Modul nicht benutzt habe, aber rcParams bleibt bestehen, bis du den Python-Interpreter neu plt.rcParams['savefig.bbox'] = 'tight' .) Diese plt.rcParams['savefig.bbox'] = 'tight' bewirkt plt.rcParams['savefig.bbox'] = 'tight' dass die Videodatei ohne zu speichern ist Irgendwelche Fehler, aber die Rahmen sind alle verstümmelt, wenn Sie versuchen, das Video zu spielen. Obwohl es mich den ganzen Abend gebraucht hat, um dies zu verfolgen, stellt sich heraus, dass dies ein bekanntes Problem ist .

Hier ist die aktualisierte Lösung, die eine Videodatei für mich mit einer schönen, übersetzenden Sinuswelle erzeugt.

 import numpy as np from matplotlib import pyplot as plt from matplotlib import animation plt.rcParams['animation.ffmpeg_path'] = '/opt/local/bin/ffmpeg' 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) FFwriter = animation.FFMpegWriter() anim.save('basic_animation.mp4', writer = FFwriter, fps=30, extra_args=['-vcodec', 'libx264']) 

Ich hatte Probleme, wenn ich zuerst (naiv) versucht habe, das Arbeitsbeispiel von Antwort 3 zu modifizieren, um den Graphen in Echtzeit zu zeigen (sowie den Film zu behalten).

Nicht ganz richtig Mods der Antwort 3 (was für mich gearbeitet hat)

  1. Plt.ion () # interaktion auf
  2. Plt.draw () und plt.show () innerhalb der animierten Funktion, vor dem Rückkehrstatent
  3. Frames = 20, Intervall = 200 zu langsamen Graphen-Erstellung ein bisschen, aber immer noch einen 4-Sekunden-Film

Jetzt erscheint die Handlung in einem Fenster, wie es erstellt wird, aber der Ausgabefilm ist verstümmelt.

Korrigieren Sie Schritt 2:

  • 2a: plt.draw () innerhalb der animierten Funktion
  • 2b: plt.show () kurz nach der animierten Funktion

Jetzt spielt der Film unglaublich zurück.

  • Was ist% pylab?
  • Matplotlib, das gestapelte Histogramm aus drei ungleichen Arrays erzeugt
  • 2D-Plot mit 1D-Arrays ohne griddata ()
  • Das Speichern einer Figur nach dem Aufruf von pyplot.show () führt zu einer leeren Datei
  • Plot 2D Histogramm als Wärmekarte in Matplotlib
  • Erstellen von festen Satz von Knoten mit networkx in python
  • Grund- und Dichte-Plots
  • Seaborn-Paletten - verhindern das Recycling von Farben
  • Matplotlib.pyplot / pylab nicht aktualisierende Figur während isinteractive (), mit ipython -pylab [duplicate]
  • Einzelne Legende mit zwei Zeilen
  • Python - matplotlib: Finde Schnittpunkt von Lineplots
  • Python ist die beste Programmiersprache der Welt.