Frage

Ich spiele um mit Portaudio und Python.

data = getData()
stream.write( data )

Ich möchte meinen Strom Tondaten spielen, das heißt in Float32 Werte dargestellt. Deshalb verwende ich die folgende Funktion:

def getData():
    data = []
    for i in range( 0, 1024 ):
        data.append( 0.25 * math.sin( math.radians( i ) ) )
    return data

Leider funktioniert das nicht, weil stream.write ein Puffer-Objekt will übergeben werden:

TypeError: argument 2 must be string or read-only buffer, not list

Also meine Frage ist: Wie kann ich meine Liste der Schwimmer in einen Puffer-Objekt konvertieren

War es hilfreich?

Lösung

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)

Andere Tipps

Eigentlich ist der einfachste Weg, um das struct Modul zu verwenden . Es wurde entwickelt, aus Python-Objekte zu C-like "native" Objekte zu konvertieren.

Betrachten wir vielleicht statt:

d = [0.25 * math.sin(math.radians(i)) for i in range(0, 1024)]

Vielleicht haben Sie ein Paket wie Gurke verwenden, um zuerst die Daten serialisiert werden.

import pickle
f1 = open("test.dat", "wb")
pickle.dump(d, f1)
f1.close()

es dann lädt wieder in:

f2 = open("test.dat", "rb")
d2 = pickle.Unpickler(f2).load()
f2.close()


d2 == d

Gibt True zurück,

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top