如何将浮点数列表转换为Python中的缓冲区?

6 投票
3 回答
14136 浏览
提问于 2025-04-15 13:22

我正在尝试使用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)

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答