到目前为止,我已经覆盖了很多筹码,试图让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。我使用了铬源,并在没有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路径的here可能是必要的,所以我将其添加到测试脚本的顶部:
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。
最后,我没有将usiong文件复制到我的/usr/local/bin
文件夹中,而是直接从build bin目录运行ffmpeg。事实证明这确实有效!
所以从本质上讲,如果我想在系统范围内安装ffmpeg,我需要再次从源代码手动编译,但使用非本地前缀。
答案 0 :(得分:2)
我在您提供的输出中看不到ffmpeg
具体信息;但是您尝试使用libx264,但是您的ffmpeg配置缺少--enable-gpl --enable-libx264
,这是使用此编码器启用编码所必需的。对于支持libx264的Linux,macOS或Windows,您可以download ffmpeg
二进制文件,然后将脚本指向它。
或者,compile ffmpeg
使用上面提到的配置选项。
答案 1 :(得分:1)
我在使用Anaconda时遇到了同样的问题。运行arr.push(val.id);
表示它正在Anaconda路径中使用which ffmpeg
而不是系统的二进制文件。我通过添加
ffmpeg
plt.rcParams['animation.ffmpeg_path'] = '/usr/bin/ffmpeg'
导入之后立即
答案 2 :(得分:0)
我有一个类似的错误,我在this matplotlib GitHub Issue的注释中找到了解决方案:
我的代码是
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
(相同的参数)来解决了这个问题。