
Ich bin neu bei Linux und auch neu beim Bluetooth-Scripting. Was ich bisher herausgefunden habe, ist Folgendes:
- Bluez ist der Standard-BT-Stapel.
- BluezTools ist eine Reihe von Dienstprogrammen, mit denen Sie einfacher mit Bluez interagieren können
- DBus ist die Schnittstelle, mit der Bluez eine Verbindung herstellt, wenn es direkt mit der Hardware interagiert.
- PulseAudio ist das Subsystem, das für die Audiowiedergabe im System verantwortlich ist.
Das macht Sinn. Nehmen wir also an, ich habe Bluetooth-Kopfhörer. Ich würde erwarten (nachdem ich alles gekoppelt und Vertrauen aufgebaut habe), dass ich einen Befehl erteilen kann, der eine direkte Verbindung zu einem bestimmten Profil auf den Bluetooth-Kopfhörern herstellt.
Der technische Weg, der mir vorschwebt, wäre etwa:
- Schalten Sie die Kopfhörer ein.
- Geben Sie einen BluezTools-Befehl ein, beispielsweisebt-audio -c
- Warten Sie, bis das Gerät eine Verbindung zum gewünschten Dienst herstellt
- PulseAudio sollte nun ein neues Ausgabegerät auswählen
- Geben Sie einen weiteren Befehl ein, um den ursprünglichen Ton in einen neuen Ausgabeton (die BT-Kopfhörer) zu ändern.
- Genießen Sie ein nahtloses Hörerlebnis.
Das scheint alles logisch, aber die tatsächliche Implementierung sieht anders aus und ich suche nach dem WARUM, damit ich das Problem besser verstehen und versuchen kann, es zu beheben.
Folgendes passiert tatsächlich:
- Schalten Sie die Kopfhörer ein.
- Geben Sie einen BluezTools-Befehl ein, beispielsweisebt-audio -c
- Warten Sie, bis das Gerät eine Verbindung zum gewünschten Dienst herstellt
- PulseAudio sollte nun ein neues Ausgabegerät auswählen
- Geben Sie einen PulseAudio-Befehl ein, um das Audioprofil von Telefonqualität auf High Fidelity zu ändern.
Lassen Sie mich das etwas näher ausführen. Das Bluetooth-Headset bietet 2 Qualitätsmodi (Telefon und High Fidelity). Nur 1 davon ist wirklich zum Musikhören geeignet.
Ich würde erwarten, dass die BT-Kopfhörer jeden Qualitätsmodus als Dienst bereitstellen, ist das richtig? Diese Annahme könnte falsch sein, aber ich würde so etwas erwarten wie
bt-audio -c highFidelityProfile
oder
bt-audio -changeProfile highFidelityProfile
Stattdessen scheint Bluez nur die RAW-Verbindung zum Gerät zu handhaben, und von dort aus müssen Sie Folgendes ausgeben:pacmd Set-Kartenprofil $INDEX a2dp
Das scheint einfach grundsätzlich falsch zu sein. Warum erfolgt die Qualitätskontrolle im Audio-Subsystem, sodass für Pulse oder Alsa oder jedes andere Sound-Subsystem eine andere Implementierung erforderlich ist?
Was übersehe ich? Warum ist es nicht möglich, mit Bluez / BluezTools usw. eine direkte Verbindung zu einem bestimmten Profil herzustellen?
Antwort1
Eine Bluetooth-Verbindung weist im Vergleich zu einfachen kabelgebundenen Kopfhörern oder Lautsprechern eine erhebliche Latenz auf. Darüber hinaus kann die Verbindungslatenz je nach den Eigenschaften des Bluetooth-Empfängers und möglicherweise sogar der Stärke des Funksignals variieren, wenn sich der Benutzer bewegt.
Die Schnittstelle zwischen einer Anwendung und PulseAudio kann so einfach sein wie „Hier sind einige PCM-Audiodaten, spielen Sie das ab.“ Sie kann aber auch komplizierter sein, etwa wie „Hier sind einige PCM-Audiodaten, spielen Sie das ab und sagen Sie mir alle 50 ms, wie weit Sie gekommen sind, damit ich Ihnen sagen kann, dass Sie weiterspringen sollen, wenn es so aussieht, als ob Sie nicht mehr lippensynchron mit dem Videostream sind, den ich abspiele. Oh, und Sie müssen es auch neu abtasten, da die Daten eine Abtastrate haben, die Ihre Hardware nicht direkt unterstützt.“ Im letzteren Fall muss PulseAudio der Anwendung Feedback vom Audiogerät geben können, um korrekt zu bestimmen, wie weit die Audiodaten zu einem bestimmten Zeitpunkt tatsächlich abgespielt wurden.
Aus diesem Grund ist es sinnvoll, dass PulseAudio relativ stark in die Bluetooth-Audioverarbeitung eingebunden ist: Je mehr dazwischenliegende Schichten vorhanden sind, desto größer ist die Möglichkeit, dass Daten gepuffert werden, ohne dass eine genaue Rückmeldung gewährleistet bleibt, wodurch die Lippensynchronität verloren geht.
Tatsächlich gab es vor der Einführung von PulseAudio ein ALSA-Backend für Bluetooth-Audio, das jedoch veraltet war. Ich denke, das Problem bestand darin, dass die Schnittstellen von ALSA damals hauptsächlich für herkömmliche Soundkarten entwickelt wurden und der Umgang mit einer möglicherweise variablen Audiolatenz von Bluetooth schwierig war.
Die Schnittstellen von PulseAudio wurden von Grund auf für die Handhabung verschiedener Soundgeräte und sogar für das Umschalten von Audio-Streams zwischen ihnen während der Wiedergabe des Streams entwickelt. Daher scheint es mir, dass hier auch ein ziemlich fortschrittliches Konzept für die Audio-Latenz integriert ist.
Ja, es hätte in BlueZ implementiert werden können, anstatt als PulseAudio-Modul; aber dann hätte BlueZ eine Audioschnittstelle für die Anwendungen bereitstellen müssen. Und da PulseAudio „alle“ Audiodaten auf einem System verarbeiten möchte (um die aktuell abgespielten Audiodaten spontan von den Lautsprechern auf Bluetooth oder umgekehrt übertragen zu können), müsste es sowieso irgendwie mit PulseAudio verbunden werden.
Antwort2
Ich glaube, ich habe endlich eine Lösung gefunden (getestet auf zwei Linux Mint-Systemen), obwohl ich keine Ahnung habe, warum ich genau diese Schritte befolgen muss:
Erste Schritte:
- Installieren Sie Blueman:sudo apt-get installiere blueman
- Bluetooth-Datei bearbeiten:sudo nano /etc/bluetooth/main.confund fügen Sie am Ende diese Zeile hinzu:Deaktivieren=Headset
Für jeden Lauf:
- Bluetooth-Dienst neu starten:sudo service bluetooth neu starten
- Öffnen Sie Geräte von Blueman in der TaskleisteoderTypBlueman-Managerim Terminal
- Suchenfür Ihr Bluetooth-Audiogerät
- Klicken Sie mit der rechten Maustaste auf Ihr Gerät und verbinden Sie sich alsHeadset
- Gehe zuKlangaus den Systemeinstellungen
- Wählen Sie Ihr Gerät aus, indem Sie einmal darauf klicken
- Gehen Sie nun erneut zuBlueman-Manager
- Klicken Sie mit der rechten Maustaste auf Ihr Bluetooth-Gerät und stellen Sie das Audioprofil aufHi-Fi-Wiedergabe (A2DP-Sink)
Wenn Sie einen der Schritte vergessen haben, gehen Sie zu Schritt 1 und versuchen Sie es erneut. Lassen Sie mich wissen, ob es funktioniert.
Bearbeiten: Unter Linux Mint 19 funktioniert der Standard-Bluetooth-Manager perfekt mit High Fidelity Playback, es ist überhaupt keine Konfiguration erforderlich!!
Antwort3
Es kann zwar von Ihrer Konfiguration abhängen, hier sind jedoch einige bewährte Befehle.
Sie müssen das Gerät als vertrauenswürdig festlegen. Dies ist über die GUI möglich.
sdptool durchsuchengibt viele Details zu den verfügbaren Protokollen und Kanälen auf dem Zielgerät.
Es ist einfacher, einen Bluetooth A2P Audio-Sink einzurichten, wenn gleichzeitige Audio-Ausgänge verwendet werden. Um ihn einzurichten, siehe das Toolpaprika.
sudo apt install bluetooth
sudo apt install bluez bluez-tools
sudo apt install rfkill rfcomm
Starten Sie das Gerät, es sollte sowieso hci0 sein:
sudo hciconfig hci0 up
Remote-Geräte auflisten:
sudo rfkill list
Liste der Bluetooth-Netzwerke:
hcitool scan
Durchsuchen Sie die verfügbaren Protokolle:
sdptool browse 43:23:00:02:23:A7
Ein Gerät anschließen:
sudo rfcomm connect hci0 43:23:00:02:23:A7
Sende eine Datei:
sudo bt-obex -p 43:23:00:02:23:A7 ~/images/tof.png
Eine Datei erhalten:
sudo bt-obex -s /
Auf einem Kanal (hier Kanal 19) nach Daten suchen/warten und Daten in eine Datei mit dem Namen „Dump“ im Home-Ordner schreiben:
sudo apt install bluez-hcidump
hcidump -i hci0 -O 19 -w ~/dump
Alternative: manchmal nützlich zum Koppeln:
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