将字节写入wave文件?

时间:2015-10-08 17:18:06

标签: python python-3.x byte wav wave

我在Python中有一些数据要输出到WAV文件。现在我将所有样本生成为short并将它们放入缓冲区。然后每当缓冲区达到一定长度时,我打包数据并将其发送到writeframes(在写入每个样本之间妥协,这很慢,并且在写入之前将整个内容保存在内存中,这很昂贵)。

但它总是抛出TypeError。

output = wave.open(fname, 'wb')
output.setparams((channels, sample_width, sample_rate, 0, 'NONE', 'not compressed'))
# ...generate the data, write to the buffer, then if the buffer is full...
cooked = []
for (ldata, rdata) in rawdata:
    cooked.append(struct.pack('<hh',ldata,rdata)) # Pack it as two signed shorts, little endian
output.writeframes(bytes.join(cooked)) # Write to the wave file

我还尝试了''.join(cooked)bytes(cooked),并从一开始就使cooked成为bytearray,但这些似乎都不起作用。

如上所述

output.writeframes(bytes.join(cooked)) # Write to the wave file
TypeError: descriptor 'join' requires a 'bytes' object but received a 'list'

使用bytes()

output.writeframes(bytes(cooked)) # Write to the wave file
TypeError: 'bytes' object cannot be interpreted as an integer

使cooked成为一个bytearray

cooked.append(struct.pack('<hh',ldata,rdata)) # Pack it as two signed shorts, little endian
TypeError: an integer is required

直接发送cooked

TypeError: memoryview: list object does not have the buffer interface

使用''.join()

output.writeframes(''.join(cooked)) # Write to the wave file
TypeError: sequence item 0: expected str instance, bytes found

这样做的正确方法是什么?我无法弄清楚Python究竟想要什么。

编辑:如果这会影响任何事情,请使用Python 3.4.1。

1 个答案:

答案 0 :(得分:4)

你需要这样做:

button.MacroName = sheet.Name + ".HelloWorld";

方法的第一个参数是output.writeframes(b''.join(cooked)) 。如果正常调用该方法,则会自动传递此参数。但是,如果您通过self调用它,则必须手动传递。由于您传递的是列表而不是Class.method()对象作为第一个参数,因此您得到了第一个TypeError。

为了完整起见,以下是其余的错误:

bytes

output.writeframes(bytes(cooked)) # Write to the wave file TypeError: 'bytes' object cannot be interpreted as an integer 接受一系列整数;而且它们一次只有一个字节。您需要使用按位运算而不是bytes()(例如struct.pack()用于小端16位整数,假设没有大于0xFFFF并且没有计算负数)。

cooked.extend((ldata & 0xFF, ldata >> 8, rdata & 0xFF, rdata >> 8))

同样,cooked.append(struct.pack('<hh',ldata,rdata)) # Pack it as two signed shorts, little endian TypeError: an integer is required 接受一个整数。

bytearray.append()

output.writeframes(cooked) TypeError: memoryview: list object does not have the buffer interface 不是类似字节的对象,因此writeframes()无法接受。{/ p>

list

您不能混合使用文本和二进制字符串。