python wave模块可以接受StringIO对象

时间:2010-06-16 08:37:12

标签: python audio wave

我正在尝试使用wave模块来读取python中的wav文件。

我的应用程序不典型的是我 NOT 使用文件或文件名来读取wav文件,而是我将wav文件放在缓冲区中。

这就是我正在做的事情

import StringIO

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

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

但是当我运行它时我得到EOFError ...

  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

我知道StringIO内容适用于创建wav文件,我尝试了以下内容并且可以正常工作

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()

2 个答案:

答案 0 :(得分:2)

试试这个:

import StringIO

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

答案 1 :(得分:2)

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

StringIO不能那样工作。它不是与自身连接的管道:当您read()时,您不会收到先前传递给write()的数据。 (不要介意output(),因为没有这样的方法,我猜是错误的。{/ p>

相反,它充当单独的读取管道和写入管道。 read()将返回的内容将使用构造函数传递:

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

write()收集的所有内容均可通过getvalue()阅读。

(我使用二进制读取模式,因为这是正在发生的事情,尽管wave模块无论如何都会将r模式静默转换为rb。)