6

我正在玩 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

所以我的问题是:如何将我的浮动列表转换为缓冲区对象?

4

3 回答 3

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)
于 2009-08-04T19:01:30.933 回答
2

实际上,最简单的方法是使用struct module。它旨在从 python 对象转换为类似 C 的“本机”对象。

于 2009-08-04T18:49:52.487 回答
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

返回真

于 2009-08-04T18:49:01.613 回答