I am trying to get a simple animation saved using ffmpeg. I followed a tutorial to install ffmpeg, and I can now access it from the command prompt.
Now I run this piece of code:
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()
I get this error:
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
The last dutch sentence does mean something like: The system can't find the specified file.
What do these errors mean, and how can I solve them?
for some animation "anim" i use on windows:
where path should be with \ \ and not with / or \ between folders
On Windows, I had to use
plt.rcParams['animation.ffmpeg_path'] = 'C:\\mypath'
with all double '\' in the path and this line has to be mentioned beforeand mypath = path of ffmpeg.exe on the local disk.
Additionally, I also added the ffmpeg path in the environment variables.
It took me two days and after going through tons of advice I was able to solve this issue of saving animation.
Thank you everyone for all the answers.
Line 183 in animation.py is the
subprocess.Popen
call toffmpeg
. It seems that theffmpeg
exe is not where matplotlib expects it to be.My first attempt would be to put the install path (directory) to
ffmpeg
into the windowsPath
environmental variable. I'm guessing that animation.py is expecting it to be available globally (as it would be under Linux).If that doesn't work, I'd inspect the
subprocess.Popen
call in animation.py to see exactly what it is doing. You could break point it or adjust the verbose.report variable in your matplotlibrc file to spit it out. Line 179 there is:You need to specify your path to
ffmpeg
:On linux I use:
You will obviously have to point to your windows .exe instead of '/usr/bin/ffmpeg'
If you don't have
ffmpeg
installed, you can get it here