Python的wave模块是否能够接受StringIO对象?

5

我正在尝试使用wave模块在Python中读取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个回答

2

试试这个:

import StringIO

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

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

StringIO并不像这样工作。它不是连接到自身的管道: 当您调用read()时,您不会收到之前通过write()传递的数据。(不要考虑output(),我猜想这是一个拼写错误,因为没有这样的方法。)

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

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

write()收集的任何内容都可以通过getvalue()读取。

(我使用二进制读取模式,因为这就是发生的情况,尽管wave模块将默默地将r模式转换为rb。)


cStringIO的速度更快,因此我建议使用cStringIO。 - saikishor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接