alsaloopとbluez-alsaは不安定です。

alsaloopとbluez-alsaは不安定です。

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再生されます。

おすすめ記事