我目前正在尝试使用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:顺便说一下,我也想知道
答案 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.)
这将决定所保存视频的质量,即视频中帧的渲染速率。