私はLinuxが初めてで、Bluetoothスクリプトも初めてです。私がこれまでに発見したことは次のとおりです。
意味あり。つまり、BlueToothヘッドフォンのセットがあるとしましょう。これは、BTヘッドフォンの特定のプロファイルに直接接続できるコマンドを発行できるようにすることです(すべてペアリングして信頼した後)。
私が考えている技術的なパスは次のようなものです:
これはすべて論理的なように見えますが、実際の実装はこれとは異なり、WHYを探しているので、問題をよりよく理解して修正することができます。
これが実際に起こることです:
これについて少し詳しく説明します。ブルートゥースヘッドセットは、2つの品質モード(電話と高忠実度)を提供します。音楽を聴くのに本当に適しているのは1つだけです。
BTヘッドフォンは各品質モードをサービスとして公開することを期待しますが、これは正しいですか?この仮定は間違っている可能性がありますが、私は次のようなものを期待します
bt-audio -c highFidelityProfile
または
bt-audio -changeProfile highFidelityProfile
代わりに、BluezはデバイスへのRAW接続を処理するだけのようで、そこから:pacmd set-card-profile $ INDEX a2dpを発行する必要があります。
これは根本的に間違っているようです。オーディオサブシステムの品質管理がなぜであるため、Pulseやalsa、またはその他のサウンドサブシステムに別の実装が必要なのですか?
何が欠けていますか? Bluez/BluezToolsなどを使用して特定のプロファイルに直接接続できないのはなぜですか?
ブルートゥース接続は、単純な有線ヘッドホンやスピーカーと比較して、かなりの遅延があります。さらに、接続遅延は、Bluetoothレシーバーのプロパティや、ユーザーが動き回るときの無線信号強度によっても異なります。
アプリケーションとPulseAudioの間のインターフェースは、「ここにいくつかのPCMオーディオデータがあります。これを再生してください」と同じくらい簡単にすることができます。しかし、さらに複雑になることもあります。 「これがPCMオーディオデータです。これを再生して、50ミリ秒ごとにどれだけ離れているかを教えてください。そうすれば、ビデオストリームとのリップシンクから外れているように見える場合は、先にスキップするように指示できます。私は遊んでいます。ああ、データにはハードウェアが直接サポートしないサンプルレートがあるので、それもリサンプリングする必要があります。」後者の場合、PulseAudioは、オーディオデバイスからのフィードバックをアプリケーションに提供して、任意の時点でオーディオデータが実際に再生される距離を正しく判断できる必要があります。
その結果、PulseAudioがBluetoothオーディオ処理にかなり深く関与することは理にかなっています。介在するレイヤーが多いほど、正確なフィードバックを維持せずにデータがバッファリングされる可能性が高くなり、リップシンクが失われます。
実際、PulseAudioが存在する前は、Bluetoothオーディオ用のALSAバックエンドがありましたが、廃止されました。問題は、当時のALSAのインターフェースが主に従来のサウンドカード用に設計されていて、Bluetoothの潜在的に変動するオーディオレイテンシーに対処することが困難だったことだと思います。
PulseAudioのインターフェースは、さまざまなサウンドデバイスを処理し、ストリームの再生中にオーディオストリームを切り替えるようにゼロから設計されているため、オーディオレイテンシのかなり高度な概念も組み込まれているようです。
はい、PulseAudioモジュールとしてではなくBlueZに実装されている可能性があります。しかし、その後、BlueZはアプリケーション用のオーディオインターフェイスを提示する必要がありました。また、PulseAudioはシステム上の「すべての」オーディオを処理する必要があるため(現在再生中のオーディオをスピーカーからBluetoothに、またはその逆にオンザフライで転送できるようにするため)、PulseAudioとインターフェイスする必要があります。とにかくどういうわけか。
これらの正確な手順に従う必要がある理由はわかりませんが、最終的に解決策を見つけたと思います(2つのLinux Mintシステムでテスト済み)。
最初のステップ:
実行ごとに:
手順のいずれかを逃した場合は、手順1に進み、再試行してください。これが機能するかどうか教えてください。
編集:Linux Mint 19では、デフォルトのBluetoothマネージャーが高忠実度再生で完全に機能します。構成はまったく必要ありません!!
構成はさまざまですが、十分にテストされたコマンドをいくつか示します。
デバイスを信頼できるものとして設定する必要があります。それは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