Анимационный фильм matplotlib: качество фильма со временем уменьшается

Я пытаюсь создать фильм с функцией animation.FuncAnimation в matplotlib. Фильм отлично выглядит в интерактивном режиме, но когда я сохраняю его с помощью команды

anim2.save('somefilm.mp4',codec='mpeg4', fps=15)

Он начинается отлично, но затем становится размытым (оба используют QuickTime и vlc, поэтому я решил, что это фильм, а не плеер).

Я играл с блинтом, так как думал, что это может быть факт, что холст не был перерисован, но безрезультатно. Увеличение битрейта также не помогает.

Настройка dpi=500 несколько улучшает качество фильма, но затем он застревает многократно, что затрудняет просмотр.

Мне просто интересно, можно ли это сделать, или я чего-то не хватает?

Ответ 1

Чтобы разобраться в этой проблеме, важно понять, что видеофайлы обычно сжимаются с высокой степенью сжатия, тогда как интерактивный дисплей не сжимается. Обычные сжатия фильмов часто очень плохи с графиками, и это вопрос параметров сжатия.

Есть четыре вещи, которые вы можете сделать:

  • установите разрешение изображения (на dpi), но это может фактически сделать вывод визуально более слабым, так как проблема обычно не в отсутствии пикселей

  • установить битрейт изображения (на bitrate); чем выше ваш битрейт, тем лучше будет ваш фильм. Одна возможность - установить bitrate=-1 и matplotlib выбрать лучший биттрейт

  • измените кодек (например, на codec="libx264")

  • дают дополнительные аргументы кодеку (например, extra_args=['-pix_fmt', 'yuv420p'])

К сожалению, эти параметры действительно зависят от видеокодека, который является сторонней программой (обычно ffmpeg), предполагаемого использования вашего видео и вашей платформы. Я хотел бы начать с добавления kwarg bitrate=-1, чтобы узнать, улучшает ли он что-то.

Если вы не можете заставить его работать, добавьте полный (но как можно более простой пример), как создать плохой файл. Тогда его легче отлаживать!

Ответ 2

У меня была такая же проблема при анимации ~ 3500 кадров некоторых подповерхностных векторов потока воды по базовой карте и, наконец, исправлена ​​проблема. Я пытался установить биттрейт в объявлении anim.save, но по-прежнему получал такую ​​же размытость позже в анимации. Мне нужно было установить биттрейт при определении записи:

plt.rcParams['animation.ffmpeg_path']='C:/ffmpeg/bin/ffmpeg.exe'
writer=animation.FFMpegWriter(bitrate=500)
anim.save('T:/baysestuaries/USERS/TSansom/Tiltmeters/testdeployment/tilt2.mp4',
          writer=writer,fps=8)

Если я установил битрейт на что-нибудь меньшее, чем 500, анимация все равно будет размыта. bitrate=-1 и codec='libx264' ничего не сделали для меня. Надеюсь, это поможет!