【问题标题】:How do I properly enable ffmpeg for matplotlib.animation?如何为 matplotlib.animation 正确启用 ffmpeg?
【发布时间】:2017-07-26 21:01:33
【问题描述】:

到目前为止,我已经在堆栈上覆盖了很多基础,试图让 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 时发现了 this github gist。我使用了 chromium 源,并且安装时没有 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)

我发现here 可能需要明确设置 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 文件夹中,而是直接从 build bin 目录运行 ffmpeg。事实证明这确实可以正常工作!

所以本质上,如果我想在系统范围内安装 ffmpeg,我需要再次从源代码手动编译,但使用非本地前缀。

【问题讨论】:

  • 我在您提供的输出中没有看到 ffmpeg 特定信息;但是,您尝试使用 libx264,但您的 ffmpeg 配置缺少 --enable-gpl --enable-libx264,这是启用此编码器编码所必需的。您可以 download 一个支持 libx264 的 ffmpeg 二进制文件,然后将您的脚本指向它。
  • 我很困惑,以及为什么输出与 ffmpeg 的任何关系如此脱节。但是,非常感谢您提供二进制文件的链接。我只是尝试链接到它,它确实有效!明天我将尝试使用您提到的标志重新编译 ffmpeg,如果它们失败/成功,请在此处报告。感谢您的帮助!

标签: python animation matplotlib ffmpeg


【解决方案1】:

我在使用 Anaconda 时遇到了同样的问题。运行 which ffmpeg 表明它在 Anaconda 路径中使用 ffmpeg 而不是系统的二进制文件。我通过添加解决了这个问题

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

在我的matplotlib 导入之后立即。

【讨论】:

  • 你知道为什么 Anaconda ffmpeg 不应该工作吗?
【解决方案2】:

我在您提供的输出中没有看到 ffmpeg 特定信息;但是,您尝试使用 libx264,但您的 ffmpeg 配置缺少 --enable-gpl --enable-libx264,这是启用此编码器编码所必需的。您可以为支持 libx264 的 Linux、macOS 或 Windows 提供 download ffmpeg 二进制文件,然后将您的脚本指向它。

或者,compile ffmpeg 使用上述配置选项。

【讨论】:

  • 所以我今天尝试重新编译 ffmpeg 但遇到了一系列新问题,并且这样做破坏了我下载的二进制文件(我将重新下载它以查看它是否再次工作)。无论如何,我无法在我的系统上安装 x264。我没有它的 repo,当我尝试从 git 源代码编译时,我在 libavcodec 下的源代码中得到了一系列未定义的引用错误。当我找到完整的解决方案时会更新......希望
  • @spanishgum 只需下载它的二进制文件,而不是编译。请参阅答案中的链接。
  • 啊我忘了回到这个!二进制文件对我有用,谢谢。在弄清楚如何编译所有内容后,我实际上又花了几天时间。很复杂,但是在这个过程中我对支持的库有所了解。当我只添加几帧时,mpl 动画库有非常奇怪的副作用,我一直没有弄清楚。但是当我制作几百帧的视频时效果很好。关于视频编码还有很多需要学习的地方。无论如何,再次感谢!
【解决方案3】:

我遇到了类似的错误,在this matplotlib GitHub Issue的cmet中找到了解决办法:

我的代码是

WriterClass = animation.writers['ffmpeg']
writer = WriterClass(fps=10, metadata=dict(artist='bww'), bitrate=1800)
anim.save('../../data/media/' + name + '.mp4', writer=writer)

(这里的anim 只是带​​有一些设置的animation.FuncAnimation(...)

我通过使用writer = animation.FFMpegFileWriter(...) 而不是WriterClass(相同的参数)来修复它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 2015-05-11
    • 1970-01-01
    相关资源
    最近更新 更多