Warum übernimmt pulseaudio die Klangqualitätsverbindung zu einem BT-Gerät?

11

Ich bin neu in Linux und neu in Bluetooth-Skripten. Was ich bisher entdeckt habe, ist Folgendes:

  1. Bluez ist der Standard-BT-Stack.
  2. BluezTools ist eine Reihe von Dienstprogrammen, mit denen Sie einfacher mit Bluez interagieren können
  3. DBus ist die Schnittstelle, mit der Bluez eine Verbindung herstellt, während er direkt mit der Hardware interagiert.
  4. PulseAudio ist das Subsystem, das für die Erzeugung von Audio auf dem System verantwortlich ist.

Das macht Sinn. Nehmen wir also an, ich habe einen Satz BlueTooth-Kopfhörer. Ich würde erwarten (alles nach dem Pairing und Vertrauen), dass ich einen Befehl ausgeben kann, der eine direkte Verbindung zu einem bestimmten Profil auf den BT-Kopfhörern herstellen kann.

Der technische Weg, den ich vorhabe, wäre ungefähr so:

  1. Schalten Sie die Kopfhörer ein.
  2. Geben Sie einen BluezTools-Befehl aus, z bt-audio -c
  3. Warten Sie, bis das Gerät eine Verbindung zu dem Dienst hergestellt hat, nach dem ich suche
  4. PulseAudio sollte jetzt ein neues Ausgabegerät aufnehmen
  5. Geben Sie einen weiteren Befehl ein, um das Audio von dem, was es war, in neues Ausgangsaudio (die BT-Kopfhörer) zu ändern.
  6. Genießen Sie ein nahtloses Hörerlebnis.

Dies alles scheint logisch, aber die tatsächliche Implementierung ist nicht so, und ich suche nach dem WARUM, damit ich das Problem besser verstehen und versuchen kann, es zu beheben.

Das passiert tatsächlich:

  1. Schalten Sie die Kopfhörer ein.
  2. Geben Sie einen BluezTools-Befehl aus, z. B. bt-audio -c
  3. Warten Sie, bis das Gerät eine Verbindung zu dem Dienst hergestellt hat, nach dem ich suche
  4. PulseAudio sollte jetzt ein neues Ausgabegerät aufnehmen
  5. Geben Sie einen PulseAudio-Befehl aus, um das Audioprofil von Telefonqualität auf High-Fidelity zu ändern.

Lassen Sie mich das etwas näher erläutern. Das Bluetooth-Headset bietet zwei Qualitätsmodi (Telefon und High-Fidelity). Nur 1 ist wirklich zum Musikhören geeignet.

Ich würde erwarten, dass die BT-Kopfhörer jeden Qualitätsmodus als Service verfügbar machen, stimmt das? Diese Annahme könnte falsch sein, aber ich würde so etwas erwarten

bt-audio -c highFidelityProfile

oder

bt-audio -changeProfile highFidelityProfile

Stattdessen scheint Bluez nur die RAW-Verbindung zum Gerät zu verwalten, und von dort aus müssen Sie ein: pacmd-Set-Card-Profil $ INDEX a2dp ausgeben

Das scheint einfach grundlegend falsch zu sein. Warum ist die Qualitätskontrolle im Audio-Subsystem und erfordert daher eine andere Implementierung für Puls oder Alsa oder ein anderes Sound-Subsystem?

Was vermisse ich? Warum ist es mit Bluez / BluezTools usw. nicht möglich, eine direkte Verbindung zu einem bestimmten Profil herzustellen?

J L.
quelle

Antworten:

2

Eine Bluetooth-Verbindung weist im Vergleich zu einfachen kabelgebundenen Kopfhörern oder Lautsprechern eine erhebliche Latenz auf. Darüber hinaus kann die Verbindungslatenz variieren, abhängig von den Eigenschaften des Bluetooth-Empfängers und möglicherweise sogar der Funksignalstärke, wenn sich der Benutzer bewegt.

Die Schnittstelle zwischen einer Anwendung und PulseAudio kann so einfach sein wie "Hier sind einige PCM-Audiodaten; spielen Sie diese ab." Es kann aber auch komplizierter sein; so etwas wie "Hier sind einige PCM-Audiodaten; spielen Sie diese ab und sagen Sie mir alle 50 ms, wie weit Sie gekommen sind, damit ich Ihnen sagen kann, dass Sie weitermachen sollen, wenn es so aussieht, als ob Sie nicht mehr mit dem Videostream synchronisiert sind Ich spiele. Oh, und Sie müssen es auch erneut abtasten, da die Daten eine Abtastrate haben, die Ihre Hardware nicht direkt unterstützt. " Im letzteren Fall muss PulseAudio in der Lage sein, der Anwendung eine Rückmeldung vom Audiogerät zu geben, um korrekt zu bestimmen, wie weit die Audiodaten zu einem bestimmten Zeitpunkt tatsächlich abgespielt werden.

