Преобразовать список с плавающей точкой в буфер в Python?

StackOverflow https://stackoverflow.com/questions/1229202

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top