2010-06-16 4 views
2

J'essaie d'utiliser le module wave pour lire les fichiers wav en python. Ce qui n'est pas typique de mes applications est que je suis PAS en utilisant un fichier ou un nom de fichier pour lire le fichier wav, mais à la place j'ai le fichier wav dans un tampon.le module d'onde python peut-il accepter l'objet StringIO

Et voici ce que je fais

import StringIO 

buffer = StringIO.StringIO() 
buffer.output(wav_buffer) 

file = wave.open(buffer, 'r') 

mais je reçois un EOFError quand je le lance ...

File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/wave.py", line 493, in open 
return Wave_read(f) 
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/wave.py", line 163, in __init__ 
self.initfp(f) 
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/wave.py", line 128, in initfp 
self._file = Chunk(file, bigendian = 0) 
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/chunk.py", line 63, in __init__ 
raise EOFError 

Je sais que les choses StringIO fonctionne pour la création de fichier wav et j'ai essayé ce qui suit et cela fonctionne

import StringIO 


buffer = StringIO.StringIO() 
audio_out = wave.open(buffer, 'w') 
audio_out.setframerate(m.getRate()) 
audio_out.setsampwidth(2) 
audio_out.setcomptype('NONE', 'not compressed') 
audio_out.setnchannels(1) 

audio_out.writeframes(raw_audio) 
audio_out.close() 
buffer.flush() 

# these lines do not work... 
# buffer.output(wav_buffer) 
# file = wave.open(buffer, 'r') 

# this file plays out fine in VLC 
file = open(FILE_NAME + ".wav", 'w') 
file.write(buffer.getvalue()) 
file.close() 
buffer.close() 

Répondre

1

essayez ceci:

import StringIO 

buffer = StringIO.StringIO(wav_buffer) 
file = wave.open(buffer, 'r') 
0
buffer = StringIO.StringIO() 
buffer.output(wav_buffer) 

Un StringIO ne fonctionne pas comme ça. Ce n'est pas un canal qui est connecté à lui-même: lorsque vous read(), vous ne recevez pas les données que vous avez précédemment transmises à write(). (Ne vous inquiétez pas output() que je devine est un mauvais goût car il n'y a pas une telle méthode.)

À la place, il agit comme un tuyau de lecture et d'écriture séparé. Le contenu que read() sera de retour est passé avec le constructeur:

buffer = StringIO.StringIO(wav_buffer) 
file = wave.open(buffer, 'rb') 

Et tout contenu collecté à partir write() est lisible par getvalue().

(j'ai utilisé le mode de lecture binaire parce que c'est ce qui se passe, bien que le module wave silencieusement convertir le mode r à rb de toute façon.)