Daher ist es sinnvoll, dass PulseAudio ziemlich stark in die Bluetooth-Audioverarbeitung involviert ist: Je mehr Ebenen dazwischen liegen, desto mehr Möglichkeiten bestehen, Daten ohne genaue Rückmeldung zu puffern, wodurch die Lippensynchronisation verloren geht.

Bevor es PulseAudio gab, gab es ein ALSA-Backend für Bluetooth-Audio, das jedoch veraltet war. Ich denke, das Problem war, dass die Schnittstellen von ALSA zu dieser Zeit hauptsächlich für herkömmliche Soundkarten entwickelt wurden und es schwierig war, mit einer möglicherweise variablen Audio-Latenz von Bluetooth umzugehen.

Die Interfaces von PulseAudio wurden von Grund auf so konzipiert, dass sie verschiedene Audiogeräte verarbeiten und sogar Audio-Streams zwischen ihnen umschalten können, während der Stream abgespielt wird. Daher scheint mir auch ein ziemlich fortschrittliches Konzept der Audio-Latenz integriert zu sein.

Ja, es hätte in BlueZ und nicht als PulseAudio-Modul implementiert werden können. Dann hätte BlueZ ein Audio-Interface für die Anwendungen präsentieren müssen. Und da PulseAudio "das gesamte" Audio auf einem System verarbeiten möchte (um das aktuell abgespielte Audio von Lautsprechern auf Bluetooth oder umgekehrt im laufenden Betrieb übertragen zu können), müsste es mit PulseAudio verbunden werden irgendwie sowieso.

telcoM
quelle
2

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 ausführen muss:

Erste Schritte:

  1. Installieren Sie blueman: sudo apt-get installiere blueman
  2. Bearbeiten Sie die Bluetooth-Datei: sudo nano /etc/bluetooth/main.conf und fügen Sie diese Zeile am Ende hinzu: Disable = Headset

Für jeden Lauf:

  1. Bluetooth-Dienst neu starten : Sudo-Dienst Bluetooth-Neustart
  2. Offene Geräte aus blueman in der Taskleiste oder geben Sie blueman-Manager in Terminal
  3. Suche nach Ihrem Bluetooth-Audiogerät
  4. Klicken Sie mit der rechten Maustaste auf Ihr Gerät und stellen Sie eine Verbindung als Headset her
  5. Gehe zum Ton von den Systemeinstellungen
  6. Wählen Sie Ihr Gerät aus, indem Sie einmal darauf klicken
  7. Jetzt geh wieder zum Blueman-Manager
  8. Klicken Sie mit der rechten Maustaste auf Ihr Bluetooth-Gerät und stellen Sie das Audioprofil auf High Fidelity Playback (A2DP Sink) ein.

Wenn Sie einen der Schritte verpassen, fahren Sie mit Schritt 1 fort und versuchen Sie es erneut. Lassen Sie mich wissen, ob dies funktioniert.

Bearbeiten : In Linux Mint 19 funktioniert der Standard-Bluetooth-Manager perfekt mit High-Fidelity-Wiedergabe, es ist überhaupt keine Konfiguration erforderlich !!

Aditya Pal
quelle
0

Obwohl dies von Ihrer Konfiguration abweichen kann, finden Sie hier einige gut getestete Befehle.

Sie müssen das Gerät als vertrauenswürdig festlegen. Dies kann über die GUI erfolgen.

sdptool browse bietet viele Details zu verfügbaren Protokollen und Kanälen auf dem Zielgerät.

Es ist einfacher, eine Bluetooth-A2P-Audio-Senke einzustellen, wenn simultane Audioausgänge verwendet werden. Informationen zum Einrichten finden Sie in den Papier-Tools .

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

Gerät starten, es sollte sowieso hci0 sein:

sudo hciconfig hci0 up

Remote-Geräte auflisten:

sudo rfkill list

Liste der Bluetooth-Netzwerke:

hcitool scan

Verfügbare Protokolle durchsuchen:

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

Schließen Sie ein Gerät an:

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 /

Scannen / warten Sie auf Daten auf einem Kanal (hier Kanal 19) und schreiben Sie Daten in eine Datei namens dump im Home-Ordner:

sudo apt install bluez-hcidump

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

Alternative: manchmal nützlich zum Pairing:

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
NVRM
quelle