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
はバッファオブジェクトを渡す必要があるため、機能しません:
TypeError: argument 2 must be string or read-only buffer, not list
だから私の質問は:floatのリストをどのようにバッファオブジェクトに変換できますか?
解決
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)
他のヒント
実際、最も簡単な方法は、 structモジュールを使用することです。 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を返します
所属していません StackOverflow