Как стать автором
Обновить

Комментарии 54

В списке рассылки PulseAudio в настоящее время идет обсуждение поддержки высокого битрейта в SBC. В 13-ю версию точно не попадет, но в 14-ю может.
Да, об этом сказано в заключении. Ещё есть патчи github.com/EHfive/pulseaudio-modules-bt, которые добавляют поддержку aptX, aptX HD, AAC и LDAC.

вопрос не по теме, если известно что не все люди слышат полный спектр 20-20000Hz можно обрезать неслышимое в исходной композиции и заполнить канал передачи данных более важными слышимыми частотами добавив детальности

Точно, хотел об этом написать, но забыл.

Чтобы улучшить качество SBC без модификации стека (да и, в принципе, любого аудиокодека, но не aptX), имеет смысл обрезать верхние частоты, которые вы не слышите.
На стандартном профиле используется 8 частотных диапазонов, т.е. аудио нарезается на 8 диапазонов по 2756 Гц (для 44.1 кГц). Если полностью подавить верхние частотные диапазоны эквалайзером плеера, то битрейт будет более эффективно расходоваться на слышимые диапазоны.
Например, я не слышу выше ≈16500 Гц, это как раз на границе разделения частот SBC (2756 * 6 = 16536). Убрав всё, что выше 16536 Гц, я улучшу качество аудио для своих ушей.

Энкодеры психоакустических кодеков, как правило, сами обрезают диапазоны выше какой-то частоты, в зависимости от битрейта.
А что посоветуете делать с Windows? Можно оптимизировать правкой реестра? Можно, конечно и бинарники пропатчить, но для Windows Mobile это чутка сложнее.
Я пробовал найти библиотеки, ответственные за кодирование SBC и aptX, и что-то ничего не нашел. Не подскажу.
Скорее всего за это отвечает драйвер.
Таки спасибо за статьи, люблю Bluetooth.
Есть интеловский драйвер вроде из DELL вьірезаньій, которьій позволяет включать в виндовс аптХ, правда только на устройствах интел скорее всего. Даже на хабре статья бьіла. Может можно что-то оттуда дернуть.
В Windows 10 и так есть поддержка aptX.
На неофициальном LOS 16 для Lenovo Tab 4 10 Plus патч действует. На RR 7.0.2 для Redmi Note 5 опции нет. Не успели включить патч в код?
Патч включили 13-14 мая. Сборка прошивки должна быть от этого числа или позже.
А есть ли смысл во всём этом? Dual Channel — это режим, который рекомендуется разве что для случаев, когда в разных дорожках идёт абсолютно разный сигнал. Во всех остальных случаев его использование как правило не улучшает, а только ухудшает качество. 452 делим на 2 — получаем 226 килобит на каждый канал.
Joint Stereo и Stereo используют 328 при стандартных параметрах, если я правильно понимаю. Но в этих режимах, особенно в первом используется декорреляция каналов, и если звук не очень различается — это позволяет здорово экономить битрейт и оставлять больше полезной информации. Так что во многих случаях мы теоретически можем получить более 226 килобит на канал, хотя это и будет варьироваться на протяжении трека.
PS Эти рассуждения справедливы по отношению к кодерам mp3. В случае с SBC я конечно что то могу не знать, поэтому прошу заранее извиняюсь, если это так.
У меня сразу были опасения о целесообразности переключения с Joint Stereo на, фактически, двойное моно, но, к счастью, удвоение битрейта от переключения даёт больше, чем забирает.
Joint Stereo 328 kbit/s примерно соответствует по качеству (на музыке в среднем) Dual Channel 396 kbit/s. Так как на многих наушниках с патчем можно использовать 551 кбит/с, то да — переключение на Dual Channel даёт значительное увеличение качества аудио, и смысл в этом есть.
Эффект от 452 кбит/с, конечно, ниже, но тоже по спектрограмме заметен.

