Преобразовать список с плавающей точкой в ​​буфер в Python? - PullRequest
5 голосов
/ 04 августа 2009

Я играю с 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 ]

8 голосов
/ 04 августа 2009
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)
2 голосов
/ 04 августа 2009

На самом деле, самый простой способ - это использовать struct module . Он предназначен для преобразования из объектов Python в C-подобные "нативные" объекты.

0 голосов
/ 04 августа 2009

Рассмотрим, возможно, вместо этого:

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

...