2013-08-02 22 views
8

Bir dalga paketinin Animasyonunu oluşturmaya ve film olarak kaydetmeye çalışıyorum. Tasarruf dışında her şey çalışıyor. Lütfen bana neyi yanlış yaptığımı söyler misin? hattına giderken ani.save('MovWave.mp4') o bana söyler: Kaydet Matplotlib Animasyon

writer = writers.list()[0] 
IndexError: list index out of range 

Ben tabii ki googling çalıştı, ama ben bile ne anlama geldiğini bilmiyorum.

UPDATE: Şimdi konsolda ffmpeg'u arayabilirim. Ffmpeg sürüm 0.10.7-6:0.10.7-0jon1~precise yüklü olduğunu söylüyor. Ben kodu güncellenmiş ve programı koştu, ama şimdi aşağıdaki hatayı alıyorum:

Traceback (most recent call last): 
    ani.save('MovWave.mpeg', writer="ffmpeg") 
    writer.grab_frame() 
    dpi=self.dpi) 
    self.canvas.print_figure(*args, **kwargs) 
    self.figure.dpi = origDPI 
    self.dpi_scale_trans.clear().scale(dpi, dpi) 
    self._mtx = np.identity(3) 
    from numpy import eye 
    File "<frozen importlib._bootstrap>", line 1609, in _handle_fromlist 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte 

Güncelleme 2: doctorlove belirttiği gibi piton 3.3 kullanırken Anlaşılan bir hata var. Şimdi yerine python 2.7 kullanmaya çalışıyorum. Şimdi bir mpeg dosyası oluşturur ama oynatılamaz ve sadece ~ 150 kB büyüktür.

Güncelleme 3: Tamam, aynı kodu Win7 makinemde denedim ve aynı zamanda python 3.3'te çalışıyor. Ama aynı problemim var, python 2.7 ile daha önce yaşadım. Oluşturulan mpeg dosyası oynatılamaz ve sadece birkaç yüz kB'dir.

#! coding=utf-8 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
import time 
time.clock() 

def FFT(x,y): 
    X = (x[-1]-x[0])/len(y) 
    f = np.linspace(-2*np.pi/X/2,2*np.pi/X/2,len(y)) 
    F = np.fft.fftshift(np.fft.fft(y))/np.sqrt(len(y)) 
    return(f,F) 

def FUNCTION(k_0,dx,c,t): 
    y = np.exp(1j*k_0*(x-c*t))*np.exp(-((x-c*t)/(2*dx))**2)*(2/np.pi/dx**2)**(1/4) 
    k,F = FFT((x-c*t),y) 
    return(x,y,k,F) 

#Parameter 
N = 1000 
x = np.linspace(0,30,N) 
k_0 = 5 
dx = 1 
c = 1 

l = [k_0,c,dx] 

fig = plt.figure("Moving Wavepackage and it's FFT") 
sub1 = plt.subplot(211) 
sub2 = plt.subplot(212) 
sub2.set_xlim([-10,10]) 
sub1.set_title("Moving Wavepackage and it's FFT") 
sub1.set_ylabel("$Re[\psi(x,t)]$") 
sub1.set_xlabel("$t$") 
sub2.set_ylabel("$Re[\psi(k_x,t)]$") 
sub2.set_xlabel("$k_x$") 


n = 50 
t = np.linspace(0,30,n) 
img = [] 
for i in range(n): 
    x,y,k,F = FUNCTION(k_0,dx,c,t[i]) 

    img.append(plt.plot(x,np.real(y),color="red", axes=plt.subplot(211))) 
    img.append(plt.plot(k,np.real(F),color="red", axes=plt.subplot(212))) 

ani = animation.ArtistAnimation(fig, img, interval=20, blit=True, repeat_delay=0) 

ani.save('MovWave.mpeg', writer="ffmpeg") 

print(time.clock()) 
plt.show() 
+1

tam Traceback sonrası edin:

Matplotlib dokümanlar bir demo içinde mencoder bir çek var. – punchagan

+0

Hiçbir satır ani.save ('MovWave.mp4', yazıcı = "mencoder") – doctorlove

+2

Hmm - yeni sorun: https://github.com/matplotlib/matplotlib/issues/1891 – doctorlove

cevap

10

ffmpeg veya mencoder yüklü mü? Ffmpeg'i yükleme konusunda yardım için this answer'a bakın.

+0

Bu cevabı daha önce görmüştüm, fakat bu pencereler hakkında. Şu an ubuntu kullanıyorum. FFmpeg ana sayfasına gittim ve yaptım: 'git clone git: //source.ffmpeg.org/ffmpeg.git ffmpeg' ama python yolunu nereye ekleyeceğimi bilmiyorum. FFmpeg'in nereye kurulduğunu bilmiyorum. – throwaway17434

+3

Terminalde 'ffmpeg' çalıştırabilir misiniz? Değilse, 'ffmpeg’yi bulun ve' PATH’unuza ekleyin. Ayrıca, yazarınızı "ffmpeg" olarak değiştirin. – punchagan

+0

Ffmpeg'i yükledim ve kodu güncelledim, ancak şimdi farklı bir hata alıyorum. İlk gönderiyi gör. – throwaway17434

2

Metninizde mencoder'dan bahsettiniz, ancak kodu değil.

not_found_msg = """ 
The mencoder command was not found; 
mencoder is used by this script to make an avi file from a set of pngs. 
It is typically not installed by default on linux distros because of 
legal restrictions, but it is widely available. 
""" 

try: 
    subprocess.check_call(['mencoder']) 
except subprocess.CalledProcessError: 
    print "mencoder command was found" 
    pass # mencoder is found, but returns non-zero exit as expected 
    # This is a quick and dirty check; it leaves some spurious output 
    # for the user to puzzle over. 
except OSError: 
    print not_found_msg 
    sys.exit("quitting\n") 
+0

Evet, problemi ararken bazı rastgele şeyler yaptım, ancak 'writer =' mencoder '' dahil hiçbir şey yapmıyor. – throwaway17434