Перад чытаннем гэтага артыкула рэкамендуецца азнаёміцца з папярэднім артыкулам:
Некаторыя карыстачы бесправадных слухавак адзначаюць нізкую якасць гуку і недахоп высокіх частот пры выкарыстанні стандартнага Bluetooth-кодэка SBC, які падтрымліваюць усе аўдыёпрылады. Частай рэкамендацыяй для паляпшэння гуку з'яўляецца купля прылад і навушнікаў з падтрымкай кодэкаў aptX і LDAC. Гэтыя кодэкі патрабуюць ліцэнзійных адлічэнняў, таму прылады з іх падтрымкай каштуюць даражэй.
Аказваецца, нізкая якасць SBC абумоўлена штучнымі абмежаваннямі Bluetooth-стэкаў і налад навушнікаў, і гэтае абмежаванне можна абыйсці на любых існуючых прыладах, шляхам праграмных змен смартфона або кампутара.
Кодэк SBC
У кодэка SBC ёсць мноства розных параметраў, якія адпавядаюць на этапе ўсталёўкі злучэння. Сярод іх:
- Колькасць і тып каналаў: Joint Stereo, Stereo, Dual Channel, Mono;
- Колькасць частотных палос: 4 ці 8;
- Колькасць блокаў у пакеце: 4, 8, 12, 16;
- Алгарытм размеркавання бітаў пры квантаванні: Loudness, SNR;
- Максімальнае і мінімальнае значэнне пула бітаў, выкарыстоўваных пры квантаванні (bitpool): звычайна, ад 2 да 53.
Якая дэкадуе прылада абавязана падтрымліваць любое спалучэнне гэтых параметраў. Кадавальная прылада можа рэалізоўваць не ўсё.
Існыя Bluetooth-стэкі, як правіла, узгодняць наступны профіль: Joint Stereo, 8 палос, 16 блокаў, Loudness, bitpool 2..53. Гэты профіль кадуе 44.1 кгц аўдыё з бітрэйтам 328 кбіт/з.
Параметр bitpool напроста ўплывае на бітрэйт у рамках аднаго профіля: чым ён вышэй, тым вышэй бітрэйт, а такім чынам і якасць.
Аднак параметр bitpool не прывязаны да пэўнага профіля; уплыў на бітрэйт таксама ў значнай ступені аказвае і іншыя параметры: тып каналаў, колькасць частотных палос, колькасць блокаў. Падняць бітрэйт можна ўскосна, шляхам узгаднення нестандартных профіляў, без змены bitpool.
Формула падліку бітрэйту SBC
Напрыклад, рэжым Dual Channel кадуе каналы паасобна, выкарыстоўваючы ўвесь bitpool для кожнага з каналаў. Прымусіўшы прыладу выкарыстоўваць Dual Channel замест Joint Stereo, мы атрымаем амаль падвоены бітрэйт пры тым жа максімальным значэнні bitpool: 617 кбіт/з.
На маю думку, выкарыстанне не прывязанага да профілі значэння bitpool на этапе ўзгаднення – недапрацоўка стандарту A2DP, якая і прывяла да штучнага абмежавання якасці SBC. Разумней было б узгадняць bitrate, а не bitpool.
Такія фіксаваныя значэнні Bitpool і Bitrate бяруць свой пачатак з табліцы з рэкамендаванымі да выкарыстання значэннямі для высакаякаснага аўдыё. Але рэкамендацыя - не нагода абмяжоўвацца гэтымі значэннямі.
Спецыфікацыя A2DP v1.2, якая была актыўная з 2007 па 2015 год, прадпісвае ўсім дэкадавальным прыладам карэктна працаваць з бітрэйтамі да 512 кбіт/з:
Выкарыстоўвайце SNK невялікую падтрымку ўсіх магчымых бітпаляў цэнаў, якія не даюць выніку ў максімуме bit rate. Гэтыя profile limits існуючыя максімум bit rate да 320kb/s для mono, and 512kb/s для двухканальных рэжымаў.
У новай версіі спецыфікацыі абмежаванне па бітрэйце адсутнічае. Мяркуецца, што сучасныя навушнікі, выпушчаныя пасля 2015 года і якія падтрымліваюць EDR, могуць падтрымліваць бітрэйты да ≈730 кбіт/с.
Па нейкім чынніку, у правераных мной Bluetooth-стэкаў Linux (PulseAudio), Android, Blackberry і macOS ёсць штучныя абмежаванні максімальнага значэння параметра bitpool, які напроста ўплывае на максімальны бітрэйт. Але гэта - не самая вялікая праблема, амаль усе навушнікі таксама абмяжоўваюць максімальнае значэнне bitpool лікам 53.
Як я ўжо паспеў пераканацца, большасць прылад выдатна працуе на мадыфікаваным Bluetooth-стэку з бітрэйтам у 551 кбіт/з, без перапыненняў і трэска. Але такі бітрэйт ніколі не будзе ўзгоднены ў звычайных умовах, на звычайных Bluetooth-стэках.
Мадыфікуем Bluetooth-стэк
У любым Bluetooth-стэку, які сумяшчальны са стандартам A2DP, ёсць падтрымка рэжыму Dual Channel, але актываваць яе з інтэрфейсу не ўяўляецца магчымым.
Давайце дадамо перамыкач у інтэрфейс! Я зрабіў патчы для Android 8.1 і Android 9, якія дадаюць паўнавартасную падтрымку Dual Channel у стэк, дадаюць рэжым у меню пераключэння рэжыму ў прылады распрацоўніка, і апрацоўваюць SBC з падтрымкай Dual Channel так, быццам гэта дадатковы кодэк, накшталт aptX, AAC або LDAC ( Android называе гэта HD Audio), дадаючы галачку ў наладкі Bluetooth-прылады. Вось як гэта выглядае:
Пры актывацыі галачкі, Bluetooth-аўдыё пачынае перадавацца з бітрэйтам 551 кбіт/с, калі навушнікі падтрымліваюць злучэнне на хуткасці 3 мбіт / с, або 452 кбіт/с, калі навушнікі падтрымліваюць толькі 2 мбіт/с.
Дадзены патч уключаны ў наступныя альтэрнатыўныя прашыўкі:
- LineageOS
- Уваскрасенне Рэмікс
- crDroid
Адкуль узяліся 551 і 452 кбіт/з?
Тэхналогія падзелу эфіру ў Bluetooth прызначаная для эфектыўнай перадачы вялікіх пакетаў фіксаванага памеру. Перадача дадзеных адбываецца слотамі, самая вялікая колькасць слотаў, якія адпраўляюцца за адну перадачу – 5. Таксама ёсць рэжымы перадачы, якія выкарыстоўваюць 1 ці 3 слот, але не 2 ці 4. У 5 слотах можна перадаць да 679 байт на хуткасці злучэння 2 мбіт/з і да 1021 байт на хуткасці 3 мбіт/з, а ў 3 - 367 і 552 байта адпаведна.
Калі мы жадаем перадаць менш дадзеных, чым 679 ці 1021 байт, але больш, чым 367 ці 552 байта, то перадача ўсё роўна зойме 5 слотаў, а дадзеныя будзе перадавацца за такі ж час, што памяншае эфектыўнасць перадачы.
SBC у рэжыме Dual Channel, на 44100 Гц-аўдыё з параметрамі Bitpool 38, 16 блокаў у фрэйме, 8 частотных дыяпазонаў, кадуе аўдыё ў фрэймы памерам 164 байт, з бітрэйтам 452 кбітс.
Аўдыё павінна быць інкапсуляванае ў пратаколы перадачы L2CAP і AVDTP, якія забіраюць 16 байт ад карыснай аўдыёнагрузкі.
Такім чынам, у адну Bluetooth-перадачу з 5 слотамі атрымоўваецца змясціць 4 аўдыёфрэйма:
679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (заголовок SBC) - (164*4) = 6
Мы змясцілі 11.7/3.75 мс аўдыёдадзеных ў які адпраўляецца пакет, які будзе перададзены за 6 мс, і ў нас засталося XNUMX нявыкарыстаных байт у пасылцы.
Калі ледзь падняць bitpool, 4 аўдыёфрэйма ўжо не атрымаецца спакаваць у адну пасылку. Прыйдзецца адпраўляць па 3 фрэйма за раз, што змяншае эфектыўнасць перадачы, памяншае колькасць перадаванага аўдыё за адну пасылку, і хутчэй прывядзе да заікання аўдыё пры дрэнных радыёўмовах.
Такой жа выявай быў падабраны бітрэйт 551 кбіт/з для EDR 3 мбіт/з: з Bitpool 47, 16 блокамі ў фрэйме, 8 частотнымі дыяпазонамі атрымліваецца памер фрэйма 200 байт, пры бітрэйце 551 кбіт/з. У адну пасылку месціцца 5 фрэймаў ці 14.6/XNUMX мс музыкі.
Алгарытм разліку ўсіх параметраў SBC дастаткова складаны, можна лёгка заблытацца, калі лічыць уручную, таму я зрабіў інтэрактыўны калькулятар у дапамогу тым, хто цікавіцца:
Навошта ўсё гэта патрэбна?
Насуперак ходкаму меркаванню аб якасці гуку кодэка aptX, на некаторых файлах ён можа даваць вынікі горш, чым SBC са стандартным бітрэйтам у 328 кбіт/з.
SBC дынамічна вылучае біты квантавання для частотных палос, дзейнічаючы па прынцыпе ад ніжніх да верхніх . Калі ўвесь бітрэйт выкарыстоўваўся на ніжнія і сярэднія частоты, верхнія частоты абрэжуцца (замест іх будзе цішыня).
aptX квантуе частотныя палосы адной і той жа колькасцю біт увесь час, з-за чаго ў яго сталы бітрэйт: 352 кбіт/з для 44.1 кгц, 384 кбіт/з для 48 кгц, і ён не можа "перанесці біты" на тыя частоты, якія больш за ўсё ў іх маюць патрэбу. У адрозненне ад SBC, aptX не будзе "абрэзаць" частоты, а будзе дадаваць у іх шумы квантавання, памяншаючы дынамічны дыяпазон аўдыё, і часам прыўносіць характэрныя патрэскванні. SBC жа з'ядае дэталі адкідае найболей ціхія ўчасткі.
У сярэднім, у параўнанні з SBC 328k, aptX уносіць менш скажэнняў у музыку з шырокім частотным дыяпазонам, але на музыцы з вузкім дыяпазонам частот і шырокім дынамічным дыяпазонам SBC 328k часам выйграе.
Разгледзім прыватны выпадак. Спектраграма запісу ігры на фартэпіяна:
Асноўная энергія ляжыць у частотах ад 0 да 4 кгц, і працягваецца да 10 кгц.
Спектраграма файла, сціснутага ў aptX, выглядае наступным чынам:
Відаць, што SBC 328k перыядычна цалкам адключаў дыяпазон вышэй за 16 кгц, і расходаваў увесь даступны бітрэйт на дыяпазоны ніжэй гэтага значэння. Аднак, aptX занёс больш скажэнняў у чутны чалавечым вухам спектр частот, што можна бачыць на адыманай арыгінальнай спектраграме з спектраграмы aptX (чым ярчэй, тым больш скажэнняў):
У той час як SBC 328k менш сапсаваў сігнал у дыяпазоне ад 0 да 10 кгц, а астатняе - абрэзаў:
Бітрэйт 485k SBC хапіла, каб захаваць увесь дыяпазон частот, без адключэння палос.
SBC 485k на гэтай кампазіцыі значна апярэджвае aptX у дыяпазоне 0-15 кгц, і з меншай, але ўсё ж прыкметнай розніцай – у 15-22 кгц (чым цямней, тым менш скажэнняў):
Пераключыўшыся на высокабітрэйтны SBC, вы атрымаеце гук, часцяком праўзыходны aptX, на любых слухаўках. На слухаўках, якія падтрымліваюць падлучэнне EDR 3 мбіт/з, бітрэйт 551 кбіт/з дае гук, параўнальны з aptX HD.
А можна яшчэ болей?
У патчы для Android таксама маецца опцыя для яшчэ большага падвышэння бітрэйту для прылад EDR 2 мбіт/з. Можна падвысіць бітрэйт з 452 кбіт/з да 595 кбіт/з, коштам памяншэння стабільнасці перадачы ў складаных радыёўмовах.
Дастаткова ўсталяваць зменную persist.bluetooth.sbc_hd_higher_bitrate у значэнне 1:
# setprop persist.bluetooth.sbc_hd_higher_bitrate 1
Патч на экстрэмальны бітрэйт пакуль прыняты толькі ў LineageOS 15.1/16.0, але не ў XNUMX/XNUMX.
Сумяшчальнасць з прыладамі
SBC Dual Channel падтрымліваецца практычна ўсімі навушнікамі, калонкамі і аўтамабільнымі галаўнымі прыладамі. Гэта няхітра - стандарт загадвае яго падтрымку ў любых дэкадавальных прыладах. Ёсць невялікая колькасць прылад, на якіх гэты рэжым выклікае праблемы, але гэта - адзінкавыя асобнікі.
Больш падрабязна з сумяшчальнымі прыладамі можна азнаёміцца на
Параўнанне адрозненняў гуку
Я зрабіў вэб-сэрвіс, які кадуе аўдыё ў SBC (а таксама aptX і aptX HD) у рэальным часе, прама ў браўзэры. З дапамогай яго вы зможаце параўноўваць гук розных профіляў SBC і іншыя кодэкі, без фактычнай перадачы аўдыё па Bluetooth, на любых правадных слухаўках, калонках, і вашай каханай музыцы, а таксама змяняць параметры кадавання прама падчас прайгравання аўдыё.
Сувязь з распрацоўшчыкамі Android
Я пісаў шматлікім распрацоўнікам Bluetooth-стэка з Google, з просьбай разгледзець уключэнне патчаў у асноўную галінку Android – AOSP, але не атрымаў ніводнага адказу. Мае патчы ў
Я быў бы рады, калі б мне дапамаглі ў сувязі з распрацоўшчыкамі з Google і ўкараненні SBC HD у Android. Патчcет у gerrit ужо састарэлы (гэта адна з ранніх рэвізій), і я яго абнаўлю, калі распрацоўнікаў зацікавяць мае змены (мне няпроста яго абнаўляць, у мяне няма сумяшчальных з Android Q прылад).
Заключэнне
Карыстальнікі смартфонаў з прашыўкамі LineageOS, Resurrection Remix і crDroid могуць здавольвацца палепшанай якасцю гуку ўжо цяпер, дастаткова актываваць опцыю ў наладах Bluetooth-прылады. Карыстальнікі Linux таксама могуць атрымаць падвышаны бітрэйт SBC, шляхам усталёўкі
Крыніца: habr.com