我正在玩PortAudio和Python。
data = getData()
stream.write( data )
我希望我的流播放声音数据,以Float32值表示。因此我使用以下功能:
def getData():
data = []
for i in range( 0, 1024 ):
data.append( 0.25 * math.sin( math.radians( i ) ) )
return data
不幸的是,这不起作用,因为stream.write
想要传入缓冲区对象:
TypeError: argument 2 must be string or read-only buffer, not list
所以我的问题是:如何将我的浮动列表转换为缓冲区对象?
答案 0 :(得分:8)
import struct
def getData():
data = []
for i in range( 0, 1024 ):
data.append( 0.25 * math.sin( math.radians( i ) ) )
return struct.pack('f'*len(data), *data)
答案 1 :(得分:2)
实际上,最简单的方法是使用struct module。它旨在从python对象转换为类似C的“本机”对象。
答案 2 :(得分:0)
或许考虑一下:
d = [0.25 * math.sin(math.radians(i)) for i in range(0, 1024)]
也许您必须首先使用像pickle这样的包来序列化数据。
import pickle
f1 = open("test.dat", "wb")
pickle.dump(d, f1)
f1.close()
然后将其重新载入:
f2 = open("test.dat", "rb")
d2 = pickle.Unpickler(f2).load()
f2.close()
d2 == d
返回True