Комментарии 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 Гц, я улучшу качество аудио для своих ушей.
Энкодеры психоакустических кодеков, как правило, сами обрезают диапазоны выше какой-то частоты, в зависимости от битрейта.
Чтобы улучшить качество SBC без модификации стека (да и, в принципе, любого аудиокодека, но не aptX), имеет смысл обрезать верхние частоты, которые вы не слышите.
На стандартном профиле используется 8 частотных диапазонов, т.е. аудио нарезается на 8 диапазонов по 2756 Гц (для 44.1 кГц). Если полностью подавить верхние частотные диапазоны эквалайзером плеера, то битрейт будет более эффективно расходоваться на слышимые диапазоны.
Например, я не слышу выше ≈16500 Гц, это как раз на границе разделения частот SBC (2756 * 6 = 16536). Убрав всё, что выше 16536 Гц, я улучшу качество аудио для своих ушей.
Энкодеры психоакустических кодеков, как правило, сами обрезают диапазоны выше какой-то частоты, в зависимости от битрейта.
Я пробовал найти библиотеки, ответственные за кодирование SBC и aptX, и что-то ничего не нашел. Не подскажу.
Есть интеловский драйвер вроде из DELL вьірезаньій, которьій позволяет включать в виндовс аптХ, правда только на устройствах интел скорее всего. Даже на хабре статья бьіла. Может можно что-то оттуда дернуть.
На неофициальном LOS 16 для Lenovo Tab 4 10 Plus патч действует. На RR 7.0.2 для Redmi Note 5 опции нет. Не успели включить патч в код?
А есть ли смысл во всём этом? Dual Channel — это режим, который рекомендуется разве что для случаев, когда в разных дорожках идёт абсолютно разный сигнал. Во всех остальных случаев его использование как правило не улучшает, а только ухудшает качество. 452 делим на 2 — получаем 226 килобит на каждый канал.
Joint Stereo и Stereo используют 328 при стандартных параметрах, если я правильно понимаю. Но в этих режимах, особенно в первом используется декорреляция каналов, и если звук не очень различается — это позволяет здорово экономить битрейт и оставлять больше полезной информации. Так что во многих случаях мы теоретически можем получить более 226 килобит на канал, хотя это и будет варьироваться на протяжении трека.
PS Эти рассуждения справедливы по отношению к кодерам mp3. В случае с SBC я конечно что то могу не знать, поэтому прошу заранее извиняюсь, если это так.
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 звучит намного лучше.
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.
Спасибо вам за обе статьи, получил большое удовольствие от прочтения. Хотя и не одобряю в целом прослушивание музыки по блютузу из за того, что при множестве перекодирований в уши приходит пережатая каша. И даже lossless уже не lossless.
Так вроде было уже habr.com/ru/post/433502
Было, но не от меня. Этой статьёй я хотел рассказать, как я пришел к идее использования Dual Channel, почему были выбраны именно такие битрейты, и сделать анонс о включении патча в Android-прошивки.
Разбор Bluetooth-стека, проверка идеи, создание патчей, тестирование совместимости началось около года назад, на основе чего и была написана статья по указанной вами ссылке.
Разбор Bluetooth-стека, проверка идеи, создание патчей, тестирование совместимости началось около года назад, на основе чего и была написана статья по указанной вами ссылке.
Записал лог обмена со своей старенькой SonyEricsson MW600, немного удивился. Гарнитура заявляет поддержку SBC Bitpool от 2 до 249, ваш онлайн-энкодер такого не умеет как заявляет она )))
А насчет перехода на Dual Channel — я не совсем понял, чем это лучше поднятия bitpool в Joint Stereo? Ну, кроме того что не все наушники это смогут?
А насчет перехода на 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 (оптимально на мой телефон).
review.lineageos.org/c/LineageOS/android_system_bt/+/229574/1
Не смотрите на описание коммита — ссылка на патчсет первой версии, он увеличивает и битпул тоже.
Не смотрите на описание коммита — ссылка на патчсет первой версии, он увеличивает и битпул тоже.
Попробовал посчитать MAX_SBC_HQ_FRAME_SIZE_44_1 — у меня получается 165.875, а не 165 как в патче. Понятно, что размер фрейма не может быть дробным — но округлять по логике надо в большую сторону.
Использовал формулу из embdrv/sbc/decoder/include/oi_codec_sbc.h:
Где правда? :)
Использовал формулу из 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
И, кстати, как проверить, что всё работает? Вот я подключил свои наушники с режимом 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
```
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?
В таком случае особенно сильно жду патча на увеличенный битрейт! В любом случае спасибо!
В macos бы еще можно было бы как-то это сделать, или AptX HD с LDAC добавить…
А можно как-то этот патч реализовать не в качестве отдельной прошивки, а в качестве модуля для Magisk, например?
Такой патч есть, доступен в репозитории Magisk, но работает он только на определенных устройствах, и его работоспособность зависит от оптимизаций компилятора при сборке прошивки.
Спасибо за прекрасную новость! Но я нашёл в репозитории Magisk 19.2 только патч «Bluetooth stack audio bitrate changer for SBC...» за авторством Gray Jack the Fixxxer. Это оно самое?
Есть ли инструкция по установке патча?
Не подскажете, а как можно воспользоваться плодами вашей работы на Pixel Experience? Использую данную CAF сборку, и к сожалению, опции как на скриншоте обнаружить не могу на двух наушниках, хотя даже выставил приоритет кодеку SBC в настройках для разработчиков, а подключался от телефона к наушникам
Скриншот

Шёл 21 мать его век, почти 2020 год, а bluetooth до сих пор не умеет передавать несжатый аудиопоток в несчастные 1.2Mbit.
Хех, снял дамп обмена с магнитолой (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.
soundexpert.org/articles/-/blogs/audio-quality-of-sbc-xq-bluetooth-audio-codec
Тест заключается в измерении отличий (артефактов) между оригиналом и каждым из тестируемых кодеков, с учетом дистанции Спирмена, показывающей, насколько разумно использовать такой подход для сравнения кодеков.
По его тестам, SBC 452 кбит/с вносит меньше искажений в ставнении с aptX, а SBC 551 кбит/с находится на одном уровне с aptX HD.
В LineageOS 17.1 эти изменения попали? Интересуюсь, потому что пользователи не могут найти ползунок в настройках аудиоустройства.
На Mac OS после изучения ваших текстов поднял bitpool при помощи SBC bitpool expander, к своему удивлению обнаружил, что joint-stereo с битпулом 93 мои простые наушники (JBL live 400BT) вполне себе переваривают. Теперь еще более интересно, почему по умолчанию стандарт зажат в такие рамки.
Сначала даже не поверил, что программа работает, но при экстремально низких и экстремально высоких битпулах слышно, как звук меняется в худшую сторону и заикания начинаются соответственно.
Сначала даже не поверил, что программа работает, но при экстремально низких и экстремально высоких битпулах слышно, как звук меняется в худшую сторону и заикания начинаются соответственно.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Модифицируем Bluetooth-стек для улучшения звука на наушниках без кодеков AAC, aptX и LDAC