title: How do I properly enable ffmpeg for matplotlib.animation?
body: <p>I have covered a lot of ground on stack so far trying to get ffmpeg going so I can make a timelapse video.</p>
  
  <p>I am on a CentOS 7 machine, running <code>python3.7.0a0</code>.</p>
  
  <pre><code>python3
  &gt;&gt;&gt; import numpy as np
  &gt;&gt;&gt; np.__version__
  '1.12.0'
  &gt;&gt;&gt; import matplotlib as mpl
  &gt;&gt;&gt; mpl.__version__
  '2.0.0'
  &gt;&gt;&gt; import mpl_toolkits.basemap as base
  &gt;&gt;&gt; base.__version__
  '1.0.7'
  </code></pre>
  
  <p>I found <a href="https://gist.github.com/mustafaturan/7053900" rel="noreferrer">this github gist</a> on installing ffmpeg. I used the chromium source, and installed without a <code>prefix</code> option (using the default).</p>
  
  <p>I have confirmed that ffmpeg is installed, although I don't know anything about testing whether it works.</p>
  
  <pre><code>which ffmpeg
  /usr/local/bin/ffmpeg
  
  ffmpeg -version
  ffmpeg version N-83533-gada281d Copyright (c) 2000-2017 the FFmpeg dev elopers
  built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-11
  configuration:
  libavutil      55. 47.100 / 55. 47.100
  libavcodec     57. 80.100 / 57. 80.100
  libavformat    57. 66.102 / 57. 66.102
  libavdevice    57.  2.100 / 57.  2.100
  libavfilter     6. 73.100 /  6. 73.100
  libswscale      4.  3.101 /  4.  3.101
  libswresample   2.  4.100 /  2.  4.100
  </code></pre>
  
  <p>I tried to run a few sample examples I found online:</p>
  
  <p>[1] <a href="http://matplotlib.org/examples/animation/basic_example_writer.html" rel="noreferrer">http://matplotlib.org/examples/animation/basic_example_writer.html</a></p>
  
  <p>[2] <a href="https://stackoverflow.com/a/23098090/3454650">https://stackoverflow.com/a/23098090/3454650</a></p>
  
  <p>Everything works fine up until I try to save the animation file.</p>
  
  <p>[1]</p>
  
  <pre><code> anim.save('basic_animation.mp4', writer = FFwriter, fps=30, extra_args=['-vcodec', 'libx264'])
  </code></pre>
  
  <p>[2]</p>
  
  <pre><code>im_ani.save('im.mp4', writer=writer)
  </code></pre>
  
  <p>I found <a href="https://stackoverflow.com/a/23857984/3454650">here</a> that explictly setting the path to ffmpeg might be necessary so I added this to the top of the test scripts:</p>
  
  <pre><code>plt.rcParams['animation.ffmpeg_path'] = '/usr/local/bin/ffmpeg'
  </code></pre>
  
  <p>I tried a few more tweaks in the code but always get the same response, which I do not know how to begin deciphering:</p>
  
  <pre><code>Traceback (most recent call last):
    File "testanim.py", line 27, in &lt;module&gt;
      writer.grab_frame()
    File "/usr/local/lib/python3.7/contextlib.py", line 100, in __exit__
      self.gen.throw(type, value, traceback)
    File "/usr/local/lib/python3.7/site-packages/matplotlib/animation.py", line 256, in saving
      self.finish()
    File "/usr/local/lib/python3.7/site-packages/matplotlib/animation.py", line 276, in finish
      self.cleanup()
    File "/usr/local/lib/python3.7/site-packages/matplotlib/animation.py", line 311, in cleanup
      out, err = self._proc.communicate()
    File "/usr/local/lib/python3.7/subprocess.py", line 836, in communicate
      stdout, stderr = self._communicate(input, endtime, timeout)
    File "/usr/local/lib/python3.7/subprocess.py", line 1474, in _communicate
      selector.register(self.stdout, selectors.EVENT_READ)
    File "/usr/local/lib/python3.7/selectors.py", line 351, in register
      key = super().register(fileobj, events, data)
    File "/usr/local/lib/python3.7/selectors.py", line 237, in register
      key = SelectorKey(fileobj, self._fileobj_lookup(fileobj), events, data)
    File "/usr/local/lib/python3.7/selectors.py", line 224, in _fileobj_lookup
      return _fileobj_to_fd(fileobj)
    File "/usr/local/lib/python3.7/selectors.py", line 39, in _fileobj_to_fd
      "{!r}".format(fileobj)) from None
  ValueError: Invalid file object: &lt;_io.BufferedReader name=6&gt;
  </code></pre>
  
  <p>Is there something with my configuration that is malformed? I searched google for this error for some time but never found anything relevant to animations / ffmpeg. Any help would be greatly appreciated.</p>
  
  <hr>
  
  <p>UPDATE:</p>
  
  <p>@LordNeckBeard pointed me here: <a href="https://trac.ffmpeg.org/wiki/CompilationGuide/Centos" rel="noreferrer">https://trac.ffmpeg.org/wiki/CompilationGuide/Centos</a></p>
  
  <p>I ran into problems with installing the x264 encoding dependency. Some files in libavcodec/*.c (in the <code>make</code> output) were reporting undefined references to several functions. After a wild goose chase found this: <a href="https://mailman.videolan.org/pipermail/x264-devel/2015-February/010971.html" rel="noreferrer">https://mailman.videolan.org/pipermail/x264-devel/2015-February/010971.html</a></p>
  
  <p>To fix the x264 installation, I simply added some <code>configure</code> flags:</p>
  
  <pre><code>./configure --enable-static --enable-shared --extra-ldflags="-lswresample -llzma"
  </code></pre>
  
  <hr>
  
  <p>UPDATE:</p>
  
  <p>So everything installed fine after fixing the libx264 problems. I went ahead and copied the ffmpeg binary from the <code>ffmpeg_build</code> folder into <code>/usr/local/bin/ffmpeg</code>. </p>
  
  <p>After running the script I was getting problems where ffmpeg could not find the libx264 shared object. I think I will have to recompile everything using different prefixes. My intuition tells me there are old files laying around after I have messed with everything, using some configuration that is broken.</p>
  
  <p>So I decided maybe I should just try to use NUX: <a href="http://linoxide.com/linux-how-to/install-ffmpeg-centos-7/" rel="noreferrer">http://linoxide.com/linux-how-to/install-ffmpeg-centos-7/</a>
  I installed ffmpeg using the new rpm, but to no avail. I still was not able to run ffmpeg because of a missing shared object.</p>
  
  <p>Finally, instead of usiong files copied into my <code>/usr/local/bin</code> folder, I ran ffmpeg directly from the build bin directory. Turns out that this does work properly!</p>
  
  <p>So in essence, if I want to install ffmpeg system wide, I need to manually compile from sources again but using a nonlocal prefix.</p>