
i2s(通常のdmicドライバを使用)を介してサウンド入力があり、bluez5を使用してBluetoothスピーカーに接続するラズベリーパイ0 wがあります。
接続されたBluetoothデバイスをalsa PCMとして使用できるようにbluez-alsaを設定しました。これは機能し、aplayを使用してファイルを再生できます。
また、arecordを使用して入力を録音することもできます。
私の現在の要件は次のとおりです。
- 連続i2s入力を記録し、Bluetooth alsa出力にパイプします。
- 遅延時間はできるだけ短くする必要があります。
- 音質が良いはずです。
i2s入力のサンプリングレートは96khzと32ビットですが、ほとんどのBluetoothスピーカーは最大48khzと16ビットを処理できます。
私はalsaloopを試み、arecord/aplayの方法を結合しました。
alsaloopの場合は、次のコマンドを使用しました。alsaloop -C i2s-input -P "bluealsa:DEV=XX" -c 2 -r96000 -fS32_LE -t 20000
時間/バッファ/期間パラメータを使用すると、遅延をかなり低い値に設定できますが、非常に不安定です。しばらくすると、バッファオーバーフローとアンダーランが同時に発生し、音が異常になり始めるか完全に失敗します。
arecordとaplayの場合は、次のことを試しました。arecord -D i2s-device -c2 -r96000 -fS32_LE -traw | aplay -D "bluealsa:DEV=XX" -c2 -r96000 -fS32_LE -traw
うまく動作しますが、遅延時間はかなり長く、CPU負荷はalsaloopよりはるかに高いです。しかし、断続的に音がするxrunも頻繁に発生します。
この設定を改善するための提案はありますか?バッファ/期間値は正確にどのように最適に設定する必要がありますか?
答え1
いくつかのテストの後に解決策を見つけました:sox
alsaloopまたはarecord / aplayを使用する代わりにsoxを使用して単純なパイプラインを設定しました。
mkfifo /tmp/pipe
rec -b 32 -r 96000 --endian little -t raw -e signed-integer /tmp/pipe &
sox -b 32 -r 96000 --endian little -t raw -e signed-integer /tmp/pipe -t raw -e signed-integer -p rate 48000 | AUDIODEV="bluealsa:DEV=XX:XX:XX:XX:XX:XX" play -b 32 -r 96000 --endian little -t raw -e signed-integer -p &
その後、名前付きパイプが作成され、/tmp/pipe
入力rec
で埋められ、
sox
オーディオデータをリサンプリングしてからplay
再生されます。