Я использую matplotlib и ffmpeg для анимации. Я обычно пишу код на удаленном сервере, потому что код работает быстрее; у нас возникли проблемы с анимацией на удаленном сервере. Вот пример кода, который отлично работает на моем локальном Mac, но не работает удаленно.
import matplotlib as mpl
mpl.use('agg')
import matplotlib as mpl
from matplotlib import animation
import pylab
def init():
pylab.plot(pylab.arange(10), [0]*10)
def redraw(frame):
pylab.plot(pylab.arange(10), pylab.arange(10) * frame)
fig = pylab.figure()
ani = animation.FuncAnimation(fig, redraw, frames=10, interval=1000, init_func=init)
ani.save('animation.mp4')
Я получаю нужную анимацию на своем локальном компьютере (macOS Sierra). Когда я запускаю его на удаленном хосте (Debian GNU / Linux 8 (jessie)), я получаю следующее сообщение об ошибке после 5 кадров
Traceback (most recent call last):
File "animation.py", line 14, in <module>
ani.save('animation.mp4')
File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 1200, in save
writer.grab_frame(**savefig_kwargs)
File "/usr/lib/python2.7/contextlib.py", line 35, in __exit__
self.gen.throw(type, value, traceback)
File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 241, in saving
self.finish()
File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 367, in finish
self.cleanup()
File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 405, in cleanup
out, err = self._proc.communicate()
File "/usr/local/lib/python2.7/dist-packages/subprocess32.py", line 724, in communicate
stdout, stderr = self._communicate(input, endtime, timeout)
File "/usr/local/lib/python2.7/dist-packages/subprocess32.py", line 1535, in _communicate
orig_timeout)
File "/usr/local/lib/python2.7/dist-packages/subprocess32.py", line 1591, in _communicate_with_poll
register_and_append(self.stdout, select_POLLIN_POLLPRI)
File "/usr/local/lib/python2.7/dist-packages/subprocess32.py", line 1570, in register_and_append
poller.register(file_obj.fileno(), eventmask)
ValueError: I/O operation on closed file
Моя локальная машина использует matplotlib версии 2.0.0; удаленный компьютер использует matplotlib версии 2.2.2
На моей локальной машине у меня ffmpeg версия 3.2.4
$ ffmpeg -version
ffmpeg version 3.2.4 Copyright (c) 2000-2017 the FFmpeg developers
built with Apple LLVM version 8.0.0 (clang-800.0.42.1)
configuration: --prefix=/usr/local/Cellar/ffmpeg/3.2.4 --enable-shared -
-enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables
--enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --disable-lzma --enable-vda
libavutil 55. 34.101 / 55. 34.101
libavcodec 57. 64.101 / 57. 64.101
libavformat 57. 56.101 / 57. 56.101
libavdevice 57. 1.100 / 57. 1.100
libavfilter 6. 65.100 / 6. 65.100
libavresample 3. 1. 0 / 3. 1. 0
libswscale 4. 2.100 / 4. 2.100
libswresample 2. 3.100 / 2. 3.100
libpostproc 54. 1.100 / 54. 1.100
На удаленном хосте у меня ffmpeg версия 4.0.1
ffmpeg -version
ffmpeg version 4.0.1 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 4.9.2 (Debian 4.9.2-10+deb8u1)
configuration: --prefix=/usr/local
libavutil 56. 14.100 / 56. 14.100
libavcodec 58. 18.100 / 58. 18.100
libavformat 58. 12.100 / 58. 12.100
libavdevice 58. 3.100 / 58. 3.100
libavfilter 7. 16.100 / 7. 16.100
libswscale 5. 1.100 / 5. 1.100
libswresample 3. 1.100 / 3. 1.100
Если я правильно помню, я установил ffmpeg локально через homebrew; У меня есть анаконда дистрибутив питона. На удаленной машине у нас есть версия Python по умолчанию, которая поставляется с Jessie; Я не уверен, как сисадмин установил ffmpeg.
Я ни в коем случае не эксперт по ffmpeg, но у меня, как правило, никогда не возникало проблем с созданием анимации в matplotlib на моей локальной машине, и я действительно хотел бы иметь возможность быстрее снимать видео на удаленной машине. Любая помощь будет оценена!
Редактировать
На удаленной машине анимация работает, если я использую avconv в качестве автора вместо ffmpeg. Я установил avconv локально ..., что привело меня к локальным проблемам с ffmpeg (возможно, из-за обновления общих зависимостей). Однако я удалил ffmpeg и переустановил его с кодеком x264, чтобы включить Анимации в записной книжке ipython (jupyter) - ValueError: операция ввода-вывода для закрытого файла