web-dev-qa-db-ja.com

PulseAudioがBTデバイスへの音質接続を処理するのはなぜですか?

私はLinuxが初めてで、Bluetoothスクリプトも初めてです。私がこれまでに発見したことは次のとおりです。

  1. BluezはデフォルトのBTスタックです。
  2. BluezToolsは、Bluezとより簡単に対話するために使用できるユーティリティのセットです。
  3. DBusは、ハードウェアと直接対話しながらBluezが接続するインターフェイスです。
  4. PulseAudioは、システムでオーディオを生成するサブシステムです。

意味あり。つまり、BlueToothヘッドフォンのセットがあるとしましょう。これは、BTヘッドフォンの特定のプロファイルに直接接続できるコマンドを発行できるようにすることです(すべてペアリングして信頼した後)。

私が考えている技術的なパスは次のようなものです:

  1. ヘッドホンをオンにします。
  2. BluezToolsコマンドを発行しますbt-audio -cなど
  3. デバイスが私が求めているサービスに接続するのを待ちます
  4. これで、PulseAudioは新しい出力デバイスを取得するはずです
  5. 別のコマンドを発行して、オーディオを元のオーディオから新しい出力オーディオ(BTヘッドフォン)に変更します。
  6. シームレスなリスニング体験をお楽しみください。

これはすべて論理的なように見えますが、実際の実装はこれとは異なり、WHYを探しているので、問題をよりよく理解して修正することができます。

これが実際に起こることです:

  1. ヘッドホンをオンにします。
  2. BluezToolsコマンドを発行しますbt-audio -cなど
  3. デバイスが後のサービスに接続するのを待ちます
  4. これで、PulseAudioは新しい出力デバイスを取得するはずです
  5. PulseAudioコマンドを発行して、オーディオプロファイルを電話品質から高音質に変更します。

これについて少し詳しく説明します。ブルートゥースヘッドセットは、2つの品質モード(電話と高忠実度)を提供します。音楽を聴くのに本当に適しているのは1つだけです。

BTヘッドフォンは各品質モードをサービスとして公開することを期待しますが、これは正しいですか?この仮定は間違っている可能性がありますが、私は次のようなものを期待します

bt-audio -c highFidelityProfile

または

bt-audio -changeProfile highFidelityProfile

代わりに、BluezはデバイスへのRAW接続を処理するだけのようで、そこから:pacmd set-card-profile $ INDEX a2dpを発行する必要があります。

これは根本的に間違っているようです。オーディオサブシステムの品質管理がなぜであるため、Pulseやalsa、またはその他のサウンドサブシステムに別の実装が必要なのですか?

何が欠けていますか? Bluez/BluezToolsなどを使用して特定のプロファイルに直接接続できないのはなぜですか?

11
JL.

ブルートゥース接続は、単純な有線ヘッドホンやスピーカーと比較して、かなりの遅延があります。さらに、接続遅延は、Bluetoothレシーバーのプロパティや、ユーザーが動き回るときの無線信号強度によっても異なります。

アプリケーションとPulseAudioの間のインターフェースは、「ここにいくつかのPCMオーディオデータがあります。これを再生してください」と同じくらい簡単にすることができます。しかし、さらに複雑になることもあります。 「これがPCMオーディオデータです。これを再生して、50ミリ秒ごとにどれだけ離れているかを教えてください。そうすれば、ビデオストリームとのリップシンクから外れているように見える場合は、先にスキップするように指示できます。私は遊んでいます。ああ、データにはハードウェアが直接サポートしないサンプルレートがあるので、それもリサンプリングする必要があります。」後者の場合、PulseAudioは、オーディオデバイスからのフィードバックをアプリケーションに提供して、任意の時点でオーディオデータが実際に再生される距離を正しく判断できる必要があります。

その結果、PulseAudioがBluetoothオーディオ処理にかなり深く関与することは理にかなっています。介在するレイヤーが多いほど、正確なフィードバックを維持せずにデータがバッファリングされる可能性が高くなり、リップシンクが失われます。

実際、PulseAudioが存在する前は、Bluetoothオーディオ用のALSAバックエンドがありましたが、廃止されました。問題は、当時のALSAのインターフェースが主に従来のサウンドカード用に設計されていて、Bluetoothの潜在的に変動するオーディオレイテンシーに対処することが困難だったことだと思います。

PulseAudioのインターフェースは、さまざまなサウンドデバイスを処理し、ストリームの再生中にオーディオストリームを切り替えるようにゼロから設計されているため、オーディオレイテンシのかなり高度な概念も組み込まれているようです。

はい、PulseAudioモジュールとしてではなくBlueZに実装されている可能性があります。しかし、その後、BlueZはアプリケーション用のオーディオインターフェイスを提示する必要がありました。また、PulseAudioはシステム上の「すべての」オーディオを処理する必要があるため(現在再生中のオーディオをスピーカーからBluetoothに、またはその逆にオンザフライで転送できるようにするため)、PulseAudioとインターフェイスする必要があります。とにかくどういうわけか。

3
telcoM

これらの正確な手順に従う必要がある理由はわかりませんが、最終的に解決策を見つけたと思います(2つのLinux Mintシステムでテスト済み)。

最初のステップ:

  1. Bluemanをインストールします:Sudo apt-get install blueman
  2. Bluetoothファイルを編集します:Sudo nano /etc/bluetooth/main.confそして最後にこの行を追加します:Disable = Headset

実行ごとに:

  1. Bluetoothサービスを再起動します:SudoサービスのBluetooth再起動
  2. システムトレイでbluemanからデバイスを開くまたはタイプblueman-managerターミナルで
  3. 検索 Bluetoothオーディオデバイス用
  4. デバイスを右クリックして、ヘッドセットとして接続します
  5. システム設定からsoundに移動します
  6. デバイスを1回クリックして選択します
  7. もう一度blueman-managerに移動します
  8. Bluetoothデバイスを右クリックし、オーディオプロファイルを高忠実度再生(A2DPシンク)に設定します。

手順のいずれかを逃した場合は、手順1に進み、再試行してください。これが機能するかどうか教えてください。

編集:Linux Mint 19では、デフォルトのBluetoothマネージャーが高忠実度再生で完全に機能します。構成はまったく必要ありません!!

2
Aditya Pal

構成はさまざまですが、十分にテストされたコマンドをいくつか示します。

デバイスを信頼できるものとして設定する必要があります。それはGUIを介して行うことができます。

sdptoolブラウズターゲットデバイスで使用可能なプロトコルとチャネルに関する多くの詳細が表示されます。

同時オーディオ出力を使用する場合は、Bluetooth a2pオーディオシンクを設定する方が簡単です。セットアップするには、ツールpaprefsを参照してください。

Sudo apt install bluetooth 
Sudo apt install bluez bluez-tools
Sudo apt install rfkill rfcomm

デバイスを起動します。とにかくhci0である必要があります。

Sudo hciconfig hci0 up

リモートデバイスの一覧表示:

Sudo rfkill list

Bluetoothネットワークを一覧表示します。

hcitool scan

利用可能なプロトコルを閲覧:

sdptool browse 43:23:00:02:23:A7

デバイスを接続します。

Sudo rfcomm connect hci0 43:23:00:02:23:A7

ファイルを送信:

Sudo bt-obex -p 43:23:00:02:23:A7 ~/images/tof.png

ファイルを受け取る:

Sudo bt-obex -s /

チャネル(ここではチャネル19)でデータをスキャン/待機し、ホームフォルダー内のdumpというファイルにデータを書き込みます。

Sudo apt install bluez-hcidump

hcidump -i hci0 -O 19 -w ~/dump

代替:ペアリングに役立つ場合があります:

Sudo apt install bluetoothctl

bluetoothctl
power on
connect 43:23:00:02:23:A7
trust 43:23:00:02:23:A7
info 43:23:00:02:23:A7

[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# discoverable on
[bluetooth]# pairable on
[bluetooth]# scan on
[bluetooth]# pair 43:23:00:02:23:A7
[agent]PIN code: ####
[bluetooth]# trust 43:23:00:02:23:A7
[bluetooth]# connect 43:23:00:02:23:A7
[bluetooth]# info 43:23:00:02:23:A7
0
NVRM