
私は Linux も Bluetooth スクリプトも初心者です。これまでにわかったことは次のとおりです。
- Bluez はデフォルトの BT スタックです。
- BluezToolsはBluezとより簡単にやりとりするために使用できるユーティリティのセットです
- DBus は、Bluez がハードウェアと直接やり取りする際に接続するインターフェースです。
- PulseAudio は、システム上でオーディオを生成するサブシステムです。
これは理にかなっています。たとえば、Bluetooth ヘッドフォンを持っているとします。ペアリングと信頼が完了したら、BT ヘッドフォンの特定のプロファイルに直接接続できるコマンドを発行できると期待します。
私が考えている技術的な道筋は次のようになります。
- ヘッドホンをオンにします。
- BluezToolsコマンドを発行します。btオーディオ-c
- デバイスが目的のサービスに接続されるまで待ちます
- PulseAudioは新しい出力デバイスを認識するはずです
- 別のコマンドを発行して、オーディオを以前のものから新しい出力オーディオ (BT ヘッドフォン) に変更します。
- シームレスなリスニング体験をお楽しみください。
これはすべて論理的に思えますが、実際の実装はそうではありません。私はその理由を探して、問題をよりよく理解し、修正できるようにしたいと考えています。
実際にはこうなります:
- ヘッドホンをオンにします。
- BluezToolsコマンドを発行します。btオーディオ-c
- デバイスが目的のサービスに接続されるまで待ちます
- PulseAudioは新しい出力デバイスを認識するはずです
- PulseAudio コマンドを発行して、オーディオ プロファイルを電話品質から高忠実度に変更します。
これについてもう少し詳しく説明しましょう。Bluetooth ヘッドセットには 2 つの品質モード (電話と高忠実度) があります。音楽を聴くのに実際に適しているのは 1 つだけです。
BTヘッドフォンは各品質モードをサービスとして公開すると思いますが、これは正しいでしょうか?この仮定は間違っているかもしれませんが、次のようなものを期待しています。
bt-audio -c 高画質プロファイル
または
bt-audio -changeProfile highFidelityProfile
代わりに、Bluez はデバイスへの RAW 接続を処理するだけなので、そこから以下を発行する必要があります。pacmd カードプロファイルを設定する $INDEX a2dp
これは根本的に間違っているように思えます。なぜオーディオ サブシステムで品質管理が行われ、そのために Pulse や ALSA、その他のサウンド サブシステムに異なる実装が必要になるのでしょうか?
何が足りないのでしょうか? Bluez / BluezTools などを使用して特定のプロファイルに直接接続できないのはなぜですか?
答え1
Bluetooth 接続では、単純な有線ヘッドフォンやスピーカーに比べて、遅延が大きくなります。さらに、Bluetooth レシーバーの特性や、ユーザーが動き回ったときの無線信号強度によっても、接続遅延は変化する可能性があります。
アプリケーションと PulseAudio 間のインターフェイスは、「PCM オーディオ データがあります。これを再生してください」という単純なものになることもあります。しかし、より複雑なものになることもあります。たとえば、「PCM オーディオ データがあります。これを再生して、50 ミリ秒ごとにどこまで進んだか教えてください。そうすれば、再生中のビデオ ストリームとのリップシンクが崩れそうであれば、先に進めるように指示できます。また、データのサンプル レートはハードウェアが直接サポートしていないため、再サンプルも行う必要があります」などです。後者の場合、PulseAudio は、オーディオ デバイスからのフィードバックをアプリケーションに提供して、特定の時点でオーディオ データが実際にどこまで再生されたかを正確に判断できる必要があります。
その結果、PulseAudio が Bluetooth オーディオ処理にかなり深く関与するのは当然です。介在するレイヤーが増えるほど、正確なフィードバックを維持せずにデータがバッファリングされる可能性が高くなり、リップシンクが失われることになります。
実際、PulseAudio が存在する前には、Bluetooth オーディオ用の ALSA バックエンドがありましたが、廃止されました。当時の ALSA のインターフェースは主に従来のサウンド カード用に設計されており、Bluetooth のオーディオ遅延が変動する可能性に対処するのが困難だったことが問題だったと思います。
PulseAudio のインターフェースは、さまざまなサウンド デバイスを処理し、ストリームの再生中にそれらの間でオーディオ ストリームを切り替えることさえできるように根本から設計されているため、オーディオ レイテンシのかなり高度な概念も組み込まれているように思われます。
はい、PulseAudio モジュールとしてではなく BlueZ に実装することもできましたが、その場合、BlueZ はアプリケーション用のオーディオ インターフェイスを提供する必要があります。また、PulseAudio はシステム上の「すべての」オーディオを処理する必要があるため (現在再生中のオーディオをスピーカーから Bluetooth に、またはその逆にオンザフライで転送できるようにするため)、いずれにしても何らかの方法で PulseAudio とインターフェイスする必要があります。
答え2
ようやく解決策を見つけたと思います (2 つの Linux Mint システムでテスト済み)。ただし、なぜこれらの手順を正確に実行する必要があるのかはわかりません。
最初のステップ:
- blueman をインストールします:sudo apt-getインストールblueman
- Bluetoothファイルを編集します:sudo ナノ /etc/bluetooth/main.conf最後に次の行を追加します:無効=ヘッドセット
各実行ごとに:
- Bluetoothサービスを再起動します:sudo サービス Bluetooth 再起動
- システムトレイのbluemanからデバイスを開くまたはタイプブルーマンマネージャーターミナル内
- 検索Bluetoothオーディオデバイス用
- デバイスを右クリックして接続しますヘッドセット
- へ移動音システム設定から
- デバイスを一度クリックして選択します
- もう一度ブルーマンマネージャー
- Bluetoothデバイスを右クリックし、オーディオプロファイルを高忠実度再生(A2DPシンク)
いずれかの手順を見逃した場合は、手順 1 に戻ってもう一度試してください。これが機能するかどうかをお知らせください。
編集: Linux Mint 19 では、デフォルトの Bluetooth マネージャーが High Fidelity Playback と完全に連携し、設定は一切必要ありません。
答え3
構成によって異なる場合がありますが、ここでは十分にテストされたコマンドをいくつか紹介します。
デバイスを信頼できるものとして設定する必要があります。これは GUI 経由で実行できます。
sdptool ブラウズターゲットデバイスで利用可能なプロトコルとチャネルに関する多くの詳細情報を提供します。
同時オーディオ出力を使用する場合、Bluetooth a2pオーディオシンクを設定する方が簡単です。設定するには、ツールを参照してください。論文。
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