开发者

can the python wave module accept StringIO object

i'm trying to use the wave module to read wav files in python.

whats not typical of my applications is that I'm NOT using a file or a filename to read the wav file, but instead i have the wav file in a buffer.

And here's what i'm doing

import StringIO

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

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

but i'm getting a EOFError when i run it...

  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, i开发者_运维技巧n __init__
raise EOFError

i know the StringIO stuff works for creation of wav file and i tried the following and it works

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


try this:

import StringIO

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


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

A StringIO doesn't work like that. It's not a pipe that's connected to itself: when you read(), you don't receive data that you previously passed to write(). (Never mind output() which I'm guessing is a mispaste as there is no such method.)

Instead it acts as a separate read-pipe and write-pipe. The content that read() will return is passed in with the constructor:

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

And any content collected from write() is readable through getvalue().

(I used binary read mode because this is what's happening, though the wave module will silently convert r mode to rb anyway.)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