Отстает звук в Bluetooth наушниках на Android и в Windows в играх и видео — как исправить

Многие, впервые подключив беспроводные наушники к Android телефону или ноутбуку с Windows 10, 8.1 или Windows 7, сталкиваются с тем, что звук в Bluetooth наушниках отстает в играх и видео от того, что происходит на экране, что требует решения.
В этой инструкции подробно о том, как исправить отставание звука в Bluetooth-наушниках, чем это может быть вызвано и дополнительная информация, которая может быть полезна в контексте рассматриваемой проблемы.
- Почему отстает звук в Bluetooth наушниках
- Что делать, если звук отстает в играх и видео на Android
- Решения в случае, если аудио по Bluetooth отстает в Windows
- Видео инструкция
Почему отстает звук в беспроводных Bluetooth наушниках
Прежде всего некоторые важные нюансы, касающиеся передачи аудио по Bluetooth, которые стоит знать и учитывать:
- Задержка при передаче звука по Bluetooth есть всегда: где-то отсутствие синхронизации явно заметно, где-то оно проявляется в меньшей степени и на него можно не обращать внимания.
- Время задержки может зависеть от конкретных устройств (смартфона, Bluetooth адаптера на ноутбуке, самих наушников), используемого профиля и кодека (SBC, aptX, LDAC и другие) для передачи аудио, настроек качества передаваемого звука.
При передаче звука по Bluetooth он специальным образом кодируется на передающем устройстве, затем передается по беспроводному каналу на наушники, где буферизируется, преобразуется из цифрового в аналоговый сигнал и только после этого вы его слышите.
Каждый из этапов может занимать определенное время, причем, если судить по тестам, даже первые два шага на некоторых смартфонах независимо от кодеков занимают около 500 миллисекунд (полсекунды), на что уже сложно не обратить внимания. Однако, во многих случаях у нас есть возможность сократить время задержки при передаче аудио по Bluetooth и уменьшить отставание звука от видео и игр.
Что делать, если звук в Bluetooth наушниках отстает на Android
При отставании звука от происходящего на экране на Android телефоне или планшете, вы можете попробовать следующие шаги:
- Проверить, какие кодеки поддерживаются вашими Bluetooth наушниками и попробовать использовать другие кодеки, например, aptX. Один из простых методов для этого — бесплатное приложение «Проверка для A2DP», доступное в Play Маркет https://play.google.com/store/apps/details?id=com.widget7.check.a2dp. После запуска приложения при подключенных наушниках нажмите «Check Bluetooth A2DP» и вы увидите текущий кодек (Current codec) и доступные поддерживаемые кодеки (Selectable codec) с возможностью выбора. При наличии других поддерживаемых наушниками кодеков, попробуйте выбрать их (нажатием по кодеку в разделе Selectable codecs). Есть и другой способ изменения кодека, о котором далее.

- При отставании звука по Bluetooth в интенсивных Android играх можно использовать другое приложение — BTmono, скачать которое можно в Play Маркет: https://play.google.com/store/apps/details?id=com.bedoig.BTmono. После запуска приложения нажмите в нем кнопку «On» (включить). Качество звука станет хуже, но задержка значительно уменьшится, что может позволить более комфортно играть в игры.

- Если включить режим разработчика на Android последних версий, в параметрах разработчика вы найдете возможность ручного выбора кодека Bluetooth (при условии, что он поддерживается наушниками) и других параметров передачи звука. Можно попробовать изменять кодек, качество аудио и посмотреть, как это повлияет на ситуацию.

- Еще один метод, который в редких случаях срабатывает — при подключенных наушниках Bluetooth зайти на телефоне в Настройки — Подключения — Bluetooth, нажать по кнопке настроек конкретных наушников и при наличии такой возможности оставить включенной только опцию передачи аудио/музыки, без возможности вызовов (звонков).

Если проблема возникает при воспроизведении скачанного на телефон видео и фильмов, можно использовать сторонние плееры, которые поддерживают настройку задержки аудио, например, это умеет делать медиа-плеер VLC.

Если ни один вариант не помог, но у вас есть возможность проверить ваш телефон с другими (в идеале — не из дешевых) беспроводными наушниками — попробуйте. Если в этом случае задержка станет незаметной, возможно, основной вклад в задержку вносят сами наушники.
Отставание аудио по Bluetooth в Windows 10, 8.1 и Windows 7
Если рассматриваемая проблема у вас появилась при подключении Bluetooth наушников к ноутбуку или компьютеру с Windows 10, 8.1 или Windows 7, можно попробовать такие методы решения:
- Если вам не требуется возможность связи по беспроводным наушникам с микрофоном, можно зайти в устройства записи и воспроизведения ( Как зайти в «Устройства записи и воспроизведения» Windows 10) и если там на вкладках «Воспроизведение» и «Запись» есть «Наушники» и «Головной телефон» — отключить «Головной телефон» (правый клик — отключить).

- Там же, выбрав наушники на вкладке «Воспроизведение» откройте их свойства и проверьте все вкладки. Отключите любые включенные эффекты, а если на вкладке «Дополнительно» доступно уменьшение качества аудио, попробуйте использовать его.
- Зайдите в Панель управления — Устройства и принтеры, нажмите правой кнопкой мыши по вашим Bluetooth наушникам и откройте их свойства. На вкладке «Службы» попробуйте отключить все службы кроме «Приемник аудио» и применить настройки.

