実現したいこと
Pythonでエンディアン変換をできるだけ高速に行いたいです。
現在、pyaudioで音声を再生するプログラムを作成しています。
再生したいデータは、リニアPCM(ビッグエンディアン 16bit)です。
以前はこれをWAVEファイルとして保存したものを再生していましたが、処理に時間がかかってしまい都合が悪く、そのまま再生する方法を検討しています。しかし、元データと再生側(Raspberry Pi)でのバイトオーダが異なるため変換が必要な状況です。
そこで、ビッグエンディアンのバイト列を、16ビット単位でリトルエンディアンに変換する方法を模索しておりますが、より高速に行う方法はないでしょうか。。
Python
1big = b'\x00\x01\x02\x03 ......' # 音声データのためバイト列の長さは不定です 2little = byteSwap(big) # ここの処理を実装したいです 3print(little) 4↓ 5b'\x01\x00\x03\x02 ......' # 16bit単位でエンディアン変換されたバイト列です
欲しい出力は、次のいずれかです。
b'リトルエンディアンに変換されたバイト列: [16単位] or [全部一気に] or [1024バイト単位(?)]'
最終的な目的は、音声を再生することですので、次のような処理を行うことです。
Python
1# これはpyaudioで再生する部分です。 2# どのデータ単位で出力するのがいいかの比較のため上記の3種類試してみたいと考えております。 3stream.write(b'ここに変換したバイト列を入れると再生されます')
試したこと
- numpyのfrombuffer()を利用し、まず16bitずつ配列に格納。その後、要素ごとに取り出し8bitをスワップしてb''.join()によりバイト列としてstream.write()に渡す。
- 1を改良し、frombuffer()の引数でバイトオーダを指定して16bitずつ格納。これをtobytes()を使用してstream.write()に渡す。
コメント
- 色々と試した結果、tobytes()に時間がかかっていると思われます。。
- structモジュールを使用できないでしょか。。
- ndarrayに変換せず、 b'ビッグエンディアン' をそのまま b'リトルエンディアン' にできれば嬉しいです。
何か良い情報をご存知の方、どうぞよろしくお願いいたします。

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/23 09:39