Lepší zvuk přes Bluetooth na Linuxu

Před rokem jsem si pořídil první pořádné bezdrátové sluchátka. Musím říct, že s Fedora Workstation fungují bezvadně. Spárují se, spojí se, zvuk je automaticky přesměrovaný do sluchátek. Když už spárované sluchátka zapnu, notebook se s nimi automaticky spojí. Jen ten zvuk není úplně ideální.

Zatímco „po drátě“ jde zvuk nekomprimované podobě, Bluetooth má omezenou propustnost a proto se musí použít nějaký kompresní kodek. Můžete použít prakticky libovolný. Aby byl ale použitý, musí jej podporovat obě strany. A počet kodeků, který bluetooth zařízeními podporovaný, je omezený: AAC (částečně volně použitelný, má asi nejširší podporu, protože to je jediný kodek, který podporuje iPhone), AptX (proprietární a patentově chráněný, taktéž velmi rozšířený), AptX-HD (opět proprietární a patentově chráněný, vylepšený AptX s vyšším bitratem), LDAC (volně dostupný  v Androidu, nejvyšší bitrate, asi nejlepší dostupný kodek), MP3 (ano, i ten se dá použít, dnes už je dokonce volně použitelný, ale podporuje ho minimum zařízení).

A pak je tu SBC, základní kodek první generace, který je součástí standardu Bluetooth a podporují ho všechna zařízení. Jeho poměr velikost/kvalita je oproti výše zmíněným kodekům špatný. Problém taky je, že většina zařízení dneska zvládne bitrate přes 500 kbps, ale při použití SBC jej omezuje na 320 kbps nebo ještě méně, což je u tohoto kodeku vážně málo.

Moje sluchátka podporují SBC, AAC, AptX, AptX-HD, LDAC. Kromě SBC tedy i všechny aspoň trochu rozšířené pokročilé kodeky. Bohužel na Linuxu se nakonec použije SBC, protože žádný jiný není k dispozici, a sluchátka za šest tisíc hrají jako šumítka za pár stovek. Dnes poslouchá hudbu už prakticky jen na Spotify, které streamuje v OGG 320 kbps. Tento stream se ale v notebooku překóduje do SBC, což znamená docela výraznou ztrátu kvality.

Když jsem o tom přemýšlel před necelým rokem, uvědomil jsem si, že jsem četl, že Sony uvolnilo pro Android kodek LDAC, aby tak mělo konkurenční výhodu oproti AptX-HD, jehož předchůzce AptX je na Androidu taky velmi rozšířený, ale není součástí samotného Androidu a výrobci mobilů za jeho použití musí platit Qualcommu. Říkal jsem si, že pokud je součástí Android Open Source Projectu, musí být uvolněný pod nějakou otevřenou licencí. A taky že byl! Nachází se tam pod licencí Apache 2.0, která zaručuje to, že i když má Sony na daný kodek patenty, nemůže nic vymáhat po uživatelích tohoto kódu.

Zjistil jsem také, že Bluez s kodekem LDAC počítá a pokud je k dispozici, dokáže se na jeho použití s druhou stranou domluvit. Co ale chybělo, bylo rozšíření pro PulseAudio, které by se staralo o převod zvukového streamu do LDACu. Nebylo to úplně triviální množství práce, tak jsem to přeřadil do škatulky „Co bychom mohli implementovat v budoucnu v PipeWire“. PipeWire má totiž výhledově PulseAudio nahradit.

Včera jsem se ale dozvěděl, že takové rozšíření PA mezitím vzniklo. Kromě LDACu podporuje také AptX, AptX-HD a AAC. Ty jsou, jak už jsem zmínil, patentově chráněné a onen modul pro ně používá ffmpeg. Ty tak ve Fedoře hned tak podporovat nebudeme. Zjistil jsem ale taky, že libldac už je ve Fedora package review a zrovna včera dostal kladný právní posudek. To znamená, že už stačí dostat do Fedory jen ten modul a uživatelé se sluchátky podporujícími LDAC budou mít automaticky ve sluchátkách mnohem lepší zvuk.

Původně jsem si myslel, že budeme moct podporovat i AAC, což by vzhledem k jeho rozšířenosti bylo super, ale kodek, který je momentálně ve Fedoře nepodporuje všechny profily, což se může projevit na funkčnosti nebo kvalitě streamu.

Každopádně někdo už zabalil jak onen modul, tak libldac a já jsem se rozhodl to vyzkoušet. A ono to na Fedoře 29 skutečně fungovalo, LDAC se začal používat pro streaming přes Bluetooth:

Nemám netopýří uši, ale rozdíl v kvalitě zvuku jsem poznal od prvního okamžiku. Poslouchám na těch sluchátkách hudbu z notebooku už druhý den a je to opravdu jiná káva. Výsledoval jsem, že PulseAudio při hraní vytěžuje procesor z 3-5 %. Nedělal jsem srovnání s původním SBC.Předpokládám, že kódování do LDACu bude o cosi náročnější, ale u průměrného stroje to bude rozdíl neznatelný. Někteří uživatelé si stěžovali na latenci, ale myslím si, že to je primárně problém sluchátek, které si nejsou schopné domluvit latency off-set. Já mám video s audiem synchronizované.

