模块结构需要啥格式?
Posted
技术标签:
【中文标题】模块结构需要啥格式?【英文标题】:What format does the module Struct require?模块结构需要什么格式? 【发布时间】: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
中使用的格式,以及通道数(每帧的样本数)。
【参考方案1】:
您的代码中的问题是您为struct.unpack
提供了错误的字节数。这是因为您使用了wave
模块:wave 文件中的每一帧都有getnchannels()
样本,因此当调用readframes(n)
时,您将返回n * getnchannels()
样本,这是您必须通过的数字到struct.unpack
。
为了使您的代码更加健壮,您还需要查看getsampwidth()
并使用适当的格式字符,但绝大多数波形文件都是 16 位的。
在 cmets 中,您还提到添加 print(len(source.readframes(frames_count)))
后代码不起作用。您没有显示完整的代码,但我认为这是因为您调用了两次readframes
而没有调用rewind
,所以第二次调用没有更多数据可以返回。如果要在多行中使用结果,最好将结果存储在变量中。
【讨论】:
以上是关于模块结构需要啥格式?的主要内容,如果未能解决你的问题,请参考以下文章