Android Audio Linux Musik Software

Bluetooth HiFi unter Linux

Bose Kopfhörer auf (Linux)-Notebook

Bluetooth und HiFi sind zwei so Begriffe, die, zusammen in einem Satz ausgesprochen, Audio Enthusiasten gerne einen Schauer den Rücken runter laufen lassen. Der Grund ist trivial. Bluetooth hat zu wenig Bandbreite um Audio in hoher Auflösung unkomprimiert durch die Luft zu übertragen. Für den Headset Betrieb (synchroner Betriebsmodus für Telefonie) reicht es so gerade. Dabei ist die Qualität aber auch auf GSM-Codec Niveau und für Musik gar nicht zu gebrauchen.

Dieser Artikel ist eine Aktualisierung eines früheren und ersetzt diesen. Manuelles compilieren ist 2021 nicht mehr nötig und für bessere Aufnahmequalität gibt es mittlerweile auch mehr Optionen.

Modulare A2DP Protokollerweiterung

Seiner Zeit wurde eine Protokollerweiterung namens A2DP (Advanced Audio Distribution Profile) für Musik eingeführt. Mittels SBC-Codec kann so ressourcenschonend qualitativ hochwertigeres Audio übertragen werden. Ressourcenschonend vor allem für die CPUs üblicher Bluetooth-fähiger Telefone und Abspielgeräte. Dass hier Abstriche in Qualität in Kauf genommen werden müssen, dürfte klar sein. Ab Version 2.0 (EDR – Enhanced Data Rate) ermöglicht Bluetooth höhere Übertragungsraten. Eine höhere Bitrate verbessert die Qualität etwas. Aber die Schwächen des SBC-Codecs bleiben natürlich.

Echtes HiFi mit AAC, aptX, aptX HD, LDAC

Seit einiger Zeit tut sich hier aber wirklich etwas. Und dies verspricht tatsächlich drahtlosen HiFi Musikgenuss. Die Rede ist von den Codecs AAC, aptX, aptX HD und LDAC. Diese zeichnen sich durch eine Vielzahl unterschiedlicher Qualitäten aus.

Die beste Quelle zu Verfügbarkeit, Qualität, Bitrate etc., die ich finden konnte, ist diese hier: Audio over Bluetooth: most detailed information about profiles, codecs, and devices (Englisch).

Man kann es wie folgt zusammenfassen:

SBCkann jedes sendende/empfangende Device, Qualität mittelmäßig
AACbeherrscht von Android/iPhone/Windows und vielen Empfangsgeräten, verlustbehaftet
aptX / aptX HDalter, propietärer Standard, mit höheren Bitraten / Abtastraten, HD Variante verlustfrei
LDACfreier, verlustfreier Standard von Sony mit hohen Bitraten / Abtastraten und dynamischer Datenrate

Wenn die eigenen Geräte es unterstützen, will man also vermutlich LDAC verwenden. Auch wenn hier (aufgrund der hohen Bandbreite von bis zu 990Kbit/s) die Störanfälligkeit höher ist, wenn parallel viel 2.4GHz WiFi in der Luft unterwegs ist oder die (schlecht geschirmte) Mikrowelle läuft.

Linux-Support für die erweiterten Codecs

Pulseaudio kann A2DP Audio schon länger, viele Distributionen liefern bislang aber nur den SBC Codec mit aus. Unter Fedora ist dies im Paket ‘pulseaudio-module-bluetooth’ verpackt. Seit Version 30 ist im RPMFusion Repository auch das Paket ‘pulseaudio-module-bluetooth-freeworld‘ vorhanden. Neuerdings mischt pipewire das Audio (und Video) Ökosystem unter Linux auf. Auch dieser bringt für Bluetooth HiFi alles mit – auch hier unter Linux mithilfe der rpmfusion Repos.

Nach Installation bislang fehlender Pakete, muss folglich pulseaudio/pipewire neu gestartet werden.

Kopfhörer verbinden und Profil auswählen

Nun kann man den Kopfhörer mittels Bluetooth (wieder)verbinden und das gewünschte A2DP HiFi Profil auswählen.

Bluetooth Gerätedialog

Dazu geht man in die Gnome-Einstellungen und verbindet das Gerät im Bluetooth Reiter. Der Knopf “Klangeinstellungen” führt zu den Gnome Audioeinstellungen. Hier stehen nun alle (neuen) Profile zur Auswahl.

Bluetooth Profilauswahl

Hifi Aufnahme / Mikrofon

Das alles löst allerdings bislang nur eine Seite, das Hören von Audio in hoher Qualität. In Zeiten von Pandemie und HomeOffice ist allerdings der eingehende Sprachkanal nicht weniger wichtig. Gerade hier tut sich in letzter Zeit einiges. Und das ist auch bitter notwendig. Denn bislang klingen die HFP/HSP Profile – egal ob mit oder ohne CSVD Codec eher wie aus einer Blechdose – für beide Seiten.

