matplotlib FuncAnimation帧间隔

时间:2014-09-22 16:11:06

标签: matplotlib frame frame-rate

我目前正在尝试使用matplotbib FuncAnimation并尝试一些exmaples。 Everthing运行正常,但是,我通过带有anim.save(...)的ffmpeg制作视频,并且我没有让我的动画更快/更慢地播放。不改变

FuncAnimation(...,interval=x,...)

,也不

anim.save(...,fps=x.)

对视频输出有任何影响。这两者之间有什么区别('frames'/'fps'应该是'interval',不是吗?)?这是我的简化代码:

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

class Ball:

    def __init__(self,initpos,initvel,radius,M):
        self.pos=initpos
        self.vel=initvel
        self.radius=radius
        self.M=M


    def step(self,dt):

        self.pos += self.vel*dt
        self.vel[2] += -9.81*dt*self.M

initpos=np.array([5.0,5.0,10.0])
initvel=np.array([0.0,0.0,0.0])
radius=0.25
M=1


test_ball = Ball(initpos,initvel,radius,M)  
dt=1./10

fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1], projection='3d')

pts = []
pts += ax.plot([], [], [], 'bo', c="blue")

def init():
    for pt in pts:
    pt.set_data([], [])
    pt.set_3d_properties([])
    return pts

def animate(i):
test_ball.step(dt) 
for pt in pts:
    pt.set_data(test_ball.pos[0],test_ball.pos[1])
    pt.set_3d_properties(test_ball.pos[2])
    pt.set_markersize(10)
    return pts 

anim = animation.FuncAnimation(fig, animate,init_func=init,frames=50,interval=1)


mywriter = animation.FFMpegWriter()
anim.save('mymovie.mp4',writer=mywriter,fps=10)
希望,有人可以帮助我。非常感谢。

PS:顺便说一下,我也想知道

  1. init函数的功能是什么,因为代码在没有它的情况下也能完美运行,但它在大多数inet-examples中都有。
  2. 对于ax.plot(...,'o',...)点的标记是什么。半径在哪个单位?

2 个答案:

答案 0 :(得分:1)

这是一个有效的例子。

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.animation as animation
import matplotlib.pyplot as plt
import numpy as np


class Ball:

    def __init__(self, initpos, initvel, radius, M):
        self.pos = initpos
        self.vel = initvel
        self.radius = radius
        self.M = M

    def step(self, dt):

        self.pos += self.vel * dt
        self.vel[2] += -9.81 * dt * self.M

initpos = np.array([5., 5., 10.])
initvel = np.array([0., 0., 0.])
radius = .25
M, dt = 1, .1


test_ball = Ball(initpos, initvel, radius, M)

fig, ax = plt.subplots(subplot_kw=dict(projection='3d'))

pts = ax.plot([], [], [], 'bo', c='blue')


def init():
    for pt in pts:
        pt.set_data([], [])
        pt.set_3d_properties([])
    ax.set_xlim3d(0, 1.5 * initpos[0])
    ax.set_ylim3d(0, 1.5 * initpos[1])
    ax.set_zlim3d(0, 1.5 * initpos[2])
    return pts


def animate(i):
    test_ball.step(dt)
    for pt in pts:
        pt.set_data(test_ball.pos[0], test_ball.pos[1])
        pt.set_3d_properties(test_ball.pos[2])
        pt.set_markersize(10)

    return pts

anim = animation.FuncAnimation(fig, animate, init_func=init, frames=50)
mywriter = animation.FFMpegWriter(fps=10)
anim.save('mymovie.mp4', writer=mywriter)

使用自定义编写器时,您需要在创建编写器时指定每秒帧数。

您可以使用以下命令行检查正确的fps

$ ffprobe mymovie.mp4

答案 1 :(得分:0)

如果要减慢动画速度,可以在animate函数中使用time.sleep()。我也对区间参数有些麻烦。动画的速度应该取决于区间参数,而不是fps。

anim.save(...,fps=x.)

这将决定所保存视频的质量,即视频中帧的渲染速率。