Воспользуйтесь онлайн-энкодером, чтобы вживую оценить эффект. Возьмите, например, профиль Joint Stereo и bitpool 20 (битрейт 146 кбит/с) и Dual Channel bitpool 17 (битрейт 221 кбит/с). Dual Channel звучит намного лучше.
Да, с настройками, описанными вами действительно Dual Stream с большим битрейтом звучит лучше. Но тут, возможно, результат ещё от конкретных реализаций может зависеть. Вообще конечно чувствуется, что кодек очень слабый, и явно создавался с прицелом на низкую сложность вычислений, а не качество. Даже mp2 на подобных битрейтах звучит несравненно лучше.
Спасибо вам за обе статьи, получил большое удовольствие от прочтения. Хотя и не одобряю в целом прослушивание музыки по блютузу из за того, что при множестве перекодирований в уши приходит пережатая каша. И даже lossless уже не lossless.
На всякий случай замечу, чтобы устранить возможное недопонимание: Joint Stereo в SBC — M/S stereo coding, а не Intensity stereo coding, т.е. просто центральный канал и разница между каналами, без потерь.
Было, но не от меня. Этой статьёй я хотел рассказать, как я пришел к идее использования Dual Channel, почему были выбраны именно такие битрейты, и сделать анонс о включении патча в Android-прошивки.
Разбор Bluetooth-стека, проверка идеи, создание патчей, тестирование совместимости началось около года назад, на основе чего и была написана статья по указанной вами ссылке.
Записал лог обмена со своей старенькой SonyEricsson MW600, немного удивился. Гарнитура заявляет поддержку SBC Bitpool от 2 до 249, ваш онлайн-энкодер такого не умеет как заявляет она )))

А насчет перехода на Dual Channel — я не совсем понял, чем это лучше поднятия bitpool в Joint Stereo? Ну, кроме того что не все наушники это смогут?
SBC Bitpool от 2 до 249, ваш онлайн-энкодер такого не умеет как заявляет она
Это значит, что у ваших наушников нет верхнего лимита bitpool. А онлайн-энкодер не позволяет выставить такой высокий bitpool, потому что 250 на Dual Channel даёт битрейт в 2789 кбит/с — почти в 2 раза больше, чем несжатый оригинал! Так что это не сжатие, а разжатие какое-то получается.

А насчет перехода на Dual Channel — я не совсем понял, чем это лучше поднятия bitpool в Joint Stereo?
Ничем, это хуже, чем Joint Stereo, при равных условиях. Но очень мало моделей наушников имеет неограниченный bitpool, обычно всё заблокировано на 53, поэтому Dual Channel используется исключительно в качестве средства обхода этой проблемы.
Ничем, это хуже, чем Joint Stereo, при равных условиях.
Хм… тогда надо в Android добавить вариант поднятия bitpool. Как минимум, протестировать — реально ли гарнитура может больше 53, или только обещает. Тем более что увидел в теме на 4pda отрицательный результат на DualChannel для неё.
Не подскажете, как (где) по-быстрому выставить больший bitpool? Как раз будет мне повод собрать LineageOS 14.1 (оптимально на мой телефон).
Попробовал посчитать MAX_SBC_HQ_FRAME_SIZE_44_1 — у меня получается 165.875, а не 165 как в патче. Понятно, что размер фрейма не может быть дробным — но округлять по логике надо в большую сторону.

Использовал формулу из embdrv/sbc/decoder/include/oi_codec_sbc.h:
#define SBC_MAX_FRAME_LEN (SBC_HEADER_LEN + \
                             ((SBC_MAX_BANDS * SBC_MAX_CHANNELS / 2) + \
                              (SBC_MAX_BANDS + SBC_MAX_BLOCKS * SBC_MAX_BITPOOL + 7)/8))


Где правда? :)
Странно, в этой формуле есть BITPOOL + 7. Откуда 7 — непонятно, вроде и не заголовок, и не выравнивание. По формуле из спецификации A2DP (которая в статье) получается ровно 165.

Насколько вижу, эти дефайны используются только при проблемах в подсчёте длины фрейма (видимо, когда энкодер ещё не до конца инициализирован), поэтому, даже если они неправильные, то, видимо, особой проблемы это не представляет, но я посмотрю, спасибо за замечание.
(( X+N-1 ) / N) — стандартный способ округления вверх при целочисленном делении в случае положительных X и N
А в AOSP не пробовали закоммитить? Чтоб не только у альтернативных прошивок, но попробовало просочиться немного везде (конечно, вендоры наверн будут отключать, но всё же...). (извините, нашёл ответ в статье)

И, кстати, как проверить, что всё работает? Вот я подключил свои наушники с режимом Dual Channel в настройках разработчика и включенным HD Codec: SBC в настройках устройства, звук идёт, но я без понятия, «разогнан» ли он до повышенного битрейта по итогу.

Надеюсь что «экстремальный звук» добавят в том числе в LOS 16!
И, кстати, как проверить, что всё работает? Вот я подключил свои наушники с режимом Dual Channel в настройках разработчика и включенным HD Codec: SBC в настройках устройства, звук идёт, но я без понятия, «разогнан» ли он до повышенного битрейта по итогу.
Как вариант — снять дамп и проанализировать его либо вручную, либо загрузив на btcodecs.valdikss.org.ru.
Результат


То есть я правильно понял, что поидее система его успешно подхватила? Вопрос правда почему в Used Audio он написал две строчки… Переключался туда-сюда что-ли?
Если что, у меня LOS 16.
Да, всё в порядке. Да, переключается, сначала выбирается Joint Stereo, затем Dual Channel. Если вы включите на несколько секунд музыку во время записи дампа, анализатор покажет ещё и битпул последнего аудиопакета.
Для окончательного понимания, что же у меня происходит с наушниками, пригодился ваш коммент из соседней статьи, спасибо! А то я заметил, что вроде сначала ОС и наушники рапортуют об успешном подключении, потом внезапно телефон отключает их и подключается к ним заново. Я-то думал, у меня что-то глючит, а оно вот что… Видимо, по дефолту по запросу наушников выбирается режим SBC Joint Stereo, а потом срабатывает форсированный оверрайд на Dual Channel и идёт заново переподключение.
У вас всё же телефон подключается к наушникам. Установка сначала Joint Stereo, затем Dual Channel — особенность моего патча (вернее, стека Android). Нужно было больше менять, чтобы подключение устанавливалось без переключения, но и тот вариант, что используется сейчас, соответствует стандарту, поэтому я не стал переделывать.

Ага, то есть когда я вижу такое переключение, это значит что сработал ваш патч. Хорошо, спасибо!


Кстати, пока я в настройках разработчика не выставил dual channel (но при этом HD Codec: SBC был включен), мне кажется что наушники всё равно через joint stereo подключались… Но я это ещё наверное потестирую, ибо не уверен.

Последние результаты
```Connection:
20:74:cf:06:91:b4 (TREKZ Titanium by AfterShokz) → 22:22:1d:dd:c3:6a (TriOpMobile)

Supported codecs:
Audio SBC (44100 | Mono DualChannel JointStereo | block: 4 8 12 16 | subbands: 8 | allocation: Loudness | bitpool: 2..53)
Audio MPEG-2,4 AAC
Audio non-A2DP (aptX — 44100 48000, Stereo)
Audio non-A2DP (aptX HD — 44100 48000, Stereo)
Audio non-A2DP (LDAC — 44100 48000 88200 96000, DualChannel Stereo)
Audio SBC (44100 | Mono DualChannel JointStereo | block: 4 8 12 16 | subbands: 8 | allocation: Loudness | bitpool: 2..53)

Used for audio:
Audio SBC (44100 | JointStereo | block: 16 | subbands: 8 | allocation: Loudness | bitpool: 2..53)

Connection:
22:22:1d:dd:c3:6a (TriOpMobile) → 20:74:cf:06:91:b4 (TREKZ Titanium by AfterShokz)

Supported codecs:
Audio MPEG-1,2 Audio
Audio SBC (16000 32000 44100 48000 | Mono DualChannel Stereo JointStereo | block: 4 8 12 16 | subbands: 4 8 | allocation: SNR Loudness | bitpool: 2..53)
Audio MPEG-1,2 Audio
Audio SBC (16000 32000 44100 48000 | Mono DualChannel Stereo JointStereo | block: 4 8 12 16 | subbands: 4 8 | allocation: SNR Loudness | bitpool: 2..53)

Used for audio:
Audio SBC (44100 | DualChannel | block: 16 | subbands: 8 | allocation: Loudness | bitpool: 2..53)
Audio SBC (44100 | JointStereo | block: 16 | subbands: 8 | allocation: Loudness | bitpool: 2..53)
Audio SBC (44100 | DualChannel | block: 16 | subbands: 8 | allocation: Loudness | bitpool: 2..53)

Latest SBC Bitpool value: 38
```