Hier springen die Codecs mSBC und SBC-XQ in die Bresche. Mitgeliefert werden diese ab Pulsaudio 15 und ab pipewire 0.3.23. Somit sollte es auf einem Fedora 34 direkt nach Aktivierung dieser Codecs funktionieren. Der erstere bietet “HD-Telefonie” Qualität (16KHz, 16 bit), der zweite bis zu “CD-Qualität” (48KHz, 16 bit).

Hierzu muss die Datei /usr/share/pipewire/media-session.d/bluez-monitor.conf editiert werden um folgende Zeilen auszukommentieren und auf true zu setzen. Auf Ubuntu/Debian basierten Distributionen kannn die Datei auch unter /etc/pipewire/media-session.d/ liegen. Leider konnte ich die pulseaudio pendants nicht testen, da Fedora derzeit noch 14.x ausliefert. Außerdem bin ich auch mit pipewire sehr zufrieden. :shrug:

    bluez5.msbc-support   = true
    bluez5.sbc-xq-support = trueCode-Sprache: JavaScript (javascript)

Leider ist es nach- wie vor so, dass HFP/HSP und A2DP nicht gemischt werden können. Benötigt man also das Mikrofon, fällt der Wiedergabecodec ebenfalls auf mSBC oder SBC-XQ zurück. Aber der Schmerz in den Ohren ist dennoch deutlich geringer.

Funktion überprüfen

Das genutzte Profil lässt sich mit pactl (pulseaudio) überprüfen.

pactl list
Karte #5
	Name: bluez_card.2C_41_A1_4E_FB_FE
	Treiber: module-bluez5-device.c
	Owner-Modul: 26
	Eigenschaften:
		device.description = "Matrix"
		device.string = "2C:41:A1:4E:FB:FE"
		device.api = "bluez"
		device.class = "sound"
		device.bus = "bluetooth"
		device.form_factor = "headphone"
		bluez.path = "/org/bluez/hci0/dev_2C_41_A1_4E_FB_FE"
		bluez.class = "0x240418"
		bluez.alias = "Matrix"
		device.icon_name = "audio-headphones-bluetooth"
	Profile:
		headset_head_unit: Headset Head Unit (HSP/HFP) (Ziele: 1, Quellen: 1, Priorität: 30, verfügbar: ja)
		a2dp_sink_sbc: High Fidelity Playback (A2DP Sink: SBC) (Ziele: 1, Quellen: 0, Priorität: 40, verfügbar: nein)
		a2dp_sink_aac: High Fidelity Playback (A2DP Sink: AAC) (Ziele: 1, Quellen: 0, Priorität: 40, verfügbar: ja)
		a2dp_sink_aptx: High Fidelity Playback (A2DP Sink: aptX) (Ziele: 1, Quellen: 0, Priorität: 40, verfügbar: nein)
		a2dp_sink_aptx_hd: High Fidelity Playback (A2DP Sink: aptX HD) (Ziele: 1, Quellen: 0, Priorität: 40, verfügbar: nein)
		a2dp_sink_ldac: High Fidelity Playback (A2DP Sink: LDAC) (Ziele: 1, Quellen: 0, Priorität: 40, verfügbar: nein)
		off: Off (Ziele: 0, Quellen: 0, Priorität: 0, verfügbar: ja)
	Aktives Profil: a2dp_sink_aac
	Ports:
		headphone-output: Headphone (priority: 0, latency offset: 0 usec, available)
			Teil der/des Profil(s): headset_head_unit, a2dp_sink_sbc, a2dp_sink_aac, a2dp_sink_aptx, a2dp_sink_aptx_hd, a2dp_sink_ldac
		headphone-input: Bluetooth Input (priority: 0, latency offset: 0 usec)
			Teil der/des Profil(s): headset_head_unit

Analog unter pipewire:

pw-cli info all | grep bluez
info: unsupported type PipeWire:Interface:Profiler
info: unsupported type PipeWire:Interface:Metadata
info: unsupported type PipeWire:Interface:Metadata
*		device.api = "bluez5"
*		device.name = "bluez_card.38_18_4C_2B_67_E2"
*		api.bluez5.icon = "audio-card"
*		api.bluez5.path = "/org/bluez/hci0/dev_38_18_4C_2B_67_E2"
*		api.bluez5.address = "38:18:4C:2B:67:E2"
*		api.bluez5.device = ""
*		api.bluez5.class = "0x240404"
*		api.bluez5.connection = "connected"
*		bluez5.auto-connect = "[ hfp_hf hsp_hs a2dp_sink ]"
*		bluez5.msbc-support = "true"
*		api.bluez5.transport = ""
*		api.bluez5.profile = "headset-head-unit"
*		api.bluez5.codec = "msbc"
*		api.bluez5.address = "38:18:4C:2B:67:E2"
*		node.name = "bluez_input.38_18_4C_2B_67_E2.headset-head-unit"
*		factory.name = "api.bluez5.sco.source"
*		device.api = "bluez5"
*		api.bluez5.transport = ""
*		api.bluez5.profile = "headset-head-unit"
*		api.bluez5.codec = "msbc"
*		api.bluez5.address = "38:18:4C:2B:67:E2"
*		node.name = "bluez_output.38_18_4C_2B_67_E2.headset-head-unit"
*		factory.name = "api.bluez5.sco.sink"
*		device.api = "bluez5"
*		media.name = "bluez_input.38_18_4C_2B_67_E2.headset-head-unitcapture4"
*		node.target = "bluez_input.38_18_4C_2B_67_E2.headset-head-unit"
*		media.name = "bluez_output.38_18_4C_2B_67_E2.headset-head-unitrender3"
*		node.target = "bluez_output.38_18_4C_2B_67_E2.headset-head-unit"
Code-Sprache: JavaScript (javascript)

Autor

Seit Kindheitstagen ist der Computer sein Begleiter. Was mit Linux anfing, wurde 2005 ein/e Beruf/ung, die weit über den Arbeitsplatz hinausgeht. Durch stetige Weiterentwicklung fasste er auch im *BSD Segment Fuß und bietet mittlerweile professionelle Lösungen im Bereich Hosting, Networking und Infrastruktur an. Als Ausgleich beschäftigt er sich neben Computerspielen mit der Fotografie.

4 Kommentare Neuen Kommentar hinzufügen

  1. Robert sagt:

    Hallo Marcus,

    Ich verstehe deine Anleitung nicht bzw. bekomme ich es so nicht hin. Ich nutze Linux Mint und scheitere an verschiedenen Stellen. Hättest du Lust dies ein wenig ausführlicher zu erklären?

    Grüße,

    Robert

    1. Also tatsächlich habe ich ein Ubuntu schon seit Jahren nicht mehr angefasst. Ich hab flott mal nachgeguckt, es gibt die erweiterten Codecs auch zum derzeitigen Zeitpunkt weder in den offiziellen Ubuntu Repos, noch in ppa’s. Wobei es da wohl 2 gibt, die sind aber seit 40+ Wochen nicht mehr aktualisiert worden. Einen “einfachen” Weg gibt es demnach leider noch immer nicht.

      Das Hauptproblem wird wohl erstmal sein, dass, dass Mint/Ubuntu kein dnf, sondern apt als Paketmanager verwenden. Die aufgezeigten Pakete werden auch anders heissen.

      Versuch es mal hiermit:
      apt install build-essential libfdk-aac-dev cmake ffmpeg libltdl-dev pkg-config libsbc-dev git

      Der Rest dürfte erstmal kaum Schwierigkeiten machen.

      Möglicherweise stößt Du beim “mkdir build && cd build” wieder auf Probleme, da musst Du dann tatsächlich in der Kompilerfehlermeldung nach einem Hinweis suchen, was noch fehlen könnte. Entsprechende Pakete müssten dann ggf. mit -dev angehängt (für Development Header) nachinstallieren.

  2. Bei Fedora 31 (via rpmfusion) liegt nun im Paket ‘pulseaudio-module-bluetooth-freeworld’ auch ein AAC Modul bei, das fdk-aac verwendet. Somit ist auch für ein aktuelles Fedora kein Rekompilieren von den Pulseaudio-Modulen mehr notwendig.

    Name : pulseaudio-module-bluetooth-freeworld
    Version : 1.3
    Release : 1.fc31
    Architecture : x86_64
    Size : 274 k
    Quelle : pulseaudio-module-bluetooth-freeworld-1.3-1.fc31.src.rpm
    Repository : @System
    Aus Paketque : rpmfusion-free
    Summary : Bluetooth support for the PulseAudio sound server, supports aptX, LDAC codecs
    URL : https://github.com/EHfive/pulseaudio-modules-bt/
    Lizenz : GPLv3
    Description : Contains Bluetooth audio (A2DP/HSP/HFP) support for the PulseAudio sound server.
    : Includes support for LDAC, aptX, aptX-HD and AAC codecs.

  3. Für die Encoder-Module können auch Parameter in der /etc/pulse/default.pa gesetzt werden. So lässt sich die Qualitätsstufe (Bitrate, Sampleformat) für LDAC vom automatischen, adaptiven Modus auch festnageln:

    # LDAC Standard Quality
    load-module module-bluetooth-discover a2dp_config=”ldac_eqmid=sq”

    oder

    # LDAC High Quality; Force LDAC/PA PCM sample format as Float32LE
    load-module module-bluetooth-discover a2dp_config=”ldac_eqmid=hq ldac_fmt=f32″

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.