- Вы можете проверить поддерживаемые вашими наушниками и используемые в текущий момент кодеки Bluetooth с помощью программы Bluetooth Tweaker (официальный сайт — https://www.bluetoothgoodies.com/tweaker/, после установки обязательна перезагрузка). Программа платная, но позволяет посмотреть свойства одного из устройств бесплатно: выберите ваши наушники, нажмите «Refresh codec information» и в программе отобразятся поддерживаемые наушниками кодеки (Codec supported by device) и выбранный Windows кодек (Codec selected by Windows). В случаях, когда наушники поддерживают современные кодеки (например, aptX, LDAC), а выбирается стандартный SBC, причиной могут быть не те драйверы Bluetooth адаптера (стоит попробовать установить вручную более новые, а иногда, наоборот, помогают предыдущие версии), отсутствие поддержки со стороны самого адаптера, а в некоторых случаях — устаревшая ОС.

Также, по некоторым отзывам, для Bluetooth-адаптеров Intel 8260, 7265/3165/7260/3160 помогает установка драйверов Intel Bluetooth Audio. Причем эти драйверы отсутствуют на сайте Intel, но есть на сайте Dell (устанавливаются и на другие устройства).
В случае с указанными Wi-Fi/Bluetooth адаптерами Intel модель своего адаптера вы можете в диспетчере устройств в разделе «Сетевые адаптеры». Если у вас один из указанных адаптеров, а на ноутбуке установлена Windows 10, 8.1 или Windows 7 (при этом драйверы Bluetooth должны быть уже установлены):

- Для Intel 8260 загрузите драйвер со страницы https://www.dell.com/support/home/ru/ru/rubsdc/Drivers/DriversDetails?driverId=100J9&fileId=3546946146 (в качестве целевой системы там указана Windows 8.1, но работает и на других версиях ОС).
- Для Intel 7265/3165/7260/3160 загрузите файл со страницы https://www.dell.com/support/home/ru/ru/rubsdc/Drivers/DriversDetails?driverId=90WTD&fileId=3506730032
- Запустите скачанный файл и в открывшемся окне нажмите «Extract» (для распаковки файлов в выбранную папку) и распакуйте файлы.
- Из папки, куда были распакованы файлы, запустите файл «Intel Bluetooth Audio.msi» и выполните процесс установки.
- Перезагрузите компьютер и проверьте, была ли решена проблема со звуком по Bluetooth.
- Если ваши наушники поддерживают кодек aptX, дополнительно зайдите в их свойства в «Устройства записи и воспроизведения» и проверьте, появилась ли новая вкладка для включения этого кодека. Если да — включите его и примените настройки.
Важное примечание: иногда после указанных манипуляций качество звука изменяется не в лучшую сторону, например, появляются прерывания. Если вы с этим столкнулись, снова запустите файл установки, как в шаге 4, но в установщике выберите «Удалить». После удаления перезагрузите компьютер, звук вернется в исходное состояние.
И, если ни одно решение не оказалось полезным, помните, что и сами Bluetooth наушники могут создавать заметную задержку, в таком случае манипуляции в ОС Windows и с драйверами оказываются не применимы.
Видео инструкция
В случае, если ваш сценарий появления проблемы с отставанием звука в Bluetooth наушниках отличается от изложенных — опишите его в комментариях, по возможности с подробностями, будем разбираться.
Что делать, если отстает звук в блютуз-наушниках
Bluetooth-наушники имеют определенные особенности, которые делают их хуже по сравнению с проводными. Одна из них — это отставание звука при передаче аудиоданных, с которым на данный момент ничего нельзя сделать. Задержка звука в наушниках может быть разной: все зависит от аудиокодека и версии Bluetooth, поэтому иногда она вовсе не ощущается. Правда, зачастую задержка является единственной причиной, по которой пользователи отказываются от беспроводной гарнитуры в пользу проводной. Несмотря на это, отставание звука от изображения можно сократить простыми способами. Разберемся, из-за чего возникает задержка звука в блютуз-наушниках и как ее сократить.

Разобрались, почему звук в наушниках отстает от картинки и что с этим делать
❗️ ПОДПИШИТЕСЬ НА НАШ ЯНДЕКС.ДЗЕН, ЧТОБЫ ЧИТАТЬ ЭКСКЛЮЗИВНЫЕ СТАТЬИ, КОТОРЫХ НЕТ НА САЙТЕ
Почему отстает звук в нашуниках
Отставание звука — скорее, фича, а не баг, причем вынужденная. Она возникает из-за того, что аудиоданным, передаваемым со смартфона или ноутбука, необходимо некоторое время для распознавания. Продолжительность задержки для преобразования в аудиосигнал измеряется в миллисекундах — в Bluetooth-наушниках она составляет около 30 мс, а в проводных — 5-10. Одной из главных причин отставания звука является аудиокодек — программа для преобразования звука, которая его сжимает, кодирует и декодирует. Из-за некоторых кодеков возникает большая задержка звука, поэтому пока его не изменят, звук в наушниках будет отставать.

Проводные наушники также имеют отставание звука, но оно крайне мало по сравнению с беспроводными
- Помимо кодека задержка звука в наушниках возникает и по другим причинам.
- Помеха между телефоном и наушниками или плохой сигнал Bluetooth.
- На смартфоне установлены сторонние приложения для настройки эквалайзера или улучшения звука. Их лучше отключить.
- Старая версия Bluetooth: лучше всего, если это Bluetooth 5.0 и выше. Для идеальной работы рекомендуется, чтобы версия модуля совпадала и в смартфоне, и в наушниках.
- Задержка звука возникает из-за подключения дополнительных устройств: например, Wi-Fi, клавиатур или смарт-часов.
- Звук отстает из-за перегрева процессора смартфона или планшета.
А еще в этом виноваты дешевые блютуз-наушники: к их выбору стоит относиться внимательно, иначе начинка вас разочарует, а звук будет подвисать из-за некачественных комплектующих.
❗️ Приложения, удаленные из Google Play, можно найти в нашем удобном каталоге
Как убрать задержку в блютуз наушниках

Есть несколько способов избавиться от задержки в наушниках
Чтобы задержка была менее заметной, можно попробовать сократить ее программно. Для этого вы можете попробовать сменить один кодек на другой.
- Проверьте, какой кодек используют ваши наушники: в настройках подключения он будет отображаться рядом с вашим аксессуаром.
- Проверьте, поддерживают ли ваши наушники более современные кодеки, например, aptX или LDAC.
- После этого активируйте режим разработчика и смените его в настройках.
Современные наушники имеют отдельные приложения для настройки, поэтому сменить кодек можно прямо там без использования режима разработчика. Внимательно изучите инструкцию к ним и попробуйте настроить параметры вручную. Если вдруг проблема не исчезла, попробуйте сделать следующее:
- Подключите наушники к другому устройству и проверьте, осталась ли задержка звука. Если проблемы нет, то все дело в смартфоне, если осталась — в наушниках.
- Включите в подключениях опцию «Видимый для всех».
- Попробуйте оставить в настройках гарнитуры «Только аудио», чтобы звонки не перенаправлялись на нее.
Если все настроили правильно, но видимого эффекта нет, попробуйте перезагрузить смартфон и закрыть лишние приложения.
Чем отличаются версии Bluetooth
Качество работы Bluetooth зависит от версии модуля
В своих статьях мы всегда рекомендуем проверять версию Bluetooth-модуля. Желательно, чтобы в устройстве была установлена версия не ниже 5.0. Вот, почему это так важно.
- Предыдущие версии (Bluetooth 4.0 и 4.2) вышли в 2010-2014 годах, но вы можете заметить, что такие устройства синхронизируются крайне медленно. Более современные модули подключаются в разы быстрее.
- Более новые версии Bluetooth позволяют точнее определять геолокацию.
- Bluetooth 5.0 и выше позволяет подключить одни наушники к нескольким устройствам, а процесс переключения автоматический. Кроме того, ранее можно было использовать только одно приложение для передачи данных, а остальные блокировались.
- В новых версиях Bluetooth скорость передачи данных и расстояние выросли, а энергозатрты — снижены. Особенно это заметно при сравнении с Bluetooth 4.2.
Не менее важен и кодек LC3 — новый стандарт работы для аудиоустройств. Его особенность заключается в снижении энергопотребления и повышения качества звучания. То есть, качество звучания одного и того же трека с одинаковым битрейтом разительно отличается: например, не слышно треска и «плавания» звука при низком качестве.
Так что, именно для этого LC3 и был создан, чтобы заменить кодек SBC, которым мы пользуемся долго время. Еще это отличный способ сэкономить заряд батареи, поэтому автономность наушников должна вырасти уже в ближайшее время. Но чтобы прочувствовать его на все 100, необходимо, чтобы и наушники, и смартфон поддерживали Bluetooth 5.2.
Bluetooth-наушники не идеальны: в нашей статье мы разобрали самые серьезные недостатки, которые должны исправить уже в ближайшем будущем.

Теги
- Наушники для телефона
- Новичкам в Android
- Технология Bluetooth
Наши соцсети
Новости, статьи и анонсы публикаций
Свободное общение и обсуждение материалов
Лонгриды для вас

Android-смартфоны — яркое свидетельство того, что теперь во многих сценариях действительно вкалывают роботы, а не человек. Ведь при помощи приложений с искусственным интеллектом мы можем освободить руки, поручив выполнение поставленной задачи тому самому ИИ, потенциал которого скрывается в наших устройствах. Давайте посмотрим на несколько программ, позволяющих оценить работу нейросетей на Андроид в разных сценариях.

Наши смартфоны постоянно требуют восполнения энергии, однако зарядка далеко не всегда оказывается под рукой. В этой ситуации мы вынуждены искать альтернативные способы набрать недостающие проценты. Если рядом с вами находится ПК или ноутбук, то у вас наверняка возникал вопрос, можно ли зарядить телефон от компьютера. Попробуем вместе ответить на него, а в случае, если такая опция есть, постараемся выяснить, насколько вредно использовать в качестве источника питания внешнее устройство.

Компания Samsung известна своими разработками в области экранов. Именно она раньше других производителей смартфонов стала внедрять AMOLED-матрицы в недорогие девайсы, в то время как конкуренты поголовно использовали IPS-панели с посредственной контрастностью и низким уровнем яркости. Но так было несколько лет назад. В настоящий момент решения Samsung по многим показателям проигрывают даже китайским дисплеям. Почему так случилось и действительно ли сейчас, покупая корейский смартфон, вы получите аппарат с плохим экраном.
Windows Chrome: Исправляем задержку звука по Bluetooth
Совсем недавно мы купили новый ноутбук на Windows человеку, который до сих пор пользовался Mac’ами. Одна из замеченных проблем — при просмотре видео звук в Bluetooth наушниках запаздывает по отношению к видео, причём заметно. Используя slow motion видео на телефоне, мы выяснили, что задержка составляет порядка 200мс. Это много, и это мешает воспринимать речь в видео.


В то же время, на маке нет задержки. Почему так? Давайте разбираться.
Причины задержки звука
Воспроизводимый звук всегда будет отставать от источника. Часть этого отставания вызвана вполне физическими процессами — информация о звуке (в виде электронных сигналов) и собственно звук (в виде колебаний среды) должны дойти до наших ушей. Например, наблюдаемые 200мс — это время, за которое звук преодолевает примерно 70 метров в воздухе. Иными словами, если бы мы сидели в 70 метрах от ноутбука, 200мс было бы вполне ожидаемой задержкой.
Однако, мы не сидим в 70 метрах. А свет распространяется настолько быстро, что временем на распространение электронных сигналов можно пренебречь. Тут на первый план выходит задержка на программную обработку сигнала и буферизацию. Bluetooth — беспроводная связь, подверженная шумам и требующая разных согласований и разделений между устройствами, поэтому данные нельзя передавать в реальном времени. Чтобы звук шёл плавно, нужно на устройстве иметь достаточно большой буфер, который (почти) никогда не заканчивается — если передача застряла по любой причине, устройство продолжит играть звук из буфера.
Это очень краткое и грубое объяснение, если хотите подробностей — см. здесь. Главное, что нам нужно знать — через Bluetooth задержка неизбежна. Это вам не проводные наушники (хотя и там есть небольшая задержка).
Есть aptX LL, который должен снижать задержку для интерактивных приложений, но ни наушники, ни ноут этого протокола не поддерживают. Значит, так или иначе у нас будет минимум ~130мс задержки.
А Mac?
Окей, но ведь мак выводит звук без задержки? На самом деле, это не так. Если провести эксперимент и, написав примитивный HTML, заставить мак вывести аудио неожиданно, мы увидим те же самые ~200мс задержки.

Когда воспроизводится видео (ютуб), мак задерживает видеопоток, чтобы синхронизировать картинку и звук. Это нормально, потому что если видео начнёт воспроизводиться на 200мс позже, вы этого не заметите. Из разных источников, которые сейчас я уже не найду, я выяснил, что мак спрашивает у наушников, через сколько времени они выведут звук, и выводит видео с такой же задержкой.
То есть, мак обманывает нас и тем самым устраняет видимую задержку, хотя физически задержка всё ещё на месте. Я хочу быть обманутым!
Почему же винда этого не делает? Сие есть тайна великая. Цель этой статьи — не разрешить эту загадку, а исправить положение дел хоть как-нибудь.
Цель: заставить хром под виндой выводить видео с задержкой, чтобы аудио и видео синхронизировались.
При этом хотелось бы, чтобы при обновлении хрома/винды всё не сломалось.
Мы не будем пытаться узнать у bluetooth устройства, какая у него задержка, потому что писать драйвера под винду у меня сертификата нет.
Chrome
Мак не может задерживать всё видео подряд, потому что тогда весь интерфейс будет на 200мс в прошлом. Значит, он сообщает в Chrome задержку, и тот уже задерживает видео.
И действительно, можно найти вот это место в коде хрома, где аудиопоток запрашивает задержку, и вот эту функцию, где данные получаются из системы.
Под виндой, как ни странно, тоже есть похожий код, который опирается на функцию IAudioClock::GetPosition. Вот только винда не сообщает реальную позицию на аудио-устройстве, а учитывает только время на формирование потока данных. Я потратил пару часов на анализ того, как GetPosition работает, и что означают записи в реестре по адресу HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\\Parameter

Коротко говоря, я так и не понял. Разбираться в кишках GetPosition и её взаимодействий с остальным стеком без исходников очень тяжело. Это COM, весь построенный на интерфейсах, и там чёрт ногу сломит. Обидно: если бы можно было изменить какое-нибудь значение в реестре и указать задержку, проблема была бы решена.
Но ладно, мы выяснили, что хром готов к задержке под виндой, вот только она о ней не сообщает. А давайте проверим, что будет, если бы сообщала? Качаем исходники хрома, настраиваем сборку, и патчим этот код вот так:

Собираем и запускаем по оф. инструкции. Прошло 6 часов сборки, хром запустился . И видео стало опережать аудио на ~200 мс! Значит, предположение верно, хром может делать задержку.
Мы теперь можем пропатчить хром и, скажем, добавить флаг в chrome://flags , чтобы задавать задержку. Но я могу себе представить, насколько такой флаг понравится хрому. И времени это займёт уйму, и шанс на успех не очень уж большой. Особенно если учесть аналогичный баг под линуксом.
Hack

COM можно перехватывать, если внедрить в Chrome свою DLL, и тогда можно будет управлять возвращаемым из GetPosition значением, чтобы подкручивать задержку так, как нам хочется. Это решение хорошо по нескольким причинам:
- Не сломается с обновлением хрома.
- Будет работать с любой программой, использующей такой же метод доступа к аудио.
- Быстро реализуется.
Но есть одна большая проблема: мы собираемся внедрять DLL в Chrome. Chrome — это браузер, и он очень активно защищается от любого вида внедрений кода, по понятным причинам. Например, здесь описываются защиты, и они довольно серьёзные. Главное ограничение, которое для нас важно — можно динамически грузить только библиотеки, подписанные ключом Microsoft. Шансов, что MS подпишет нашу библиотеку, не то что бы совсем нет, но величина эта из разряда особо малых.
С другой стороны, есть гитхаб проекта, который внедряет DLL в хром! См. тут. Качаем проект, запускам-проверяем, и видим любопытное:

Значит, хром не так уж и защищается? Потираем руки и пишем свою DLL.
DLL
Если коротко, работу DLL можно описать так: построить IAudioClock как-нибудь, и пропатчить его vftable (таблицу виртуальных функций), что автоматически изменит все остальные IAudioClock .
Строим IAudioClock как-нибудь:
CoInitialize(NULL); // Поднимаем инфру COM CoCreateInstance( CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, IID_IMMDeviceEnumerator, (void**)&pEnumerator); // Получаем IMMDeviceEnumerator pEnumerator->GetDefaultAudioEndpoint( eRender, eConsole, &pDevice); // Получаем audio endpoint pDevice->Activate( IID_IAudioClient, CLSCTX_ALL, NULL, (void**)&pAudioClient); // Получаем аудио клиент pAudioClient->GetMixFormat(&pwfx); // Нам нужен формат, получим pAudioClient->Initialize( AUDCLNT_SHAREMODE_SHARED, 0, hnsRequestedDuration, 0, pwfx, NULL); // Инициализируем аудио-клиент pAudioClient->GetService(IID_PPV_ARGS(&pClock)); // Получаем часы InstallComInterfaceHooks(pClock, IID_IAudioClock); // И патчим их
Всё довольно просто и, в целом, следует гайду MS по получению аудио клиента (например, этому).
Замечательно, теперь давайте пропатчим полученный выше pClock :
// Патчит один метод HRESULT HookMethod(IUnknown * original, PVOID proxyMethod, PVOID * originalMethod, DWORD vtableOffset) < // Получаем vftable PVOID* originalVtable = *(PVOID**)original; // Сохраняем оригинальный метод *originalMethod = originalVtable[vtableOffset]; // Патчим! originalVtable[vtableOffset] = proxyMethod; return S_OK; >HRESULT InstallComInterfaceHooks(IUnknown * originalInterface, REFIID riid) < HRESULT hr = S_OK; // Это часы? if (riid == IID_IAudioClock) < ATL::CComPtrso; // Получим интерфейс часов из IUnknown - проверка, что он есть HRESULT hr = originalInterface->QueryInterface(IID_IAudioClock, (void**)&so); if (FAILED(hr)) return hr; // Это что такое? Нам часы нужны. // Снимаем защиту с памяти DWORD dwOld = 0; ::VirtualProtect(*(PVOID**)(originalInterface), sizeof(LONG_PTR)*5, PAGE_READWRITE, &dwOld); DWORD tmp; // Патчим метод GetPosition // Его номер в таблице - 4 HookMethod(so, (PVOID)Hook::GetPositionOriginal, &g_Context->m_OriginalGetPosition, 4); // Возвращаем защиту памяти как была ::VirtualProtect(*(PVOID**)(originalInterface), sizeof(LONG_PTR)*5, dwOld, &tmp); > return hr; >
Единственное, что неочевидно — откуда брать эту четвёрку, номер функции в vftable. Если посмотреть на IAudioClock (тут), видно, что GetPosition в нём под вторым номером ( на MSDN по алфавиту). При этом IAudioClock наследует от IUnknown , в котором три функции ( QueryInterface , AddRef , Release ). Значит, наша GetPosition — пятая, и имеет смещение 4.
DLL в первом приближении готова, и надо проверить её. Я написал примитивную программу, которая ничего особо не делает, только вызывает GetPosition , и внедрил DLL в неё. И всё отработало!
Injection
Я воспользовался тем же самым инжектором, который уже работал, и внедрил библиотеку в хром.
Внедрение происходит более-менее стандартным способом: выделяется участок памяти под путь к файлу с DLL, и создаётся поток с точкой входа на LoadLibrary . Поскольку эта функция принимает ровно один аргумент, его можно передать в CreateRemoteThread , и поток загрузит DLL. Из забавного только то, что kernel32.dll , в которой LoadLibrary находится, не подвержена ASLR, и поэтому её функции всегда имеют один и тот же адрес во всех процессах (одинаковой архитектуры). Поэтому можно найти LoadLibrary в своём процессе и вызвать по тому же адресу в другом.
Итак, я загрузил DLL, и. ничего не произошло. Библиотека внедрилась в хром, но GetPosition не вызывался!
Я приаттачился к chrome.exe дебаггером, и увидел, что GetPosition действительно не вызывается. Что за дела?
Оказывается, за звук в Chrome отвечает особая подсистема, называемая audio.mojom.AudioService . И это отдельный процесс хрома, в который инжектор не инжектит, из-за вот этой вот проверки. Если проверить в этом процессе дебаггером, видно, что GetPosition вызывается. Не беда, убираем проверку, запускаем, и. ничего! Библиотека не появляется в списке библиотек.
Вы знаете, как удобно отлаживать внедрение библиотеки? Учитывая, что это извне созданный поток, который выполняет одну единственную функцию LoadLibrary ? И что эта функция возвращает bool , а ошибка получается через GetLastError , которая для каждого потока своя? Я отвечу — вообще неудобно! Пришлось приаттачиться к процессу chrome.exe, поставить точку останова в LoadLibrary , и после этого вызвать создание потока. Ошибка — STATUS_INVALID_IMAGE_HASH , и это означает, что включилась защита хрома. Эта ошибка возвращается, если библиотека не подписана Microsoft.

См. здесь, страница 29. Получается, хром не защищает корневой процесс, но защищает детей, включая аудио-подсистему.

Но ведь мне дают создать поток в хроме и память читать-писать! И вообще, а как же отладчики это всё делают?
Если гора не идёт к Магомету. Давайте сделаем ручками.
Ручной импорт DLL
Что такое импорт DLL? Что такое делает LoadLibrary , чего мы не можем сделать вручную?
Для нормальной работы DLL нужны следующие действия по её загрузке:
- Загрузить DLL в память процесса.
- Настроить reloc’и.
- Настроить импорты.
- Передать управление в DllMain .
И всё это мы, в целом, можем сделать сами. Часть операций будет производить внешний процесс (выделение памяти, копирование, создание потока), а часть (настройка reloc’ов и импортов, вызов DllMain ) — код загрузчика, который внешний процесс внедряет в chrome.exe.
Код загрузчика (loader’а) должен быть PIC, то есть, poisition-independent, и не должен вызывать никаких библиотечных функций. Тогда этот код будет выглядеть совершенно одинаково в обоих процессах.
Наша библиотека, в свою очередь, не должна ссылаться ни на какие библиотеки, которые не подписаны Microsoft. Но это не проблема — нам нужны две с половиной библиотеки, и они подписаны.
Код загрузчика — многабукав
Давайте посмотрим и разберём код загрузчика — он не очень сложный, но длинный. Я убрал всю обработку ошибок для краткости.
// Структура с данными для лоадера typedef struct _MANUAL_INJECT < PVOID ImageBase; PIMAGE_NT_HEADERS NtHeaders; PIMAGE_BASE_RELOCATION BaseRelocation; PIMAGE_IMPORT_DESCRIPTOR ImportDirectory; pLoadLibraryA fnLoadLibraryA; pGetProcAddress fnGetProcAddress; >MANUAL_INJECT, * PMANUAL_INJECT; // код лоадера, получает указатель на _MANUAL_INJECT DWORD WINAPI LoadDll(PVOID p) < // пропущены объявления ManualInject = (PMANUAL_INJECT)p; pIBR = ManualInject->BaseRelocation; // смещение загрузки модуля относительно ImageBase из файла delta = (ULONGLONG)((LPBYTE)ManualInject->ImageBase - ManualInject->NtHeaders->OptionalHeader.ImageBase); // Reloc'и // Пока есть блоки. while (pIBR->VirtualAddress) < // Если есть reloc'и if (pIBR->SizeOfBlock >= sizeof(IMAGE_BASE_RELOCATION)) < // Каждый reloc - это слово. count = (pIBR->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(WORD); list = (PWORD)(pIBR + 1); for (i = 0; i < count; i++) < if (list[i]) < ptr = (PULONGLONG)((LPBYTE)ManualInject->ImageBase + (pIBR->VirtualAddress + (list[i] & 0xFFF))); // Патчим память! *ptr += delta; > > > // Следующий блок pIBR = (PIMAGE_BASE_RELOCATION)((LPBYTE)pIBR + pIBR->SizeOfBlock); > // Теперь разбираемся с импортами pIID = ManualInject->ImportDirectory; while (pIID->Characteristics) < OrigFirstThunk = (PIMAGE_THUNK_DATA)((LPBYTE)ManualInject->ImageBase + pIID->OriginalFirstThunk); FirstThunk = (PIMAGE_THUNK_DATA)((LPBYTE)ManualInject->ImageBase + pIID->FirstThunk); // Загрузим библиотеку. Тут важно, чтобы она была подписана MS! hModule = ManualInject->fnLoadLibraryA((LPCSTR)ManualInject->ImageBase + pIID->Name); while (OrigFirstThunk->u1.AddressOfData) < if (OrigFirstThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) < // Числовой импорт Function = (ULONGLONG)ManualInject->fnGetProcAddress(hModule, (LPCSTR)(OrigFirstThunk->u1.Ordinal & 0xFFFF)); // Патчим! FirstThunk->u1.Function = Function; > else < // Импорт по имени pIBN = (PIMAGE_IMPORT_BY_NAME)((LPBYTE)ManualInject->ImageBase + OrigFirstThunk->u1.AddressOfData); Function = (ULONGLONG)ManualInject->fnGetProcAddress(hModule, (LPCSTR)pIBN->Name); // Патчим! FirstThunk->u1.Function = Function; > OrigFirstThunk++; FirstThunk++; > pIID++; > // Ищем DllMain if (ManualInject->NtHeaders->OptionalHeader.AddressOfEntryPoint) < EntryPoint = (PDLL_MAIN)((LPBYTE)ManualInject->ImageBase + ManualInject->NtHeaders->OptionalHeader.AddressOfEntryPoint); // И вызываем её! return EntryPoint((HMODULE)ManualInject->ImageBase, DLL_PROCESS_ATTACH, NULL); // Call the entry point > return TRUE; > // Маркер конца кода лоадера DWORD WINAPI LoadDllEnd() < return 0; >// Собственно injector int Inject(DWORD pid, std::wstring dll) < // Нам нужны SE_DEBUG_NAME привилегии if (OpenProcessToken((HANDLE)-1, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) < tp.PrivilegeCount = 1; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; tp.Privileges[0].Luid.LowPart = 20; tp.Privileges[0].Luid.HighPart = 0; AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL); CloseHandle(hToken); >// Будем читать DLL hFile = CreateFile(dll.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); // Open the DLL FileSize = GetFileSize(hFile, NULL); // Местный буфер для DLL buffer = VirtualAlloc(NULL, FileSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); // Читаем DLL ReadFile(hFile, buffer, FileSize, &read, NULL); CloseHandle(hFile); // Парсим DLL pIDH = (PIMAGE_DOS_HEADER)buffer; pINH = (PIMAGE_NT_HEADERS)((LPBYTE)buffer + pIDH->e_lfanew); printf("\nOpening target process.\n"); hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); // Теперь память в процессе под DLL image = VirtualAllocEx(hProcess, NULL, pINH->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); // Скопируем хедеры WriteProcessMemory(hProcess, image, buffer, pINH->OptionalHeader.SizeOfHeaders, NULL); pISH = (PIMAGE_SECTION_HEADER)(pINH + 1); // Теперь саму DLL, посекционно for (i = 0; i < pINH->FileHeader.NumberOfSections; i++) < WriteProcessMemory(hProcess, (PVOID)((LPBYTE)image + pISH[i].VirtualAddress), (PVOID)((LPBYTE)buffer + pISH[i].PointerToRawData), pISH[i].SizeOfRawData, NULL); // Если это код, защитим, чтобы DEP не ругался if (pISH[i].Characteristics & IMAGE_SCN_CNT_CODE) < VirtualProtectEx(hProcess, (PVOID)((LPBYTE)image + pISH[i].VirtualAddress), ((pISH[i].SizeOfRawData - 1) | 4095 + 1), PAGE_EXECUTE_READ, NULL); >> // Теперь будем копировать loader mem = VirtualAllocEx(hProcess, NULL, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); // Allocate memory for the loader code // Заполним структуру для loader'а memset(&ManualInject, 0, sizeof(MANUAL_INJECT)); ManualInject.ImageBase = image; ManualInject.NtHeaders = (PIMAGE_NT_HEADERS)((LPBYTE)image + pIDH->e_lfanew); ManualInject.BaseRelocation = (PIMAGE_BASE_RELOCATION)((LPBYTE)image + pINH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress); ManualInject.ImportDirectory = (PIMAGE_IMPORT_DESCRIPTOR)((LPBYTE)image + pINH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress); ManualInject.fnLoadLibraryA = LoadLibraryA; ManualInject.fnGetProcAddress = GetProcAddress; // Копируем loader и параметры WriteProcessMemory(hProcess, mem, &ManualInject, sizeof(MANUAL_INJECT), NULL); // Write the loader information to target process WriteProcessMemory(hProcess, (PVOID)((PMANUAL_INJECT)mem + 1), LoadDll, (ULONGLONG)LoadDllEnd - (ULONGLONG)LoadDll, NULL); // Write the loader code to target process // Снова успокоим DEP VirtualProtectEx(hProcess, (PVOID)((PMANUAL_INJECT)mem), (ULONGLONG)LoadDllEnd - (ULONGLONG)LoadDll + sizeof(MANUAL_INJECT), PAGE_EXECUTE_READ, NULL); // Вызовем loader - поехали! hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)((PMANUAL_INJECT)mem + 1), mem, 0, NULL); // Create a remote thread to execute the loader code // Ждём, пока поток завершится WaitForSingleObject(hThread, INFINITE); GetExitCodeThread(hThread, &ExitCode); CloseHandle(hThread); VirtualFreeEx(hProcess, mem, 0, MEM_RELEASE); CloseHandle(hProcess); VirtualFree(buffer, 0, MEM_RELEASE); return 0; >
Если отладка загрузки DLL через LoadLibrary была болью, то отлаживать вот это вот — 10/10 боли. Ни один дебаггер не понимает, что этот код — DLL, и не маппит проанализированную DLL с сырцами/PDB на код в процессе. Поэтому отладка без анализа. Приходится параллельно сопоставлять отлаживаемый код и проанализированный.
Отладка с помощью printf()
Альтернатива отладчику — логирование. И здесь бы оно очень подошло, потому что отладчик — боль. Проблема в том, что логирование — тоже боль. Процесс аудио подсистемы chrome не имеет прав на запись файлов (даже в Temp) и на создание ключей реестра — это из того, что я проверил.
Этот процесс точно имеет доступ к CoreAudio, но мне сходу не приходит в голову, как выводить логи при помощи аудио девайсов .
Изучая разные подсистемы, обнаружил, что мне дают создавать сокеты и подключаться к внешним ресурсам. Бинго, пишем логгер, который льёт данные в localhost:7777 и слушаем его через nc -kl 7777 .
Но это не главное. Главное — это работает!
Поиск chrome.exe
Осталось всего ничего — находить процесс хрома и внедряться в него. Это сделано при помощи ETW логов, которые, в частности, сообщают о создании процесса. Для них есть библиотека krabs. И отвратительная документация.
krabs::kernel_trace trace(L"My magic trace"); krabs::kernel::process_provider provider; provider.add_on_event_callback([](const EVENT_RECORD& record, const krabs::trace_context& trace_context) < krabs::schema schema(record, trace_context.schema_locator); if (schema.event_opcode() == 1) < // процесс запускается krabs::parser parser(schema); DWORD pid = parser.parse(L"ProcessId"); auto cmdline = GetProcessCommandLine(pid); // А chrome ли ты? if (cmdline.find(L"chrome") != std::wstring::npos) < // А audio подсистема ли ты? if (cmdline.find(L"--utility-sub-type=audio.mojom.AudioService") != std::wstring::npos) < std::wcout > > >); trace.enable(provider); trace.start();
Дополнительные главы
Подмена GetPosition для всех аудиоустройств начинает мешать, когда Bluetooth наушники отключаются, и задержка пропадает. Опережение звука — куда большая проблема, чем запаздывание, и мы не хотим вручную каждый раз менять задержку. Поэтому нужно бы узнавать, к какому аудио-девайсу относится данный IAudioClock , и настраивать задержку соответственно.
Это приводит к двум проблемам:
- Нужна программа, настраивающая задержки аудиоустройств
- Загруженная DLL должна знать, какому устройству принадлежит IAudioClock
Если первая проблема решается довольно просто (см. код здесь), то вторая оказалась крепким орешком. Сам IAudioClock не предоставляет ровно никаких способов достать из него IMMDevice (у которого есть GetId ) или сам id .
Есть два способа решения этой проблемы.
Отследить построение IAudioClock
Это один из возможных вариантов сопоставления IAudioClock -> IMMDevice. Можно просто перехватить все вызовы создания IMMDevice -> IAudioClient -> IAudioClock , и построить внутренние соответствия между ними.
Это, однако, приводит к ряду проблем. Во-первых, становится необходимо перехватить гораздо больше функций ( IMMDevice::Activate , IAudioClient::GetService , Release для всех трёх), и приходится отслеживать создание и удаление объектов, чтобы память не потекла.
Во-вторых, и это более важная проблема, нужно успеть внедрить DLL, пока аудио-устройства ещё не созданы. Практика показывает, что через ETW логи я не очень успеваю это делать.
Можно было бы пропатчить родительский процесс хрома, чтобы он создавал процессы с CREATE_SUSPENDED , но это очень большой геморрой. И если приложение-инжектор упадёт, хром останется без звука.
Недокументированные подходы

// магия, не трогать
Логика подсказывает, что если IAudioClock не будет знать, какому IAudioClient он принадлежит, он не сможет вычислять положение в потоке. Значит, где-то внутри IAudioClock содержится какая-то ссылка на IAudioClient .
Если раскопать отладчиком, видно, что IAudioClient действительно сохраняется в IAudioClock :

Аналогично, если посмотреть на IAudioClient , нам повезёт, и там сразу будет ссылка на Unicode строку с id девайса:

Окей, чтобы хоть немножко повысить переносимость, давайте не будем фиксировать смещения, а поищем их в динамике:
// Храним смещения (в единицах указателей) struct Offsets < // Адрес клиента внутри часов int clockToClientPtr = -1; // Адрес строки с id внутри клиента int clientToIdPtr = -1; >; Offsets offsets; void FillOffsets(IMMDevice* device, IAudioClient* client, IAudioClock* clock) < // Ищем известный IAudioClient в IAudioClock for (int i = 0; i < 100; ++i) < if (*(((void**)clock) + i) == client) < offsets.clockToClientPtr = i; break; >> LPWSTR id; device->GetId(&id); auto len = lstrlenW(id); // Ищем известный id в IAudioClient for (int i = 0; i < 100; ++i) < LPWSTR ptr = *((LPWSTR*)client + i); if (IsBadReadPtr(ptr, len * 2 + 2)) < // Если в вашем коде есть IsBadReadPtr, что-то не так continue; >if (memcmp(id, ptr, len * 2) == 0) < offsets.clientToIdPtr = i; break; >> CoTaskMemFree(id); >
И дальше что-то такое:
if (offsets.clientToIdPtr != -1 && offsets.clockToClientPtr != -1) < if (!IsBadReadPtr(*((void**)This + offsets.clockToClientPtr), offsets.clientToIdPtr * sizeof(void*))) < void* clientPtr = *((void**)This + offsets.clockToClientPtr); if (!IsBadReadPtr(*((void**)clientPtr + offsets.clientToIdPtr), 20)) < LPWSTR idPtr = *((LPWSTR*)clientPtr + offsets.clientToIdPtr); std::wstring idStr = idPtr; clockToDeviceMap[This] = idStr; myDeviceStr = &clockToDeviceMap[This]; >> >
Ужас, конечно, но работает.
Итог
В итоге я использовал оба подхода — если успели перехватить, записываем в словарь. Если не успели, используем подход с поиском клиента и id по смещениям.
Код разбросан по этому файлу.
Результаты
После патчинга видео и аудио синхронизировались идеально:
Так была исправлена неприятная проблема, и речь в Bluetooth наушниках теперь воспринимается отлично.
Работоспособность проверена только под последними версиями Win10 и Win11, на последнем же Chrome.
Links
- Мой код.
- Injector для Chrome
- Ручное внедрение DLL (x86 версия, требует небольших доработок для x64)
- Krabs
11 основных исправлений задержки звука Bluetooth на iPhone и Android

Когда Apple выпустила iPhone 7 без разъема для наушников, большинство компаний последовали его примеру. Мало ли мы знали, что это может стать новой нормой для смартфонов. Следовательно, наушники Bluetooth стали популярны как никогда. Тем не менее, в некоторых областях они уступают проводным наушникам, и задержка звука Bluetooth является одной из них. Итак, в этой статье мы рассмотрим способы исправления задержки звука Bluetooth на iPhone и Android.
Оглавление

Во время передачи аудиосигнал использует полосу пропускания для прохождения от передатчика к приемнику. Полоса пропускания — это разница между самой высокой и самой низкой частотой аудиосигнала. Проще говоря, чем выше размер и качество аудиофайла, тем выше полоса пропускания, необходимая аудиосигналу для достижения приемника.
Однако иногда пропускной способности может не хватать, и этот процесс будет замедляться — чем ниже пропускная способность, тем медленнее будет процесс передачи сигнала.
Задержка может быть незначительной или время от времени заметно заметной. Итак, если это что-то, что мешает вашему опыту, давайте посмотрим, как это исправить.
Как исправить задержку звука Bluetooth на смартфонах
Вот одиннадцать способов исправить задержку звука Bluetooth на iPhone и Android. Хотя мы проиллюстрировали шаги для iPhone, шаги для вашего устройства Android очень похожи. Давайте начнем с повторного подключения вашего устройства Bluetooth.
1. Повторно подключите ваше устройство
Когда вы «забываете» сопряженное устройство в своем телефоне и снова подключаете его, вы начинаете заново. Все ваши ранее примененные конфигурации будут стерты. Это может помочь вам исправить задержку звука Bluetooth.
Связанный : 7 лучших способов освободить место на Android, не удаляя приложения
Шаг 1: Откройте приложение «Настройки».

Шаг 2: Нажмите на Bluetooth и выберите подключенное устройство.

Шаг 3: Выберите «Забыть это устройство» и нажмите «Забыть устройство» для подтверждения.

Шаг 4: Теперь попытайтесь связать его и выберите свое устройство, когда ваш телефон сможет его найти.

Вот как вы можете повторно подключить устройство Bluetooth. Однако еще один важный фактор, влияющий на задержку, называется интерференцией. Вот что вам нужно знать.
2. Минимизируйте помехи
«Интерференция» возникает, когда нежелательные частотные сигналы препятствуют чистому сигналу между передатчиком (вашим телефоном) и приемником (наушниками). Эти сигналы исходят от таких устройств, как беспроводная мышь, соединения Wi-Fi, телевизор и т. д.

Если вы замечаете задержку звука только при наличии таких устройств, выключите устройство, которое, вероятно, создает помехи. Или вы также можете изолировать эти устройства и держать их на большем расстоянии, пока используете наушники Bluetooth.
Хотя это может помочь вам решить проблему, еще один важный фактор — оставаться в пределах диапазона подключения. Прочтите следующий раздел, чтобы узнать больше.
3. Оставайтесь в пределах досягаемости
Наушники Bluetooth предназначены только для работы на определенном расстоянии от вашего телефона. Для достижения наилучших результатов оставайтесь в пределах этого расстояния. В тот момент, когда вы пройдете дальше указанного расстояния, у вас возникнут проблемы с воспроизведением звука, и вы не сможете правильно слушать звук.
Наряду с тем, чтобы оставаться в пределах досягаемости с минимальными помехами, вам также необходимо помнить об аудиокодеке, на котором работают ваши наушники.
4. Используйте правильный кодек Bluetooth
Ранее мы упоминали, что беспроводная передача звука включает в себя кодирование, декодирование, сжатие и передачу аудиосигнала. Все они работают по алгоритму, который обеспечивает правильную последовательность и методы для завершения процесса.
Этот алгоритм называется кодеком Bluetooth. Доступно несколько кодеков Bluetooth, и они имеют разные механизмы для облегчения процесса передачи. Некоторые кодеки лучше, чем другие, и обеспечивают более высокое качество звука — именно эти кодеки идеально подходят для работы вашего устройства.

SBC — это базовый аудиокодек, и на нем работает большинство обычных наушников. Для получения наилучших результатов проверьте, поддерживают ли ваш телефон и наушники лучшие кодеки, такие как AAC, aptX или LDAC. Они доступны в спецификациях ваших устройств.
Таким образом, это один из способов избавиться от задержки звука Bluetooth на Android и iPhone. Однако наличие в наушниках последней версии Bluetooth также является еще одним важным параметром.
5. Убедитесь, что установлена последняя версия Bluetooth.
Единой версии Bluetooth не существует, и со временем были внесены улучшения за счет выпуска различных итераций одного и того же. Последняя версия — Bluetooth 5.0, в которой реализованы значительные улучшения в передаче звука, что помогает уменьшить задержку звука в наушниках Bluetooth.
Поэтому, когда вы просматриваете спецификацию вашего устройства Bluetooth, убедитесь, что оно работает с последней версией Bluetooth.

Хотя это были некоторые методы, которые включали проверку параметров соединения Bluetooth, мы также можем настроить несколько параметров на нашем телефоне, чтобы решить проблему задержки звука.
6. Отключить энергосбережение
Включение энергосбережения может ограничить выполнение различных действий на вашем телефоне, а также может повлиять на ваше соединение Bluetooth. Следовательно, отключение энергосбережения может помочь вам исправить задержку звука Bluetooth.
Шаг 1: Откройте приложение «Настройки» и выберите «Аккумулятор».
Шаг 2: Обязательно отключите «Режим низкого энергопотребления» или «Экономия заряда батареи» или другие альтернативные переключатели, которые предполагают то же самое.

Если это не сработает, вы можете попробовать перезагрузить устройство.
7. Перезагрузите телефон
Перезагрузка устройства обычно устраняет большинство проблем на вашем устройстве. Это может показаться очевидным методом, но он может просто помочь вам исправить задержку звука Bluetooth на вашем устройстве. Вот как вы можете перезагрузить устройство.
Связанный : 6 лучших способов исправить адаптивную яркость, не работающую на Android
Перезагрузите iPhone
Шаг 1: Во-первых, вам нужно выключить устройство.

- На iPhone X и выше: Нажмите и удерживайте кнопку уменьшения громкости и боковую кнопку.
- На iPhone SE 2-го или 3-го поколения, серий 7 и 8: нажмите и удерживайте боковую кнопку.
- На iPhone SE 1-го поколения, 5s, 5c или 5: Удерживайте кнопку питания вверху.
Шаг 2: Перетащите ползунок питания, чтобы выключить устройство.
Шаг 3: Затем включите устройство, нажав и удерживая кнопку питания на iPhone.
Перезагрузите Android-устройство
Почти все устройства Android отображают меню включения/выключения питания при длительном нажатии кнопки питания. Вы можете использовать опцию «Перезагрузка», чтобы перезагрузить устройство.

8. Убедитесь, что в наушниках достаточно батареи
Еще одна важная причина, по которой вы можете столкнуться с проблемами задержки звука, — это низкий уровень заряда батареи ваших наушников. Быстрая проверка уровня заряда батареи наушников и ее зарядка при необходимости могут помочь вам решить проблему.
- Вы можете легко проверить уровень заряда батареи наушников в строке состояния на всех устройствах.
- Или вы можете загрузить сопутствующее приложение для наушников Bluetooth. чтобы получить всю информацию о ваших наушниках. Вы можете выполнить поиск в Play Store или App Store, если у вашего бренда есть соответствующее приложение.


9. Используйте совместимую Bluetooth-гарнитуру
Вы можете попробовать все эти методы, чтобы исправить задержку звука в наушниках Bluetooth, но ваши попытки могут оказаться тщетными, если ваше устройство вообще не совместимо со смартфоном. Итак, внимательно прочитайте спецификацию ваших наушников и проверьте, есть ли какие-либо исключения для совместимости с определенными устройствами.
10. Обновите программное обеспечение наушников Bluetooth.
Если в ваших наушниках есть сопутствующее приложение, разработанное брендом, вы можете загрузить и установить обновление программного обеспечения. Эти обновления могут исправить ошибки, вызывающие задержки звука.
Мы используем Samsung Galaxy Buds Live, а приложение Samsung Earbuds поможет вам обновить программное обеспечение.

Если ни один из этих методов не работает, в крайнем случае вы можете сбросить настройки наушников Bluetooth.
11. Сброс Bluetooth-наушников
Сброс настроек наушников Bluetooth может помочь вам начать все заново и, возможно, решить проблему задержки звука.
На некоторых наушниках есть физическая кнопка, с помощью которой можно сбросить настройки. Инструкции будут различаться для каждого устройства, и вы можете прочитать краткое руководство, входящее в комплект поставки.
Однако, если у вас есть сопутствующее приложение для того же, вы можете быстро сбросить настройки наушников.

Это все методы, которые мы можем предложить, чтобы помочь вам исправить задержку звука Bluetooth на iPhone и Android. Если у вас есть дополнительные вопросы, вы можете взглянуть на следующий раздел.
Часто задаваемые вопросы о задержке звука Bluetooth
1. Увеличивает ли шумоподавление задержку?
Нет, шумоподавление не имеет ничего общего с задержкой звука в Bluetooth.
2. Какова задержка AirPods?
AirPods имеют задержку около 250-270 мс.
3. Как получить нулевую задержку?
Задержка звука в наушниках Bluetooth — это не ошибка, а внутренняя характеристика. Следовательно, нулевая задержка невозможна в наушниках Bluetooth. Лучше всего выбрать проводные наушники.
4. Улучшает ли Spatial Audio задержку?
Известно, что пространственное аудио не оказывает существенного влияния на задержку звука.
5. Может ли Hi-Ress Lossless Audio в Apple Music увеличить задержку?
Возможно — поскольку качество звука высокое, это приводит к большему размеру аудиофайла. И если у ваших наушников недостаточно пропускной способности для его обработки, вы можете столкнуться с задержкой звука.
Минимизируйте задержку звука для наилучшего качества звука
Это все способы исправить задержку звука Bluetooth на Android и iPhone. Очевидно, что эта проблема может стать довольно раздражающей, когда вы посещаете важный звонок на работе. Следовательно, вы можете рассмотреть эти наушники Bluetooth для звонков.