0

我编写了从适合文件创建动画(电影)的脚本。一个文件大小为 2.8 MB,第一个文件大小为 2.8 MB。文件数为 9000。这是代码

import numpy as np
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import os
import pyfits
import glob
import re



Writer = animation.writers['ffmpeg']
writer = Writer(fps=15, metadata=dict(artist='Me'), bitrate=1800)

global numbers
numbers=re.compile(r'(\d+)')

def numericalSort(value):
    parts = numbers.split(value)
    parts[1::2] = map(int, parts[1::2])
    return parts


image_list=glob.glob('/kalib/*.fits')

image_list= sorted(image_list,key=numericalSort)
print image_list
fig = plt.figure("movie")
img = []

for i in range(0,len(image_list)):

    hdulist = pyfits.open(image_list[i])
    im = hdulist[0].data
    img.append([plt.imshow(im,cmap=plt.cm.Greys_r)])


ani = animation.ArtistAnimation(fig,img, interval=20, blit=True,repeat_delay=0)
ani.save('movie.mp4', writer=writer)

我认为我的问题是当我创建数组 img[]...我有 8 GB RAM 并且当 RAM 已满时我的操作系统终止 python 脚本。

我的问题是:如何读取 9000 个文件并创建动画?是否可以创建一些缓冲区或一些并行处理?

有什么建议吗?

4

2 回答 2

2

我建议您使用ffmpeg. 使用该命令image2pipe,您不必将所有图像加载到 RAM 中,而是一个一个(我认为)加载到管道中。

除此之外,还ffmpeg允许您操作视频(帧率、编解码器、格式等)。

https://ffmpeg.org/ffmpeg.html

于 2015-11-03T09:26:35.483 回答
1

使用 FuncAnimation 而不是 ArtistAnimation 创建动画可能会更好,正如ArtistAnimation 与 FuncAnimation matplotlib 动画 matplotlib.animation FuncAnimation 的内存使用效率更高。您可能还想试验 FuncAnimation 的 save_count 参数,请查看 API 文档以获取示例。

于 2015-11-03T07:55:18.503 回答