如何将浮点数列表转换为Python中的缓冲区?
我正在尝试使用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
所以我想问的是:我该如何把我的浮点数列表转换成一个缓冲区对象呢?
3 个回答
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
2
其实,最简单的方法就是使用 struct模块。这个模块的设计目的是把Python中的对象转换成类似C语言的“原生”对象。
9
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)
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。