может модуль волны Python принимать объект StringIO

я пытаюсь использовать волновой модуль для чтения wav файлов в Python.

то, что не типично для моих приложений, - то, что я НЕ использую файл или имя файла для чтения wav файла, но вместо этого у меня есть wav файл в буфере.

И вот то, что я делаю

import StringIO

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

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

но я получаю a 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()

5
задан user368005 16 June 2010 в 08:37
поделиться

2 ответа

попробуйте следующее:

import StringIO

buffer = StringIO.StringIO(wav_buffer)
file = wave.open(buffer, 'r')
2
ответ дан 15 December 2019 в 00:50
поделиться
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 ).

2
ответ дан 15 December 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: