use*_*850 5 python animation ffmpeg scatter matplotlib
我对这个问题有一个非常类似的问题
但建议的解决方案对我不起作用.
我使用matplotlib动画模块设置了动画散点图.这在现场显示时工作正常.我想把它保存到avi文件或类似的东西.我为此编写的代码不会出错,但它生成的视频只显示一组空白轴或黑屏.我已经做了几次检查,数据正在运行并且数字更新,它只是没有保存到视频中......
我尝试删除此问题中建议的"animated = True"和"blit = True", 但这并没有解决问题.
我已在下面放置了相关代码,但如果需要可以提供更多代码.任何人都可以建议我应该怎样做才能使这个工作?
def initAnimation(self):
rs, cfgs = next(self.jumpingDataStreamIterator)
#self.scat = self.axAnimation.scatter(rs[0], rs[1], c=cfgs[0], marker='o')
self.scat = self.axAnimation.scatter(rs[0], rs[1], c=cfgs[0], marker='o', animated=True)
return self.scat,
def updateAnimation(self, i):
"""Update the scatter plot."""
rs, cfgs = next(self.jumpingDataStreamIterator)
# Set x and y data...
self.scat.set_offsets(rs[:2,].transpose())
#self.scat = self.axAnimation.scatter(rs[0], rs[1], c=cfgs[0], animated=True)
# Set sizes...
#self.scat._sizes = 300 * abs(data[2])**1.5 + 100
# Set colors..
#self.scat.set_array(cfgs[0])
# We need to return the updated artist for FuncAnimation to draw..
# Note that it expects a sequence of artists, thus the trailing comma.
matplotlib.pyplot.draw()
return self.scat,
def animate2d(self, steps=None, showEvery=50, size = 25):
self.figAnimation, self.axAnimation = matplotlib.pyplot.subplots()
self.axAnimation.set_aspect("equal")
self.axAnimation.axis([-size, size, -size, size])
self.jumpingDataStreamIterator = self.jumpingDataStream(showEvery)
self.univeseAnimation = matplotlib.animation.FuncAnimation(self.figAnimation,
self.updateAnimation, init_func=self.initAnimation,
blit=True)
matplotlib.pyplot.show()
def animate2dVideo(self,fileName=None, steps=10000, showEvery=50, size=25):
self.figAnimation, self.axAnimation = matplotlib.pyplot.subplots()
self.axAnimation.set_aspect("equal")
self.axAnimation.axis([-size, size, -size, size])
self.Writer = matplotlib.animation.writers['ffmpeg']
self.writer = self.Writer(fps=1, metadata=dict(artist='Universe Simulation'))
self.jumpingDataStreamIterator = self.jumpingDataStream(showEvery)
self.universeAnimation = matplotlib.animation.FuncAnimation(self.figAnimation,
self.updateAnimation, scipy.arange(1, 25), init_func=self.initAnimation)
self.universeAnimation.save('C:/universeAnimation.mp4', writer = self.writer)
Run Code Online (Sandbox Code Playgroud)
抱歉耽搁了。我找到了一种解决方法,只需保存大量单独的图像,然后调用 ffmpeg 将它们链接在一起。这并不理想,但可以完成工作。(大班的一部分)
def easyway(self, frames):
##INSERT CODE TO GET xdata and ydata!
for i in range(0, frames):
fileName = "videoName"+"%04d.png" % i
matplotlib.pyplot.scatter(xdata,ydata,c=coldata, marker='*',
s=15.0, edgecolor='none')
matplotlib.pyplot.savefig(self.workingDirectory+'temp/'+fileName, dpi=dpi)
matplotlib.pyplot.close()
##INSERT CODE TO UPDATE xdata and ydata!
self.createVideoFile(fps)#calls FFMpeg to chain together all the pictures
if cleanUp:#removes all the picture files created in the process
print "temporary picture files being removed..."
self.clearDirectory()
print "FINISHED"
def clearDirectory(self,directoryName='temp'):
files = glob.glob(self.workingDirectory+directoryName+"/*")
for f in files:
os.remove(f)
def createVideoFile(self,fps=3):
command="ffmpeg -f image2 -r %s -i %s%s" % (str(fps), self.workingDirectory+'temp/', self.universe.description)
command+="%04d.png"
command+=" -c:v libx264 -r 30 %s.mp4" % (self.workingDirectory+'videos/'+self.universe.description)
print "Running command:"
print command
p = subprocess.Popen(command, shell=True, stdout = subprocess.PIPE, stderr=subprocess.STDOUT)
output = p.communicate()[0]
print "output\n"+"*"*10+"\n"
print output
print "*"*10
print "Video file has been written"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3103 次 |
| 最近记录: |