Python的wave模块可以接受StringIO对象吗

5 投票
2 回答
2642 浏览
提问于 2025-04-16 00:02

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

我这个应用程序有点特别,因为我不是通过文件或文件名来读取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
buffer = StringIO.StringIO()
buffer.output(wav_buffer)

StringIO 不是那种可以自我连接的管道。当你用 read() 方法读取时,你不会得到之前用 write() 方法写入的数据。(别提 output() 了,我猜那是个错误,因为没有这个方法。)

实际上,它就像是两个独立的管道,一个用于读取,一个用于写入。通过构造函数传入的内容,read() 方法会返回这些内容:

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

而通过 getvalue() 方法可以读取到用 write() 方法收集到的任何内容。

我使用了二进制读取模式,因为实际上就是这样,尽管 wave 模块会默默地把 r 模式转换成 rb 模式。

2

试试这个:

import StringIO

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

撰写回答