Многие, впервые подключив беспроводные наушники к 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, но в установщике выберите «Удалить». После удаления перезагрузите компьютер, звук вернется в исходное состояние.
Также как и в случае с Android — для скачанного видео вы можете настроить задержку аудио в проигрывателе, например в медиа-плеере VLC вы можете найти такую настройку в меню «Инструменты — Синхронизация дорожек».
И, если ни одно решение не оказалось полезным, помните, что и сами Bluetooth наушники могут создавать заметную задержку, в таком случае манипуляции в ОС Windows и с драйверами оказываются не применимы.
Видео инструкция
В случае, если ваш сценарий появления проблемы с отставанием звука в Bluetooth наушниках отличается от изложенных — опишите его в комментариях, по возможности с подробностями, будем разбираться.
Время на прочтение15 мин
Количество просмотров29K
Совсем недавно мы купили новый ноутбук на 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\{GUID}\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::CComPtr<IAudioClock> so;
// Получим интерфейс часов из 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<uint32_t>(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 << "Found process " << pid << ", injecting...\n";
Inject(pid, L"ChromePatcherDll.dll");
}
}
}
});
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
Table of contents
- Troubleshooting Steps to Take Before Fixing Bluetooth Speaker Delay
- How to Fix the Bluetooth Audio Delay on Windows 10/11?
- Solution 1: Reconnect the Bluetooth audio device to your computer
- Solution 2: Use the Windows audio playback troubleshooter
- Solution 3: Update your Bluetooth driver
- Solution 4: Restart the Windows audio service
- Solution 5: Remove other device interference
- Solution 6: Look at hardware issues
- Solution 7: Ensure the media player is not the issue
- Solution 8: Check the file and format compatibility
- Conclusion
- FAQ
Bothered by audio delay on Windows? This guide offers simple yet effective ways to fix the problem if your Bluetooth isn’t working!
You really want to know how to fix the Bluetooth lag on your PC. We get it. Say, you are watching a movie—a thriller. But the audio from your Bluetooth speakers just won’t sync with the dialog. So, as a hooded figure steps out from behind the curtains, you get to hear the screams seconds later—and this just ruins the whole experience.
This just isn’t right. So, let us show you how to fix the Bluetooth audio lag on Windows 10. The steps are easy to follow, and we’ll show them in detail.
Let’s begin.
Troubleshooting Steps to Take Before Fixing Bluetooth Speaker Delay
Before we get into the Bluetooth headphone’s audio delay fixes, let’s try a few simple things:
- Make sure your Bluetooth audio device can support the Bluetooth version on your computer.
Note
For instance, if your speakers can only handle Bluetooth 2.0, the small bandwidth may not be able to deliver the high bit rate of the audio stream. In this case, you must find a device that supports Bluetooth 4.0 .
- You should also check if your Bluetooth audio device has enough battery .
- Next, check if the Bluetooth device you are using is close enough to your computer.
- Also, it’s best to reduce the interference by switching off nearby Bluetooth devices.
If these initial troubleshooting steps do not fix the Bluetooth audio delay, check the solutions in the next section.
Related: [FIXED] Bluetooth Connected But No Sound in Windows 10/11
How to Fix the Bluetooth Audio Delay on Windows 10/11?
Now, let’s get into what you can do to get rid of the Bluetooth audio delay.
Solution 1: Reconnect the Bluetooth audio device to your computer
The quickest thing you can do to fix Bluetooth latency is to reconnect your Bluetooth device. Simply unplug it from your computer, switch it back on, and reconnect it to your PC.
You can move on to the next solution below if the audio is still lagging.
Related: Bluetooth Not Working in Windows 10/11: How to Fix?
Solution 2: Use the Windows audio playback troubleshooter
Windows 10 has lots of great features, and the built-in troubleshooters are among them. So, if you are running into a Bluetooth audio delay, you can run the Windows audio playback troubleshooter.
Here are the steps you need to follow:
- Go to the lower-right corner of your taskbar.
- Right-click the sound icon.
- Choose Troubleshoot sound problems from the list.
- If prompted to provide permission to the app, click Yes . Doing this should let you run the Windows audio playback troubleshooter.
- A window will pop out. Click Next .
- Choose your Bluetooth audio device, then click Next .
- Troubleshoot the sound lag issue by following the on-screen instructions.
Check to see if the Bluetooth audio delay has been resolved.
Fix this issue quickly
You can try using a safe and totally free tool developed by the Auslogics team of experts.
A few simple steps to troubleshoot the issue:
Download the tiny Auslogics TroubleShooter tool.
Run the application (no installation is needed).
The app will check for the issue mentioned in the article. When the scan is done, check that this is the issue you were looking to solve and click ‘Apply now’ to apply the recommended fix.
You can use the app to troubleshoot other malfunctions for free by simply typing in a brief description of the issue your PC is experiencing. Or you can scan your PC for performance issues using the My Scanner tab.
Solution 3: Update your Bluetooth driver
You may be experiencing Bluetooth speaker delay because you have an outdated, missing, or corrupted Bluetooth driver .
One of the best ways to resolve the problem is to update your drivers. There are various ways to do this.
You can do it through the Device Manager:
- Type
Device Manager
in the Search and click on it. - A new window will open. You will see a list of devices. Expand the contents of the Bluetooth category.
- Now, look for your Bluetooth audio device. Right-click it, and then select Properties.
- Go to the Driver tab, then click Update driver.
Your system should automatically find the latest driver version for your Bluetooth audio device.
However, Windows can miss the right update for your PC. So, if you’re still experiencing Bluetooth headphones audio delay, go to the manufacturer’s website.
This is important—you need to find the latest version that is compatible with your system. Make sure you download the right one because if you install the wrong version, you might experience system instability issues.
PRO TIP
Manually updating your Bluetooth audio driver can take time and effort. If you want a more convenient and reliable way to do this, consider Auslogics Driver Updater Once you activate this software, you just need to click a button, and it will automatically recognize what system your computer is running.
Moreover, it will look for the latest manufacturer-recommended drivers for your PC. The best part is that it will update and repair all your drivers.
So, once the process is complete, you can expect an overall improvement in your computer’s performance.
Solution 4: Restart the Windows audio service
One of the reasons you may be experiencing the Bluetooth audio lag is a problem with the Windows audio service. You can try restarting it to resolve the issue.
Here’s how to fix the audio delay by restarting the Windows audio service:
- Press
Windows key + R
on your keyboard. This should open the Run dialog box. - Now, type
services.msc
. Click OK. If prompted to give permission to the app, click Yes.
- Scroll down until you find Windows Audio .
- Right-click Windows Audio and select Properties from the list of options.
- Go to the General tab.
- If the service is not running, click the Start button to enable it.
- After that, click the drop-down list beside the Startup type , then select Automatic from the list.
- Click the Recovery tab.
- Choose Restart the Service from the drop-down list beside First failure .
- Click OK to save the changes.
- Look for Windows Audio Endpoint Builder in the Services window. Repeat the same steps for this entry.
- Restart your PC. Reconnect your Bluetooth audio device to your PC, then check if the Bluetooth latency has been resolved.
Also read: How to Replace Drivers for a Bluetooth Adapter in Windows 10?
Solution 5: Remove other device interference
Another thing you can try to fix the Bluetooth audio delay is to verify that none of the gadgets connected to your computer produce interference. To check if this is the case, simply disconnect each device, one at a time.
You can identify the issue if it is resolved after a particular unplugged device. It may be a hardware issue if this doesn’t fix the Bluetooth latency.
Related: “Bluetooth Peripheral Device Driver Not Found” [Fixed]
Solution 6: Look at hardware issues
Once you’ve ruled out temporary glitches, check for hardware issues. Disconnect your audio output device from your computer and connect to a different computer or mobile device.
Your hardware is most likely to blame if you experience Bluetooth audio delay on another device.
Try getting closer to the receiver and check if the audio responds similarly. This will help you rule out range-related issues. If your problem is hardware, you may need to fix or replace it.
If your speaker or headphones usually function when connected to another device, your operating system might be to blame.
Also read: Hardware Problems Detected by Windows Memory Diagnostic Tool
Solution 7: Ensure the media player is not the issue
Once you’ve ruled out the hardware issues, make sure that the audio delay is not caused by the media player you are using to playback audio or video but by the operating system or hardware.
Even though they are less frequent, media players occasionally cause problems like the one we’re discussing.
Try playing the same file in another media player to eliminate the possibility. If the audio delay appears with different media players, find out whether it consistently affects particular files or formats.
Related: How to Fix Sound Not Working in Windows 10/11
Fix this issue quickly
You can try using a safe and totally free tool developed by the Auslogics team of experts.
A few simple steps to troubleshoot the issue:
Download the tiny Auslogics TroubleShooter tool.
Run the application (no installation is needed).
The app will check for the issue mentioned in the article. When the scan is done, check that this is the issue you were looking to solve and click ‘Apply now’ to apply the recommended fix.
You can use the app to troubleshoot other malfunctions for free by simply typing in a brief description of the issue your PC is experiencing. Or you can scan your PC for performance issues using the My Scanner tab.
Solution 8: Check the file and format compatibility
Make sure the issue isn’t limited to a specific audio or video file or set of formats. Play a different music or video file to solve the issue, preferably in a different media player than the one causing it.
If the Bluetooth speaker delay goes away when a different file or format is used, there is probably a compatibility problem.
You can try using another media player to convert the files into a supported format. If this doesn’t work, you will need to look into system-level fixes.
Save this video in case you ever experience audio issues after a Bluetooth connection.
Conclusion
We hope this guide has been helpful and you now have an idea of how to fix the Bluetooth audio delay. Start by checking for interference with other devices. Then, rule out hardware issues.
Make sure your media player isn’t the reason for the delay and isn’t exclusive to some files or types.
Your Bluetooth audio lag should be fixed now. Which solution has worked for you? We are always happy to hear from you in the comments below!
FAQ
First, make sure your devices are in close proximity to each other. Check if your Bluetooth hardware and drivers are updated. Also, using Bluetooth 5.0 or higher is sometimes helpful because it’s faster.
Try positioning your computer and Bluetooth device in an open area without too many barriers, like walls, between them. This improves signal transmission. You can improve your signal by switching to a more powerful Bluetooth adapter. Also, keep other wireless devices away from your Bluetooth connection to prevent interference.
Keep the firmware on your Bluetooth headphones up to date. Try unpairing your headphones via Bluetooth settings and then reconnecting them. If the problem continues, check for Bluetooth adapter and headphone driver upgrades.
Make sure your Bluetooth headphones and Windows are updated to the most recent versions. If the delay still occurs, think about switching to the A2DP audio profile from HSP or HFP in your sound options.
Практически каждый владелец беспроводных наушников хотя бы раз сталкивался с задержкой звука или разрывами связи. Причин тому немало, и о них мы подробнее расскажем в нашем материале, а также дадим советы по решению проблемы.
Общие рекомендации
Источник: The Guardian / Фото девушки в Bluetooth-наушниках
Нередко в задержке и обрывах связи виноваты вовсе не устройство или сами наушники, а внешние факторы. Их следует исключить, поэтому:
- Держите наушники поближе к устройству. Обычно проблемы начинаются после превышения дистанции в 10 метров, но если вы находитесь в помещении — помните про двери и стены;
- Нередко причиной проблем может стать толстая одежда;
- Держитесь подальше от мест скопления людей. Многие из них также могут пользоваться Bluetooth-наушниками, создавая помехи;
- Постарайтесь разместиться как можно дальше от роутера и устройств с активным модулем Wi-Fi.
Если ничего из вышеперечисленного не помогло, и проблемы по-прежнему наблюдаются, то, возможно, проблему удастся решить средствами Windows.
Отключение Bluetooth
Источник: CQ / Скриншот Windows 10
Простой, но нередко выручающий совет — отключите Bluetooth, после чего включите заново и проверьте, нормально ли работают наушники.
Перезагрузка ПК
Источник: CQ / Скриншот Windows 10
Тоже банальный, но порой помогающий способ. Баги в работе ОС вполне могут стать причиной задержек звука.
Обновление драйвера Bluetooth-адаптера
Не исключено, что причиной проблем со звуком является устаревший драйвер Blueetooth-адаптера. Лучше всего скачать актуальную версию с сайта производителя, но можно обновиться и через Windows:
- Кликните правой кнопкой мыши по меню «Пуск» и выберите «Диспетчер устройств»;
- Найдите в списке Bluetooth и разверните его;
Источник: CQ / Скриншот Windows 10
- Нажмите правой кнопкой мыши по адаптеру и выберите «Обновить драйвер».
Как убрать задержку в Bluetooth-наушниках на смартфонах и планшетах
Источник: Health / Фото мужчины со смартфоном в Bluetooth-наушниках
В случае с гаджетами вариантов решения проблемы совсем немного. Первый — перезагрузить устройство или включить режим полета, после чего отключить. Это приведет к повторному сопряжению с наушниками. Да, бывает и так, что виной всему баг в работе ОС.
Второе — это удаление устройства из памяти смартфона/планшета и повторное подключение.
Инструкция для Android
Порядок действий:
- Зайдите в настройки и найдите пункт Bluetooth;
Источник: CQ / Скриншот Android
- Кликните по своим наушникам и нажмите «Отменить сопряжение»;
- После этого выключите Bluetooth и включите заново;
- Как только гаджет обнаружит наушники — настройте сопряжение.
Внимание — названия пунктов могут отличаться в зависимости от версии ОС и смартфона/планшета.
Инструкция для iOS
Порядок действий:
- Зайдите в настройки и найдите пункт Bluetooth;
Источник: CQ / Скриншот iOS
- Кликните по своим наушникам и нажмите «Забыть это устройство».
- После этого выключите Bluetooth и включите заново;
- Как только гаджет обнаружит наушники — настройте сопряжение.
Что делать, если ничего не помогло
Если вы опробовали все описанное в статье, но наушники продолжают работать некорректно — значит, вы просто используете некачественное или бракованное изделие. В первом случае поможет замена на модель от известного и проверенного бренда, а во втором — замена по гарантии или ремонт в СЦ.
Заглавное фото: How-To Geek
Bluetooth is a great way to connect our computers, smartphones, gaming consoles, and audio devices without the need for wires. But for all its hopes and promises, it still has a few drawbacks.
One of the most annoying issues is a persistent stutter when using Bluetooth audio devices. Here are a few fixes you can try when you experience Bluetooth headphones stuttering on Windows 10 and you’re left asking yourself, “Why is my Bluetooth skipping?”
What Is Bluetooth Audio Stutter?
Bluetooth audio stutter or Bluetooth skipping is the cutting in and out of sound on wireless speakers and earphones. You’ve probably experienced it in some form or other.
Once paired with your Windows computer, your Bluetooth headphones or speakers play audio coming from your PC. But there are times when the audio drops, almost as if the stream of data between your PC and your Bluetooth device stopped for a moment.
This discontinuous, sometimes choppy, flow of audio from your computer to your Bluetooth earphones or speakers is called, not surprisingly, stuttering. It can be frustrating when lyrics or dialogue cut out at inopportune moments, but to fix Bluetooth audio stutter, you ought to know why it happens.
What Causes Bluetooth Audio Stutter?
There are several things that can cause Bluetooth headphones delivering choppy audio on Windows 10 PC of when connected to other devices. Here are a few causes that can be controlled to some extent.
1. Signal Quality
The most common cause of Bluetooth audio stuttering is a bad signal. This can happen due to various reasons. The audio device (headphones, earphones, or speaker) may be too far away from the source, the signal is too weak, or the receiver’s battery level is low and so it cannot receive the Bluetooth signal properly.
2. Interference
Another reason for Bluetooth headphones stuttering on Windows 10 is interference. Strangely, many household items can interfere with your Bluetooth signal.
3. Obstacles to the Bluetooth Signal
There may be obstacles in the path between the Bluetooth transmitter and its receiver. And as we covered in our guide to reducing Bluetooth latency, Wi-Fi networks, microwave ovens, dense walls, and other household objects are all strong enough to knock your Bluetooth signal off track.
4. Other Causes of Bluetooth Audio Stuttering
Other causes of this choppy phenomenon include audio processing errors, mismatching Bluetooth profiles, and outdated drivers.
How to Eliminate Bluetooth Audio Stuttering on Windows 10
With that in mind, here are some Bluetooth headphone troubleshooting tips to reduce audio stuttering and Bluetooth skipping.
1. Keep Your Battery Charged
A low battery on your Bluetooth audio device can contribute to audio stuttering. Does the audio cut off more often when your Bluetooth headphones are fully charged or after a few hours of use? If so, make sure your Bluetooth headset is fully charged to minimize audio stutter.
2. Disconnect and Reconnect Your Headset
Sometimes the issue of Bluetooth headphones with choppy audio on Windows PC can be solved by the simple IT trick of “turn it off and on again.” This happens when the connection is not stable or hasn’t been made correctly. In Windows 10 Bluetooth settings, disconnect your headset, unpair it, and turn off your computer’s Bluetooth, before turning it on again, and pairing and reconnecting the headset.
3. Move Closer to Your Windows PC
Bluetooth signal strength drops off with distance. The further away you are from the source, the weaker the connection is likely to be. This could be why your Bluetooth signal is skipping and your Bluetooth headphones are stuttering and choppy on Windows 10 PC. Move the Bluetooth earpiece closer to your computer to reduce Bluetooth audio stutter.
4. Eliminate Any Obstacles Between the PC and Your Bluetooth Device
The Bluetooth signal can be interrupted by walls and doors. Make sure you have a clear line of sight between your Windows PC and the Bluetooth headset. This should improve the signal strength and minimize Bluetooth audio stuttering and choppy audio.
5. Minimize Active Bluetooth Connections
If you’ve connected several Bluetooth audio devices to your Windows 10 PC, you are more likely to experience audio stuttering and Bluetooth skipping on your headphones. Disconnect other Bluetooth devices from your PC when not in use.
6. Disconnect or Unpair Other Headphones
If you’ve paired several Bluetooth audio devices with your PC, Windows might try to connect to those even if they are switched off or not in range. Check whether disconnecting or unpairing other headphones, speakers, or other problematic Bluetooth devices previously connected to your Windows 10 PC solves your Bluetooth audio stuttering issue.
7. Get in the Correct Mode
Your headphones may appear twice under Windows 10 sound settings: one as stereo audio speakers, the other as a hands-free device for calls. Click on the sound icon in the system tray (the right end of the Windows 10 taskbar at the bottom of the screen) and make sure that you have your Bluetooth headset set to stereo audio.
8. Run the Bluetooth Troubleshooter
Let your Windows machine do the heavy lifting. Running the Bluetooth troubleshooter will automatically check for issues and fix them if possible.
To do this, go to Settings on the Start menu and click on Update & Security. Click on Troubleshoot on the left panel (the one with the wrench icon), then scroll down to Bluetooth options and run the Bluetooth troubleshooter.
Once this has finished, connect your earphones to find out whether this has remedied the issue.
9. Try Changing the Audio Sample Rate and Bit Depth
Sometimes you experience Bluetooth audio stuttering because a Bluetooth audio device might be having trouble with a certain sample rate or bit depth for audio. To eliminate or reduce Bluetooth headphones stuttering on Windows 10, try cycling through the various sample rates and bit depths available in your sound settings.
Go to Windows 10 Settings; navigate to System settings and then to Sound settings on the left panel. Click on Device properties under output device.
Under the Advanced tab, choose a sample rate and bit depth, to see whether it works better with your Bluetooth earphones.
10. Update Your Windows 10 Bluetooth Driver
Another possible way to resolve Bluetooth skipping and audio stutter is to update your Bluetooth driver. To do this, right-click on the Start menu (or press Win + X) and go to Device Manager.
Look for and expand the Bluetooth option, right-click on the installed Bluetooth driver or drivers, and click on Update driver.
Select the option to search automatically for updated driver software and allow Windows to find updates for you if they are available.
11. Perform a Factory Reset
If nothing else seems to be working, the problem of Bluetooth headphones experiencing choppy audio on your Windows PC might be solved by performing a factory reset on your earpiece. Consult your headset’s manual to know how to do this. Resetting most Bluetooth earphones involves holding down the power button for an extended period, usually five to seven seconds.
12. Check for Firmware Updates
Manufacturers provide firmware updates for their Bluetooth headphones and earbuds via mobile apps. However, not all brands support firmware updates. You’ll have to check whether your device manufacturer’s mobile app offers firmware updates for your model of headphones. If it does, updating the firmware on your wireless earpieces is a good idea and may help with Bluetooth audio stuttering.
Other, More Difficult-to-Fix Bluetooth Audio Stutter Causes
Unfortunately, some issues cannot be easily resolved. One of these is interference caused by your body. If your body is disrupting the Bluetooth signal from your computer to your headphones, there’s little you can do.
Another issue that has little chance of being resolved is mismatching Bluetooth profiles. In such a situation, the audio stutter is heard because the Bluetooth profiles of the source and receiver are dissimilar.
Unless the manufacturer has a firmware update that addresses this issue, you are stuck with the occasional cutting out of your audio.
Fix Bluetooth Audio Stutter Easily
You don’t have to live with choppy Bluetooth audio from your headset. One or more of these simple fixes should clear up the connectivity issues you may be experiencing. They can help boost Bluetooth connectivity and minimize audio stutter typical with wireless headsets. It could be as simple as restarting your earphones, but more serious intervention may be needed.