【发布时间】:2021-11-16 23:44:41
【问题描述】:
我第一次遇到模块结构,我的代码给了我一个错误:“解包需要 1486080 字节的缓冲区” 这是我的代码:
def speed_up(n):
source = wave.open('sound.wav', mode='rb')
dest = wave.open('out.wav', mode='wb')
dest.setparams(source.getparams())
frames_count = source.getnframes()
data = struct.unpack("<" + str(frames_count) + "h", source.readframes(frames_count))
new_data = []
for i in range(0, len(data), n):
new_data.append(data[i])
newframes = struct.pack('<' + str(len(new_data)) + 'h', new_data)
dest.writeframes(newframes)
source.close()
dest.close()
如何确定我应该使用哪种格式?
【问题讨论】:
-
你检查过你传递给
unpack的对象的类型和大小吗? -
@interjay,是的,我检查过了,输入 - 'bytes',大小 - '2972193'。现在我看到了我的错误——frames_count 的值是 743040,并且格式与缓冲区不匹配。我尝试将格式设置为“
-
那个大小对我来说没有意义,因为它不能被 2 整除。你从 unpack 得到的错误表明它不是字节对象的实际大小。
-
对不起,现在我用 'sys.getsizeof(source.readframes(frames_count))' 得到了实际大小,大小是 33 字节。但无论如何我无法意识到,我应该使用哪种格式。
-
getsizeof几乎没有用处。您可以使用len获取数据的实际长度。您需要考虑 wav 文件的样本宽度(指示在struct.unpack中使用的格式,以及通道数(每帧的样本数)。