Почему ffmpeg может записывать только первые 100 кадров анимации? - PullRequest
2 голосов
/ 08 февраля 2020

Я использую следующий код Python для создания анимации и хочу сохранить его как видео через FFmpeg (в PyCharm ):

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.animation import FFMpegWriter

def func():
    for j in range(1, len(t)):
        time = j * 0.01
        print('time:{:2}'.format(time))
        yield time

def animate(data):
    time = data
    ax2.plot(time, time, **{'marker':'o'})
    ax2.set_title('t = {:.2}'.format(time))
    return  ax2

def init():
    ax2.plot(0, 0)
    return ax2

dt = 0.01
t = np.arange(0, 50, dt)

fig2 = plt.figure()
ax2 = fig2.add_subplot(111, autoscale_on=True)
ax2.grid()

ani = animation.FuncAnimation(fig2, animate, func, interval=dt*1000, blit=False, init_func=init, repeat=False)

plt.rcParams['animation.ffmpeg_path'] = 'C:\Program Files\\ffmpeg\\bin\\ffmpeg.exe'
writer = FFMpegWriter(fps=15, metadata=dict(artist='Me'), bitrate=1800)
ani.save("movie.mp4", writer=writer)

#plt.show()

Но когда time достигает 1.0, процесс остановлен, но он должен остановиться, когда time достигает 50.0. На следующем рисунке показано, когда процесс остановился. PyCharm Запустить консоль
Затем я проверяю movie.mp4 и нахожу, что видео заканчивается, когда time достигает 1,0.
То есть только первые 100 кадры анимации были преобразованы в файл .mp4, так что я был очень смущен, куда делись остальные кадры?

Я попытался запустить код через windows cmd, но получил тот же результат.
Затем я раскомментировал строку #plt.show() и обнаружил, что процесс остановился, когда time достигает 50,0, и анимация могла отображаться правильно, но все же только первые 100 кадров были преобразованы.

Сейчас я очень озадачен этой проблемой и не знаю, как ее решить. Ценим за вашу помощь .:)

1 Ответ

2 голосов
/ 09 февраля 2020

Я выгляжу как FuncAnimation в настоящее время не документировано:

В animation.py, в классе FuncAnimation(TimedAnimation): ...

Есть строка кода:

    if self.save_count is None:
        # If we're passed in and using the default, set save_count to 100.
        self.save_count = 100

Вот откуда берутся 100 фреймы.

Согласно документации, save_count - это количество фреймов в кэше:

save_count: int, необязательный Количество значений из кадров для кэширования.

Это либо ошибка документации, либо ошибка реализации в animation.py.

Установка save_count в 5000 записей 5000 кадров:

ani = animation.FuncAnimation(fig2, animate, func, save_count=5000, interval=dt*1000, blit=False, init_func=init, repeat=False)

  • Обратите внимание, что в вашем коде также отсутствует \: 'C:\\Program Files\\ffmpeg\\bin\\ffmpeg.exe'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...