Преобразовать список с плавающей точкой в буфер в Python?
-
22-07-2019 - |
Вопрос
Я играю с 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
хочет, чтобы объект buffer был передан в:
TypeError: argument 2 must be string or read-only buffer, not list
Итак, мой вопрос заключается в следующем:Как я могу преобразовать свой список с плавающей запятой в буферный объект?
Решение
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)
Другие советы
На самом деле, самый простой способ - это использовать структурный модуль.Он предназначен для преобразования объектов python в C-подобные "нативные" объекты.
Подумайте, возможно, вместо этого:
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