Анимационный фильм 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'
ничего не сделали для меня. Надеюсь, это поможет!