当前位置: 首页 > 知识库问答 >
问题:

为什么ffmpeg只能记录动画的前100帧?

白宏义
2023-03-14

我正在使用以下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()

但是,当时间达到1.0时,进程停止,但是当时间达到50.0时,进程应该停止。下图显示了进程停止的时间。PyCharm运行控制台
然后我检查movie.mp4并发现当时间达到1.0时视频结束。
也就是说,只有前100帧动画被转换为.mp4文件,所以我很困惑其余的帧都去哪里了?

我试图通过windows cmd运行代码,但得到了相同的结果。
然后取消对#plt.show()行的注释,发现当时间达到50.0时进程停止,动画可以正常显示,但仍然只转换了前100帧。

我现在对这个问题很困惑,不知道怎么解决。感谢您的帮助。:)

共有1个答案

燕禄
2023-03-14

我看起来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
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'
 类似资料:
  • 问题内容: 我正在尝试扩展一些以填充屏幕,但是我很挣扎。我已经解决了这个jsfiddle的问题。 我真正想知道的是,当其父项具有相同的属性并且会扩展时,为什么100%的不会扩展到那个高度(或根本不扩展)? 问题答案: CSS 2.1规范涵盖了该问题: < 百分比> 指定百分比高度。相对于生成的盒子的包含块的高度计算百分比。如果未明确指定包含块的高度(即,它取决于内容的高度),并且该元素的位置不是绝

  • 这个背景图应该顶到最左边去才对,为什么没有过去?图片格式是svg,我在想是不是svg的原因?有无大佬讲解一下原理。 图片本身左边没有空隙,所以不是图片内容的问题。

  • 由于这里有一些很好的答案,我基本上(显然是以有限的方式)理解了Haskell的的目的,并且它的定义是 然而,我不太清楚为什么是这个定义的一部分。据我所知,这就是本身的定义所在,但相关的留档并没有对此做太多说明。 我认为在

  • 我试着在画布里放一幅画。但就是没有出现。我谷歌了一下,看看哪里出了问题。不幸的是,我还是解决不了。这是我的代码 这是css文件

  • 问题内容: 所以我运行代码,它就开始不正常了。我不熟悉pygame。 代码如下: 这张图片并不是我不能发布视频的那个,但它确实是我的代码的作用 问题答案: 问题是由多次调用 . 在应用程序循环结束时更新显示就足够了。 多次调用or原因 忽隐忽现。 删除对的所有呼叫从你的代码,但调用一次 在应用程序循环结束时: 如果在之后更新显示,将显示在短时间内填充了背景色。然后玩家被抽中 ()显示时,播放器位于

  • 我正在尝试在我的Spring Boot应用程序启动之前记录一些东西。下面是一个片段。我正在使用Lombok和Log4J2,并且已经完成了spring-boot-starter-logging排除+添加了spring-boot-starter-log4j2。我想知道如何让它工作,为什么现在的代码不能工作。 更新: 但是,如下所示,使用带有默认日志的Slf4j可以工作,为什么不使用Log4J2呢?(带