Эти замеры сделал без форсированного DualChannel в настройках разработчика.

Судя по bitpool и выбранной DualChannel конфигурации получается что наушники у меня работают на скорости 452 kbit/s, я правильно понял? То есть у меня устройство с EDR 2 mbit/sec?

В таком случае особенно сильно жду патча на увеличенный битрейт! В любом случае спасибо!
Судя по bitpool и выбранной DualChannel конфигурации получается что наушники у меня работают на скорости 452 kbit/s, я правильно понял?
Да.

То есть у меня устройство с EDR 2 mbit/sec?
Да, поддерживает только EDR 2 мбит\с.
В macos бы еще можно было бы как-то это сделать, или AptX HD с LDAC добавить…
Говорят Apple не лицензировала AptX HD для своих устройств. Если наушники поддерживают AAC, то можно заставить работать через него Bluetooth Explorer'ом.
Или через терминал:
sudo defaults write bluetoothaudiod "Enable AAC codec" -bool true
А можно как-то этот патч реализовать не в качестве отдельной прошивки, а в качестве модуля для Magisk, например?
Такой патч есть, доступен в репозитории Magisk, но работает он только на определенных устройствах, и его работоспособность зависит от оптимизаций компилятора при сборке прошивки.
Спасибо за прекрасную новость! Но я нашёл в репозитории Magisk 19.2 только патч «Bluetooth stack audio bitrate changer for SBC...» за авторством Gray Jack the Fixxxer. Это оно самое?
Да, это оно. Прочтите описание модуля.
Спасибо большущее за наводку! Музыка и вправду стала ощутимо лучше звучать. Теперь особо и проводом нет смысла цеплять смартфон к головному устройству в авто.
Есть ли инструкция по установке патча?
Применить к исходному коду, скомпилировать прошивку, прошить на телефон.
Не подскажете, а как можно воспользоваться плодами вашей работы на Pixel Experience? Использую данную CAF сборку, и к сожалению, опции как на скриншоте обнаружить не могу на двух наушниках, хотя даже выставил приоритет кодеку SBC в настройках для разработчиков, а подключался от телефона к наушникам

Скриншот
image
Похоже, разработчики Pixel Experience включили патчи для Bluetooth-стека, но не для интерфейса. Возможно, они просто не глядя вливают изменения из некоторых репозиториев LineageOS. Изменениями не получится воспользоваться. Напишу разработчикам этой прошивки.
НЛО прилетело и опубликовало эту надпись здесь
Почему вы считаете, что колонка поддерживает aptX и LDAC?
НЛО прилетело и опубликовало эту надпись здесь
В Supported codecs отображаются кодеки, поддерживаемые колонкой, а не телефоном.
Шёл 21 мать его век, почти 2020 год, а bluetooth до сих пор не умеет передавать несжатый аудиопоток в несчастные 1.2Mbit.

Почти 2025 год. По-прежнему всякие хитрые кодеки с лицензионными отчислениями для ужатия потока в целых 2 раза вместо того, чтобы просто увеличить пропускную способность канала...

Хех, снял дамп обмена с магнитолой (Sony BT-2600), она оказывается умеет MPEG Layer 3. Жаль что Android это не поддерживает :(
Сергей Смирнов с сайта SoundExpert провёл тесты SBC Dual Channel 452 кбит/с и 551 кбит/с.
soundexpert.org/articles/-/blogs/audio-quality-of-sbc-xq-bluetooth-audio-codec

Тест заключается в измерении отличий (артефактов) между оригиналом и каждым из тестируемых кодеков, с учетом дистанции Спирмена, показывающей, насколько разумно использовать такой подход для сравнения кодеков.
По его тестам, SBC 452 кбит/с вносит меньше искажений в ставнении с aptX, а SBC 551 кбит/с находится на одном уровне с aptX HD.
На Mac OS после изучения ваших текстов поднял bitpool при помощи SBC bitpool expander, к своему удивлению обнаружил, что joint-stereo с битпулом 93 мои простые наушники (JBL live 400BT) вполне себе переваривают. Теперь еще более интересно, почему по умолчанию стандарт зажат в такие рамки.
Сначала даже не поверил, что программа работает, но при экстремально низких и экстремально высоких битпулах слышно, как звук меняется в худшую сторону и заикания начинаются соответственно.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории