Многие, впервые подключив беспроводные наушники к 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
Современные беспроводные наушники уже не уступают своим проводным собратьям. Но есть одна досадная проблема, которой по-прежнему подвержены Bluetooth-наушники – задержка звука. К счастью, есть несколько быстрых решений, которые можно попробовать, чтобы избавиться от этой неприятности в Windows 11 и Windows 10.
Убедитесь, что вы находитесь не слишком далеко
Это может показаться очевидным, но чтобы наушники Bluetooth работали идеально, вы должны находиться в непосредственной близости от компьютера или ноутбука. Хотя вы можете не терять связь или испытывать обрывистый звук даже на расстоянии 3-5 метров от компьютера, расстояние все равно может вызвать задержку звука.
Попробуйте расположиться перед системой и посмотреть, решит ли это проблему. Обычно такие вещи, как стены и даже другие люди между вашими наушниками и компьютером, являются достаточными причинами.
Интересно: Blueman — bluetooth-менеджер для Linux
Включить и включить повторно Bluetooth
Извечный трюк с выключением и повторным включением наушников иногда тоже может решить проблему задержки звука Bluetooth.
- Нажмите правой кнопкой мыши на кнопку «Пуск» и выберите «Настройки»
- Выберите слева «Bluetooth & устройства» и выключите опцию Bluetooth. Подождите минуту, затем снова включите его и проверьте, сохраняется ли задержка звука.
- В Windows 10 выберите «Устройства» в окне «Настройки», а затем «Bluetooth & другие устройства» на левой панели. Оттуда включите тумблер Bluetooth.
- Чтобы повторно подключить наушники, сначала нажмите на три вертикальные точки рядом с иконкой наушников и нажмите «Удалить устройство». Пользователи Windows 10 могут просто нажать на иконку наушников, а затем «Удалить устройство».
- Теперь переведите наушники в режим сопряжения, а затем нажмите «Добавить устройство» для повторного сопряжения. Проверьте, удалось ли устранить задержку звука путем повторного сопряжения наушников. В Windows 10 вы можете сделать то же самое, нажав «Добавить Bluetooth или другое устройство.»
Устраните помехи от других устройств
Хотя наушники Bluetooth стали более устойчивы к внешним помехам, они все еще могут столкнуться с такими проблемами, как задержка звука, особенно если поблизости есть несколько беспроводных устройств. Wi-Fi роутеры, Bluetooth колонки, радионяни и даже микроволновые печи могут создавать помехи для ваших наушников из-за наложения частот в диапазоне 2,4 ГГц.
Некоторые простые способы устранить помехи как основную причину:
- Выключение устройств, которые не используются
- Переключение беспроводного роутера на другой канал в диапазоне 2,4 ГГц или переключение на диапазон 5 ГГц, если у вас двухдиапазонный роутер
- Отключение других беспроводных устройств от вашего компьютера по одному за раз, чтобы определить виновника.
Отключить улучшения звука
Улучшения звука в Windows часто помогают повысить качество звука в некоторых сценариях, в зависимости от аппаратного обеспечения и аудиосигнала. Однако иногда они могут вызывать такие проблемы, как задержка звука. Вы можете отключить улучшения звука и проверить, поможет ли это устранить проблему.
- Перейдите в «Настройки -> Система -> Звук.»
- В разделе «Выход» вверху нажмите на ваши Bluetooth-наушники, чтобы открыть соответствующие свойства.
- В разделе «Настройки выхода» нажмите «Дополнительно» под «Улучшение звука.»
- В следующем окне выберите вкладку «Улучшения» и установите флажок напротив «Отключить все улучшения». Затем нажмите «Применить -> OK.»
- Чтобы открыть свойства устройства в Windows 10, выберите наушники в выпадающем списке «Выберите устройство вывода» в разделе «Выход». Нажмите «Свойства устройства -> Дополнительные свойства устройства».
- Теперь снова протестируйте наушники. Если проблема сохраняется и общее качество звука снижается, вы можете снова включить улучшение звука.
Убедитесь, что служба Windows Audio настроена правильно
Иногда служба Windows Audio настроена неправильно из-за изменений в некоторых приложениях. Если ни одно из вышеперечисленных решений не помогло, стоит убедиться, что служба настроена правильно.
- Найдите «Службы» в поиске Windows и откройте приложение.
- Справа найдите службу «Windows Audio» в конце списка и дважды щелкните по ней, чтобы открыть ее свойства.
- На вкладке «Общие» убедитесь, что «Тип запуска» установлен на «Автоматический» (а не на «Отложенный запуск»). Нажмите «Применить -> OK.»
Попробуйте воспользоваться встроенным в Windows средством устранения неполадок
Хотя средство устранения неполадок Windows не всегда дает хоть какие-нибудь результаты, его все же стоит попробовать, чтобы подстраховаться. Иногда причиной задержки звука Bluetooth может быть простой неверно настроенный параметр, на который не обращаешь внимание.
- Откройте «Настройки -> Система -> Устранение неполадок.»
- Нажмите «Другие средства устранения неполадок.«Другие», рядом с «Bluetooth», нажмите «Запустить», чтобы запустить средство устранения неполадок Bluetooth.
- В Windows 10 вам нужно выбрать «Обновление & Безопасность» в окне «Настройки», затем «Устранение неполадок» на левой панели и, наконец, «Bluetooth» в разделе «Поиск и устранение других проблем». Затем нажмите «Запустить средство устранения неполадок.»
- На основании результатов, полученных средством устранения неполадок, следуйте инструкциям, чтобы включить средство устранения неполадок для решения выявленных им проблем. После этого проверьте, устранена ли задержка звука.
Обновление драйверов Bluetooth
Драйверы устройств часто являются причиной различных проблем с производительностью. В случае задержки звука необходимо убедиться, что в системе установлены последние версии драйверов для наушников Bluetooth.
- Нажмите правой кнопкой мыши на кнопку «Пуск» и выберите «Диспетчер устройств»
- В разделе «Bluetooth» выберите наушники и нажмите «Обновить драйвер»
- Выберите «Автоматический поиск драйверов». Ваш компьютер выполнит поиск обновленных драйверов и установит их автоматически. Перезагрузите компьютер после установки и проверьте, решена ли проблема.
- Если компьютер не может найти обновленные драйверы, вы можете вручную загрузить последние версии драйверов с сайта производителя ваших наушников, а затем установить их самостоятельно. Не забудьте перезагрузить компьютер, чтобы изменения вступили в силу.
- Вам также следует убедиться, что прошивка ваших наушников не устарела. Чтобы проверить наличие обновления прошивки, воспользуйтесь настройками мобильного приложения ваших наушников.
8. Используйте другой Bluetooth-приемник
Если ни один из приведенных выше советов не помог вам с вашим встроенным оборудованием Bluetooth, иногда проблему можно решить с помощью внешнего Bluetooth-приемника. Вы можете приобрести внешний Bluetooth начиная от 200 рублей на сайте Яндека.Маркет Подключите его, позвольте Windows автоматически установить драйверы, а затем проверьте, сохраняется ли задержка звука.
В некоторых ноутбуках встроенный контроллер Bluetooth недостаточно мощный, чтобы обеспечить достойный звук. Переход на съемный Bluetooth-ключ может решить любые проблемы со звуком в таких случаях.
Часто задаваемые вопросы
Страдает ли Bluetooth 5.0 от задержки звука?
Последний стандарт Bluetooth и все его итерации, такие как Bluetooth 5.1 и Bluetooth 5.2, могут обрабатывать данные гораздо быстрее, чем предыдущие стандарты, но они не застрахованы от задержки звука. Учитывая это, если ваши Bluetooth-наушники поддерживают более новый стандарт, вам следует использовать именно его, а не старые, чтобы воспользоваться преимуществами более высокой пропускной способности и более высокого качества звука.
Как долго служат Bluetooth-наушники?
Срок службы Bluetooth-наушников зависит от множества факторов, таких как качество компонентов, количество циклов зарядки и тип использования. Как правило, наушники от известных брендов могут прослужить от 3 до 10 лет, в зависимости от модели. Более бюджетные варианты от менее надежных брендов иногда могут выйти из строя в течение 2 лет.
Лучше ли проводные наушники, чем беспроводные?
Проводные наушники и наушники работают с аналоговыми сигналами по сравнению с цифровыми сигналами беспроводных наушников, и, следовательно, имеют более высокую пропускную способность. Они могут обрабатывать звук без сжатия и обеспечивают более чистый звук. Однако современная технология Bluetooth добилась огромных успехов в минимизации разрыва между беспроводными и проводными наушниками. Вы с трудом почувствуете разницу в качестве звука в современных беспроводных и проводных наушниках. Проводные наушники по-прежнему предпочитают профессионалы, которым не нужны компромиссы из-за сжатия данных или задержки звука.
Почему наушники Bluetooth такие дорогие?
В целом, Bluetooth-наушники стоят дороже проводных наушников из-за более сложной конструкции компонентов. Bluetooth-наушники должны содержать значительно более дорогие и высококачественные внутренние компоненты в том же форм-факторе, что и проводные наушники. Это, естественно, увеличивает стоимость производства. Беспроводные наушники имеют дополнительное требование – наличие аккумулятора, с которым проводным наушникам не нужно возиться.
Могут ли проблемы с задержкой звука быть сигналом того, что мои наушники нуждаются в замене?
В редких случаях, но иногда такие проблемы, как задержка звука, могут быть вызваны неисправными наушниками Bluetooth. Помимо физических повреждений, такие симптомы, как искажение звука на высоких уровнях громкости и странный шум, могут подсказать вам, что наушники нуждаются в ремонте или замене.
Практически каждый владелец беспроводных наушников хотя бы раз сталкивался с задержкой звука или разрывами связи. Причин тому немало, и о них мы подробнее расскажем в нашем материале, а также дадим советы по решению проблемы.
Общие рекомендации
Источник: 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
When you are enjoying your favorite song via Bluetooth headphones, the sound may sometimes be cut off without any reason. At this moment, you may feel infuriated and you may adjust your Bluetooth positions and angles, yet the Bluetooth audio stuttering continues to happen. Even though your Bluetooth headphones are fully charged, you cannot use them if it has any internal issues or if there are any incompatible audio settings on your Windows 10 computer. Don’t worry! You are not the only one who faces Bluetooth headphones stuttering Windows 10 issues. We have some effective amazing fixes for you that will bring your computer out of the trouble. So, continue reading.
Table of Contents
Here are some common reasons that cause Bluetooth audio stuttering issues on Windows 10. Analyze them deeply to find out the exact cause in your case.
- Bluetooth battery is running low.
- Bluetooth device is far away from the signal source.
- Signal mismatch.
- Human body is interfering with the Bluetooth signal.
- One or more Bluetooth devices are on at the same time.
- Outdated firmware.
- Outdated Operating System and incompatible audio drivers.
- Time to upgrade; headphones are age-old!
In this section, we have compiled a list of methods that help you troubleshoot Bluetooth headphones stuttering Windows 10 issues. Firstly check and fix the hardware problems and then move ahead to Windows troubleshooting methods as instructed below.
Method 1: Charge Bluetooth Battery
You may sometimes analyse when Bluetooth headphones lose charge, the audio may turn out choppy. In this case, you have to charge your Bluetooth device and always make sure there is a minimum level of power to avoid any audio problems.
In some latest Bluetooth devices, the battery level can be identified by colour code. For example, in the OnePlus Earbuds,
- Green – Indicates battery level is optimum for use.
- Red – Indicates battery level is very low and needs charging.
So, what if the battery level is adequate, but still facing Bluetooth headphones stuttering Windows 10? Check and try the following methods!
Method 2: Maintain Bluetooth Signal Range
Bluetooth devices make use of short wave radio signals and when you are out of range, you cannot hear the audio properly and the audio disconnects later. Your Bluetooth device manufacturer would have mentioned the signal range of your device on the package. Check it out or browse the internet to find out the coverage range. Then, maintain the same distance as mentioned. Check if this works.
Also Read: How to Install Bluetooth on Windows 10
Method 3: Avoid Cross Body Interference
You may sometimes face Bluetooth headphones stuttering Windows 10 when you are keeping one of the Bluetooth devices on your pant trousers or your palm and the other on your ear.
This may be due to the 70% + water content in your body. Bluetooth radio waves travel very bad over waterlogging substances, if you are in this situation, please change the position of Bluetooth devices.
Method 4: Remove Problematic Obstructions
Similarly, if there are any metallic interruptions, Bluetooth waves bounce out and you may face Bluetooth audio stuttering issue on your Windows 10 PC. Likewise, if there is any reinforced concrete (such as a wall) substance between your computer and Bluetooth device, you may face audio stuttering issues. You are advised to remove these obstructions and sit near your Bluetooth device and computer.
Method 5: Avoid Placing Devices with High Wi-Fi Range
Several modern wireless devices like smart bulbs, high range routers, cordless phones, Wi-Fi routers, and monitors employ high Wi-Fi range signals, and some may even work with 2.4 GHz – 2.5Ghz.
Also, if you are using a Bluetooth device, avoid Wi-Fi interferences in the transmission paths. In addition to this, remove extra Bluetooth connections connected to your computer and check if you face the problem again.
Method 6: Use USB Cable (For Bluetooth Dongle Users)
In some cases, electrical interference between the module of your motherboard and your Bluetooth device may cause Bluetooth audio stuttering issue. This problem can be resolved by increasing the distance between the USB dongle and the USB port on Windows 10.
Also Read: How to Rename Bluetooth Devices on Windows 10
Method 7: Reconnect Bluetooth
As of now, you have followed hardware troubleshooting methods to fix Bluetooth headphones stuttering Windows 10 issue. Still, if you did not attain any fix, then the problem is not with your hardware. To troubleshoot temporary problems associated with your Bluetooth device and your computer, turn off the Bluetooth and turn it on again after some time as instructed below.
1. Press the Windows key and type Bluetooth settings, then hit Enter key.
2. Now, toggle off the Bluetooth icon as shown.
3. Wait for a while and toggle ON the same setting again.
Check if you have fixed Bluetooth audio stuttering issue on Windows 10.
Method 8: Select Correct Audio Output
When you are using more than one audio output device, you have to confirm whether Bluetooth device is used up as an output device. To check the audio output in your Windows 10 PC, follow the below-mentioned steps.
1. Click on the Speakers icon at the right corner of the Taskbar.
2. Now, click on the arrow icon to expand the list of audio devices connected to the computer.
3. Then, select the audio device (your Bluetooth device) and make sure the audio is playing through the selected device.
If this method doesn’t help you, move ahead to the next one.
Also Read: How to Fix Bluetooth problems in Windows 10
Method 9: Run Bluetooth Troubleshooter
Your Windows 10 computer has a built-in troubleshooter to fix many common problems arising from it. Likewise, you can fix Bluetooth headphones stuttering Windows 10 issue by running Bluetooth troubleshooter as instructed below.
1. Press the Windows key, type Troubleshoot settings, and click on Open.
2. Scroll down to the Find and fix other problems section.
3. Here, select Bluetooth and click on Run the troubleshooter option.
4. Windows will start Detecting problems. If there are any problems detected then follow on-screen instructions to Apply the fix.
Method 10: Change Wi-Fi Bands
As discussed earlier, Bluetooth audio stuttering happens due to interference between two different wireless devices using the same frequency. To confirm this, you can take a simple hack of turning off your Wi-Fi router. After your Wi-Fi router is completely turned off check if you can fix Bluetooth headphones stuttering Windows 10 issue. If so, the problem is due to Wi-Fi and Bluetooth signal interferences. In this case, you can try switching between 2.4GHz and 5GHz Wi-Fi bands on your Windows 10 computer as instructed below.
1. Hit the Windows key, type device manager, and click on Open.
2. Double-click on Network adapters to expand the network drivers.
3. Then, right-click on your Wi-Fi adapter and click on Properties.
4. Now, search for the Band or Preferred Band option in the Property menu and click on it.
5. Now, expand the drop-down menu of the Value field and set the value as Prefer 5GHz band as shown. Then, click on OK to save the changes.
Note: If the value is already set to Prefer 5GHz band, then change the value to Prefer 2.4GHz and click on OK.
6. Finally, restart your PC and check if you have fixed Bluetooth audio stuttering issue.
Also Read: Fix Bluetooth can’t turn off on Windows 10
Method 11: Re-enable Bluetooth Sound Card
You can easily resolve Bluetooth headphones stuttering Windows 10 issue by restarting the Bluetooth sound card as instructed below.
1. Hit the Windows key and type Device Manager, then click on Open.
2. Then, expand the Bluetooth section by double-clicking on it.
3. Then, right-click on your Bluetooth sound card and select the Disable device option.
4. Now, confirm the prompt by clicking on Yes and reboot your PC. Then, repeat Steps 1-2.
5. Next, right-click on your Bluetooth sound card and select the Enable device option.
6. Now, try playing any sound on Bluetooth device and check if the issue is resolved or not.
Method 12: Repair Corrupt Files
For perfect audio quality services, a few essential files and programs must be functioning on your PC. But, if they are corrupt or misconfigured, you will face Bluetooth audio stuttering issues. Fortunately, all these corrupt misconfigured files can be repaired by using the inbuilt utilities of your Windows 10 PC namely, System File Checker and Deployment Image Servicing and Management. Read our guide on How to Repair System Files on Windows 10 and follow the steps as instructed to repair all your corrupt files.
Wait for the commands to be executed and check if you have fixed bluetooth issue on your PC.
Also Read: Fix Bluetooth Driver Error in Windows 10
Method 13: Restart Bluetooth Audio Services
A few essential Windows audio services will help you prevent Bluetooth audio stuttering issues in your Windows 10 PC. If in case, if these services are turned off, you may face several conflicts. Hence, you are advised to restart a few essential audio services as instructed below steps.
1. Press the Windows key, type Services, and click on Run as administrator.
2. Now, scroll down and double-click on the Bluetooth Support Service.
3. Now, in the new pop-up window, select the Startup type to Automatic, as depicted.
Note: If the Service status is Stopped, then click on the Start button. If the Service status is Running, click on Stop and Start it again.
4. Click on Apply > OK to save the changes.
Method 14: Disable Audio Enhancements
If you find your audio working well for other multimedia resources, but the sound seems to be of low quality or noisy, you are advised to change the sample rate. A low-frequency sample rate will cause Bluetooth audio stuttering issue, yet you can select a higher frequency sample rate by following the below-mentioned steps.
1. Right-click on the Speakers icon at the bottom right corner of the screen and select the Sounds option.
2. Then, switch to the Playback tab and select the default Bluetooth audio device followed by the Properties button as shown.
3. Then, switch to the Advanced tab and from the drop-down menu under Default Format, make sure you select the highest frequency range (16 bit, 44100 Hz).
4. Now, switch to the Enhancements tab and check the box corresponding to Disable all enhancements as shown.
5. Click on Apply and then OK to save the changes. Check if you face Bluetooth audio stuttering issue again. If so, adjust different levels of frequency ranges by repeating these steps and confirm which range solves the problem.
Also Read: Fix Windows 10 Audio Crackling
Method 15: Disable Remote Control and Hands-free Telephony
Hands-free telephony is a Windows service that is used to enable your Bluetooth device to answer phone calls. But, it sometimes reduces the sound quality of your voice signal contributing to Bluetooth audio stuttering issue. Similarly, the Remote Control feature also has its own disadvantages. If you wonder how to fix Bluetooth stuttering amidst these features, here are a few troubleshooting instructions.
1. Hit the Windows key and type Control Panel, then click on Open.
2. Now, click on the View devices and printers link as shown.
3. Now, right-click on your Bluetooth device and click on Properties as shown.
4. In the next window, switch to the Services tab and uncheck the boxes, Hands-free Telephony and Remote Control as depicted.
5. Finally, click on Apply > OK to save the changes.
Method 16: Adjust Roaming Aggressiveness Settings
The Roaming Aggressiveness settings in your computer change the signal strength threshold at which Wi-Fi network adapters scan for other Access Point candidates to offer a better signal connection. But, when this setting is fixed to the highest setting, you will face Bluetooth headphones stuttering Windows 10 issue. You are advised to turn off the setting as instructed below.
1. Launch the Device manager from Windows Search.
2. Double-click on Network adapters to expand the network drivers.
3. Then, right-click on your Wi-Fi adapter and click on Properties.
4. Now, search for the Roaming Aggressiveness option in the Property list and click on it.
5. Now, set the Value to Lowest and click on OK.
Check if you have fixed Bluetooth audio stuttering issue.
Also Read: Fix Windows 10 Bluetooth Mouse Lag
Method 17: Disable Bluetooth Collaboration (If Applicable)
Broadcom Network adapter is software that helps your Bluetooth device to be connected to the internet. But this setting may interfere with your device settings causing the discussed problem. If you want to know how to fix Bluetooth stuttering by turning off this setting, please follow the below-listed instructions.
1. Open Device Manager and go to Network adapters, then right-click on your network driver and select Properties.
2. Now, switch to the Advanced tab and click on Bluetooth Collaboration under the Property list.
3. Then, expand the Value drop-down list and click on Disabled.
4. Finally, click on OK to save the changes and check if you have fixed the issue.
Method 18: Update Bluetooth Drivers
Outdated and incompatible Bluetooth drivers will always result in Bluetooth headphones stuttering Windows 10 issue. Always ensure you use an updated version of drivers and if your computer lacks the latest drivers, you are advised to update them as instructed in our guide How to Update Realtek HD Audio Drivers in Windows 10.
Note: Make sure you follow the same steps for Bluetooth Audio drivers as depicted below.
Once you have updated your Bluetooth drivers to the latest version.
Also Read: What is a Device Driver? How Does It Work?
Method 19: Reinstall Bluetooth Drivers
Incompatible drivers must be reinstalled to resolve all audio related problems. You are advised to reinstall device drivers only if you cannot attain any fix by updating them. Steps to reinstall drivers are very easy and you can do so by using a third-party application or by implementing the steps manually as instructed in our guide How to Uninstall and Reinstall Drivers on Windows 10. Follow the steps corresponding to Bluetooth drivers as depicted.
After reinstalling the audio drivers, check if you can hear the audio on your Bluetooth device.
Method 20: Roll Back Bluetooth Driver Updates
Sometimes, the current version of audio drivers may cause any audio conflicts and in this case, you have to restore previous versions of installed drivers. This process is called rollback of drivers and you can easily roll back your computer drivers to their previous state by following our guide How to Rollback Drivers on Windows 10.
Wait until the previous versions of drivers are installed on your Windows 10 PC. Once done, check if you have fixed the issue.
Method 21: Update Windows
If there are any new Microsoft updates pending to be installed on your PC, a few bugs and problems cannot be resolved on your computer. As suggested by many users, updating Windows 10 computers will help you resolve Bluetooth audio stuttering issue. Follow our guide How to Download and Install Windows 10 Latest Update to update your Windows 10 computer.
After updating your Windows Operating System, check whether you can access audio on Bluetooth device.
Also Read: How to Boost the Bass of Headphones and Speakers in Windows 10
Method 22: Reset Bluetooth Device
Still, if you are thinking about how to fix Bluetooth stuttering issue even after trying all these troubleshooting steps, then you must try factory resetting your device. The resetting process of many headphones involves pressing the power button for a particular extent of time. The steps to reset your device depends on the model you are using and for detailed instructions, follow the below-mentioned steps.
Note: Ensure you are within the Bluetooth signal range. Remove all other wireless devices connected to your computer, especially Wi-Fi devices.
1. Disconnect your Bluetooth device from Windows 10 PC.
2. Now, press and hold the Power button of your Bluetooth device for about 7 to 10 seconds.
3. A flash occurs (probably blue light) about 4 times.
4. Now all the settings and pairing information will be removed from your device.
5. Pair your device again and check if Bluetooth headphones stuttering Windows 10 issue is fixed now.
Note: Ensure you are within the Bluetooth signal range. Remove all other wireless devices connected to your computer, especially Wi-Fi devices.
Method 23: Update Device Firmware
Firmware updates are released to resolve the problems and struggles reported on Bluetooth devices. You can update the firmware via apps and there are so many online platforms to support you in this process. If you have bought your Bluetooth device, seek professional support via email, since that’s the only means you can go for. On the other hand, if you have bought your Bluetooth device from a retail store, take your shoes and run to seek help from the retailer.
Recommended:
- Fix Minecraft Black Screen in Windows 10
- Fix Logitech Unifying Receiver Not Working in Windows 10
- How to Mute an App on Windows 10
- Fix Windows 10 Audio Error 0xc00d4e86
We hope that this guide was helpful and you could fix bluetooth headphones stuttering on Windows 10. Feel free to reach out to us with your queries and suggestions via the comments section below.