如何为matplotlib.animation正确启用ffmpeg?


问题内容

到目前为止,我已经在堆栈上做了很多介绍,试图使ffmpeg正常运行,以便制作延时摄影视频。

我在运行的CentOS 7机器上python3.7.0a0

python3
>>> import numpy as np
>>> np.__version__
'1.12.0'
>>> import matplotlib as mpl
>>> mpl.__version__
'2.0.0'
>>> import mpl_toolkits.basemap as base
>>> base.__version__
'1.0.7'

我在安装ffmpeg时发现了这个github要点。我使用了铬源,并且安装时没有prefix选项(使用默认值)。

我已经确认安装了ffmpeg,尽管我对测试它是否有效一无所知。

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

我尝试运行一些在网上找到的示例示例:

[1]
http://matplotlib.org/examples/animation/basic_example_writer.html

[2]
https://stackoverflow.com/a/23098090/3454650

一切正常,直到我尝试保存动画文件。

[1]

 anim.save('basic_animation.mp4', writer = FFwriter, fps=30, extra_args=['-vcodec', 'libx264'])

[2]

im_ani.save('im.mp4', writer=writer)

我在这里发现可能有必要明确设置ffmpeg的路径,因此我将其添加到了测试脚本的顶部:

plt.rcParams['animation.ffmpeg_path'] = '/usr/local/bin/ffmpeg'

我在代码中尝试了一些其他调整,但始终得到相同的响应,但我不知道如何开始解密:

Traceback (most recent call last):
  File "testanim.py", line 27, in <module>
    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: <_io.BufferedReader name=6>

我的配置是否存在格式错误的内容?我搜索了一段时间的这个错误的谷歌,但没有找到任何有关动画/ ffmpeg的。任何帮助将不胜感激。


更新:

@LordNeckBeard在这里指出了我:https
://trac.ffmpeg.org/wiki/CompilationGuide/Centos

我在安装x264编码依赖项时遇到问题。libavcodec /
*。c中的某些文件(在make输出中)报告了对几个函数的未定义引用。在追赶大雁之后发现了这个:https
:
//mailman.videolan.org/pipermail/x264-devel/2015-February/010971.html

要修复x264安装,我仅添加了一些configure标志:

./configure --enable-static --enable-shared --extra-ldflags="-lswresample -llzma"

更新:

因此,解决了libx264问题后,一切都安装正确。我继续将ffmpeg二进制文件从ffmpeg_build文件夹复制到中/usr/local/bin/ffmpeg

运行脚本后,我遇到了ffmpeg找不到libx264共享库的问题。我想我将不得不使用不同的前缀重新编译所有内容。我的直觉告诉我,在使用混乱的某些配置弄乱了所有内容之后,到处都是旧文件。

因此,我决定也许我应该尝试使用NUX:http ://linoxide.com/linux-how-to/install-ffmpeg-centos-7/
我使用新的rpm安装了ffmpeg,但无济于事。由于缺少共享对象,我仍然无法运行ffmpeg。

最后,/usr/local/bin我没有直接将usiong文件复制到我的文件夹中,而是直接从build
bin目录中运行ffmpeg。原来,这确实可以正常工作!

因此,从本质上讲,如果我想在整个系统上安装ffmpeg,则需要再次使用非本地前缀从源代码进行手动编译。


问题答案:

ffmpeg在您提供的输出中看不到任何具体信息;但是,您尝试使用libx264,但是缺少ffmpeg配置,而该ffmpeg配置是--enable- gpl --enable- libx264启用此编码器编码所必需的。您可以下载ffmpeg不支持libx264的Linux,macOS或Windows二进制文件,然后将脚本指向该二进制文件。

或者,使用上述配置选项进行编译ffmpeg