Pokud se nepletu, dělá to z Linuxu první desktopový systém, který LDAC podporuje. Doufám, že se nám to podaří dostat už do Fedory 30. Společně s podporou AptX, AptX-HD a AAC (které budou v případě Fedory vyžadovat instalaci balíčku z RPMFusion) tak bude mít vůbec nejširší podporu pokročilých kodeků mezi systémy. Všichni ostatní podporují jen SBC a potom podmnožinu z těch pokročilých.

Kromě výše zmiňovaného modulu se vyvíjí podpora také přímo v PulseAudiu. Ta má pokrývat stejné kodeky. Ale také SBC Ultra High Quality (SBC s vyšším bitratem), AptX Low Latency a FastStream (kodeky pro obousměrný provoz použivané pro hovory). Vzhledem k tomu, že vývoj probíhá v kontaktu s upstreamem, má i větší šanci na to, že se stané trvalou součástí PulseAudia.

11 komentářů: „Lepší zvuk přes Bluetooth na Linuxu“

  1. Honza avatar
    Honza

    Dobrý den, Jako uživatel-laik sem tam používající bluetooth sluchátka nebo repra by mě zajímalo, jak lze zjistit, na použití jakého kodeku se OS a sluchátka/repro „domluvili“…

    1. sesivany avatar

      Právě tím příkazem uvedeným v článku: pactl list | grep a2dp_codec
      Pokud není kodek uvedený, používá se ten nativní, tedy SBC.

  2. BzF avatar
    BzF

    Dobrý den,
    je u vysílače použitý kodek (za předpokladu, že jej přijímač podporuje) čistě záležitostí SW (v tomto případě pulseaudio) nebo je nutné mít i podporu v HW?
    Pokud v HW, jakou používáte kartu (z názwu stroje předpokládám DELL XPS13) nebo externí usb dongle apod., která podporuje LDAC?
    Děkuji

    1. sesivany avatar

      Na notebooku je to čiště softwarová záležitost. Není potřeba mít podporu pro daný kodek v bluetooth adaptéru.

    2. Pali avatar
      Pali

      Pokiaľ vysielačom je klasický bluetooth adaptér, tak je to čisto SW záležitosť. Bluetooth adaptér takto dostáva už iba dáta, ktoré má vysielať. Pokiaľ je vysielačom zariadenie, ktoré sa javí pre systém ako (USB) zvuková karta, tak je to potom záležitosť HW a vtedy systém posiela po USB nekomprimované zvukové sample.

      Zoznam podporovaných kodekov prijímačom sa dá z bluetooth adaptéra ako vysielača, zistiť pomocou nástroja avinfo. Ten je súčasťou bluez. Občas takto človek zistí, že jeho bluetooth slúchadla podporujú viac ako výrobca deklaruje.

      1. eischmann avatar

        Má to avinfo nějaké rozhraní? Našel jsem jenom reference na avinfo v kódu Bluez, ale netuším, kde a jak se to ovládá.

  3. Pali avatar
    Pali

    avinfo je klasická command line utilita. Ako argument berie MAC adresu cieľového zariadenia. Výstup vyzerá nejak takto:

    $ avinfo XX:XX:XX:XX:XX:XX
    Connecting …
    Stream End-Point #1: Audio Sink
    Media Codec: SBC
    Channel Modes: Mono DualChannel Stereo JointStereo
    Frequencies: 16Khz 32Khz 44.1Khz 48Khz
    Subbands: 4 8
    Blocks: 4 8 12 16
    Bitpool Range: 2-53
    Content Protection: SCMS-T
    Stream End-Point #5: Audio Sink
    Media Codec: Vendor Specific A2DP Codec
    Vendor ID 0x0000004f
    Vendor Specific Codec ID 0x0001
    Vendor Specific Data: 0xf2
    Vendor Specific Value (aptX)
    Frequencies: 16kHz 32kHz 44.1kHz 48kHz
    Channel modes: Stereo
    Stream End-Point #3: Audio Sink
    Media Codec: Vendor Specific A2DP Codec
    Vendor ID 0x0000000a
    Vendor Specific Codec ID 0x0001
    Vendor Specific Data: 0x03 0x23
    Vendor Specific Value (FastStream)
    Directions: sink source
    Sink Frequencies: 44.1kHz 48kHz
    Source Frequencies: 16kHz

    1. sesivany avatar

      Ve Fedoře jsem to nenašel. Na Internetu potom jenom toto: http://shounen.ru/soft/avinfo/desc_en.shtml
      Ale to mělo poslední release před 14 lety a co jsem se díval, tak z distribucí už to bylo odstraněné. Na stránkách upstreamu už zdrojáky taky nejsou.

      1. Pali avatar
        Pali

        avinfo je priamo súčasťou bluez

      2. sesivany avatar

        Aha, ve Fedoře to z nějakého důvodu součástí balíku není: https://apps.fedoraproject.org/packages/bluez/contents/

      3. Pali avatar
        Pali

        Tak stále sa dá skompilovať ručne z http://www.bluez.org/download/: ./configure; make; cd tools; ./avinfo …

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *