无法保存matplotlib动画

8

我正在尝试使用ffmpeg保存一个简单的动画。我按照教程安装了ffmpeg,现在可以通过命令提示符访问它。

现在我运行以下代码:

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

我遇到了以下错误:

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

上面的荷兰语句子大概意思是:系统无法找到指定的文件。
这些错误是什么意思,我该如何解决?
4个回答

16

你需要指定你的 ffmpeg 路径:

在 Linux 上我使用:

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

显然,您需要指向Windows .exe文件而不是'/usr/bin/ffmpeg'

如果您没有安装ffmpeg,您可以在此处获取它here


起初,它仍然不能这样工作,但事实证明我必须在每个地方使用双斜杠。不知道为什么。 - renger
2
使用斜杠或原始字符串将会起作用,r'C:...'在Python中转义字符。 - Padraic Cunningham
2
在导入matplotlib.animation之前,我必须设置rcParam。这可能与Matplotlib的更改(__version__ == '1.5.2')或我的Windows安装的特殊性有关。 - MB-F
或者您可以将ffmpeg可执行文件的路径添加到您的PATH变量中。 - gauteh
我在使用Anaconda时遇到了这个问题。我运行了 which ffmpeg 命令,发现它正在使用Anaconda的ffmpeg。 - crypdick

7

对于我在Windows上使用的一些动画"anim":

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

路径应该用 \ \ 而不是 / 或者 \ 来表示文件夹之间的分隔符。


1
仅包含代码的答案会被自动标记为低质量,因此在stackoverflow上不鼓励这种回答。请在未来详细说明您的答案,并解释为什么它是问题的解决方案。 - tom redfern
1
这个可以运行,但我必须在FFMpegWriter()构造函数中传递fps = 100参数:FFwriter = animation.FFMpegWriter(fps = 100) - Chupo_cro

0

animation.py 中第183行是调用subprocess.Popen函数来运行ffmpeg。看起来ffmpeg可执行文件不在matplotlib期望的位置。

我首先尝试将ffmpeg的安装路径(目录)添加到Windows的Path环境变量中。我猜animation.py期望全局可用(就像在Linux下一样)。

如果这样做不起作用,我会检查animation.py中的subprocess.Popen调用,以了解它确切的操作。您可以在matplotlibrc文件中断点或调整verbose.report变量以输出它。那里的第179行是:

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

我正在打印 verbose.report,但它只显示“False”。我该如何获取更多详细信息? - Arthur Dent

0
在Windows上,我必须使用plt.rcParams['animation.ffmpeg_path'] = 'C:\\mypath',路径中的所有双斜杠都要写出来,并且这行代码必须在之前提到。
from matplotlib import animation

而且,mypath = 本地磁盘上ffmpeg.exe的路径。

此外,我还将ffmpeg路径添加到环境变量中。

经过两天的努力和大量建议,我终于解决了保存动画的问题。

感谢大家提供的所有答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接