Отставание звука в блютуз наушниках windows 10

One of the biggest reasons people consider wired earphones over Bluetooth ones is that sometimes they experience sound delays. However, this problem can be easily fixed with some little settings tweaks. In this article, we will discuss all the possible solutions to fix Bluetooth sound delay in Windows 11/10.

These are the things you can do to fix Bluetooth sound delay in Windows 11/10:

  1. Clear all the obstructions
  2. Reconnect your Bluetooth device
  3. Run Troubleshooters
  4. Connect one device at a time
  5. Disable Audio Enhancements
  6. Update Bluetooth Drivers
  7. Restart Windows Audio Service

How to fix sound delay and audio lag on Bluetooth in Windows 11/10

1] Clear all the obstructions

Bluetooth signals are nothing but waves, it uses short-wavelength UHF radio waves to communicate. So, it is normal for it to get distorted because of obstructions.

Therefore, you need to make sure there is no obstruction between your computer (or the source to which Bluetooth is connected) and the Bluetooth device.

Another thing you need to consider is the distance between the computer and Bluetooth if it’s too long, you will experience a sound delay.

2] Reconnect your Bluetooth device

If the first solution didn’t apply to you then start from here. The simplest way to fix the issue would be to reconnect your Bluetooth device.

To do that, hit Win + X > Settings. Now, click on Devices, your Bluetooth device, and then Disconnect.

Now, click on the Connect button to reconnect your Bluetooth device. If the delay is because of any glitch then this will fix the issue for you.

You can even restart your computer’s Bluetooth by using the toggle from the same window.

Read: Bluetooth Headphones not working.

3] Run Troubleshooters

Fix Bluetooth sound delay in Windows 10

Microsoft has built one of the best troubleshooting software in the market and in this section, we are going to use that to our advantage.

To troubleshoot your audio device, hit Win + X > Settings. Now, click on Update & Security > Troubleshoot > Additional troubleshooters > Playing Audio > Troubleshoot.

A wizard will ask you to select the Audio Device, select, and click Next. Your problem will be detected and hopefully, fixed.

To troubleshoot Bluetooth, open Settings and click Update & Security > Troubleshoot > Additional troubleshooters > Bluetooth > Troubleshoot.

Finally, follow the on-screen instructions to run this fix the issue.

You may want to also run the Bluetooth Troubleshooter from the same page.

4] Connect one device at a time

Most of us have two or three devices paired to a single Bluetooth headset or speaker. And when we start our Bluetooth device, it connects to all the devices automatically. Because of this, you may experience audio lag. Therefore, you need to make sure that your Bluetooth is connected to one device at a time.

Read: Bluetooth devices not showing, pairing or connecting.

5] Disable Audio Enhancements

Even though, audio enhancements can improve your listening experience by enhancing certain notes. However, this feature can also make your audio distort and lag. Therefore, to fix the Bluetooth sound delay in Windows 10 we are going to disable Audio Enhancements.

To do that, follow the prescribed steps:

  • Launch Settings by Win + X > Settings.
  • Click System > Sound > Device properties> Additional device properties.
  • Now, go to the Enhancements tab, tick Disable all enhancements and click Apply > Ok.

6] Update Bluetooth Driver

This solution can be applied to any Bluetooth-related problem. An outdated driver can cause a lot of trouble for you and Bluetooth sound delay is one of them. Therefore, we need to update our Bluetooth driver.

To do that, launch Device Manager from the Start Menu. Expand Bluetooth, right-click on your device, and select Update driver. A wizard will ask you to either select Search automatically for drivers or Browse my computer for drivers, select the former one if you want the computer to search the web for an updated driver, and latter if you have already downloaded the updated driver on your computer.

After updating the driver, try restarting your computer to fix the Bluetooth sound delay issue.

7] Restart Windows Audio Service

If you are still not able to fix the Bluetooth sound delay issue then try restarting Windows Audio Service.

To do that, launch Services from the Start Menu, scroll down a bit, right-click on Windows Audio, select Restart, and click Yes to confirm.

Finally, restart your computer, connect to the Bluetooth device and enjoy.

Read: Troubleshoot Windows Sound and Audio problems.

Hopefully, this has helped you fix the Bluetooth sound delay in Windows 11/10.

Время на прочтение15 мин

Количество просмотров29K

Совсем недавно мы купили новый ноутбук на Windows человеку, который до сих пор пользовался Mac’ами. Одна из замеченных проблем — при просмотре видео звук в Bluetooth наушниках запаздывает по отношению к видео, причём заметно. Используя slow motion видео на телефоне, мы выяснили, что задержка составляет порядка 200мс. Это много, и это мешает воспринимать речь в видео.

200мс даже нет на шкале

200мс даже нет на шкале
Windows: 200ms, Mac: 0ms

Windows: 200ms, Mac: 0ms

В то же время, на маке нет задержки. Почему так? Давайте разбираться.

Причины задержки звука

Воспроизводимый звук всегда будет отставать от источника. Часть этого отставания вызвана вполне физическими процессами — информация о звуке (в виде электронных сигналов) и собственно звук (в виде колебаний среды) должны дойти до наших ушей. Например, наблюдаемые 200мс — это время, за которое звук преодолевает примерно 70 метров в воздухе. Иными словами, если бы мы сидели в 70 метрах от ноутбука, 200мс было бы вполне ожидаемой задержкой.

Однако, мы не сидим в 70 метрах. А свет распространяется настолько быстро, что временем на распространение электронных сигналов можно пренебречь. Тут на первый план выходит задержка на программную обработку сигнала и буферизацию. Bluetooth — беспроводная связь, подверженная шумам и требующая разных согласований и разделений между устройствами, поэтому данные нельзя передавать в реальном времени. Чтобы звук шёл плавно, нужно на устройстве иметь достаточно большой буфер, который (почти) никогда не заканчивается — если передача застряла по любой причине, устройство продолжит играть звук из буфера.

Это очень краткое и грубое объяснение, если хотите подробностей — см. здесь. Главное, что нам нужно знать — через Bluetooth задержка неизбежна. Это вам не проводные наушники (хотя и там есть небольшая задержка).

Есть aptX LL, который должен снижать задержку для интерактивных приложений, но ни наушники, ни ноут этого протокола не поддерживают. Значит, так или иначе у нас будет минимум ~130мс задержки.

А Mac?

Окей, но ведь мак выводит звук без задержки? На самом деле, это не так. Если провести эксперимент и, написав примитивный HTML, заставить мак вывести аудио неожиданно, мы увидим те же самые ~200мс задержки.

Задержка ~200ms

Задержка ~200ms

Когда воспроизводится видео (ютуб), мак задерживает видеопоток, чтобы синхронизировать картинку и звук. Это нормально, потому что если видео начнёт воспроизводиться на 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 chrome.exe

Список DLL chrome.exe

Значит, хром не так уж и защищается? Потираем руки и пишем свою 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 нужны следующие действия по её загрузке:

  1. Загрузить DLL в память процесса.

  2. Настроить reloc’и.

  3. Настроить импорты.

  4. Передать управление в 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, и настраивать задержку соответственно.

Это приводит к двум проблемам:

  1. Нужна программа, настраивающая задержки аудиоустройств

  2. Загруженная 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 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.

Bluetooth interference

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.

Unpair or disconnect Bluetooth devices

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.

Disconnect other Bluetooth devices

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.

System sound earphones with 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.

Open the Bluetooth troubleshooter

Once this has finished, connect your earphones to find out whether this has remedied the issue.

Bluetooth troubleshooting report

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.

Windows 10 sound properties

Under the Advanced tab, choose a sample rate and bit depth, to see whether it works better with your Bluetooth earphones.

Change audio sample rate

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.

Windows 10 device manager on Start menu

Look for and expand the Bluetooth option, right-click on the installed Bluetooth driver or drivers, and click on Update driver.

Update Windows 10 Bluetooth driver

Select the option to search automatically for updated driver software and allow Windows to find updates for you if they are available.

11-auto-search-bluetooth-driver-update

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.

Современные беспроводные наушники уже не уступают своим проводным собратьям. Но есть одна досадная проблема, которой по-прежнему подвержены Bluetooth-наушники – задержка звука. К счастью, есть несколько быстрых решений, которые можно попробовать, чтобы избавиться от этой неприятности в Windows 11 и Windows 10.

Убедитесь, что вы находитесь не слишком далеко

Это может показаться очевидным, но чтобы наушники Bluetooth работали идеально, вы должны находиться в непосредственной близости от компьютера или ноутбука. Хотя вы можете не терять связь или испытывать обрывистый звук даже на расстоянии 3-5 метров от компьютера, расстояние все равно может вызвать задержку звука.

Попробуйте расположиться перед системой и посмотреть, решит ли это проблему. Обычно такие вещи, как стены и даже другие люди между вашими наушниками и компьютером, являются достаточными причинами.

Интересно: Как включить экспериментальные функции Bluez в Ubuntu

Включить и включить повторно Bluetooth

Извечный трюк с выключением и повторным включением наушников иногда тоже может решить проблему задержки звука Bluetooth.

  1. Нажмите правой кнопкой мыши на кнопку «Пуск» и выберите «Настройки»

  2. Выберите слева «Bluetooth & устройства» и выключите опцию Bluetooth. Подождите минуту, затем снова включите его и проверьте, сохраняется ли задержка звука.

  3. В Windows 10 выберите «Устройства» в окне «Настройки», а затем «Bluetooth & другие устройства» на левой панели. Оттуда включите тумблер Bluetooth.
  4. Чтобы повторно подключить наушники, сначала нажмите на три вертикальные точки рядом с иконкой наушников и нажмите «Удалить устройство». Пользователи Windows 10 могут просто нажать на иконку наушников, а затем «Удалить устройство».

  5. Теперь переведите наушники в режим сопряжения, а затем нажмите «Добавить устройство» для повторного сопряжения. Проверьте, удалось ли устранить задержку звука путем повторного сопряжения наушников. В Windows 10 вы можете сделать то же самое, нажав «Добавить Bluetooth или другое устройство.»

Устраните помехи от других устройств

Хотя наушники Bluetooth стали более устойчивы к внешним помехам, они все еще могут столкнуться с такими проблемами, как задержка звука, особенно если поблизости есть несколько беспроводных устройств. Wi-Fi роутеры, Bluetooth колонки, радионяни и даже микроволновые печи могут создавать помехи для ваших наушников из-за наложения частот в диапазоне 2,4 ГГц.

Некоторые простые способы устранить помехи как основную причину:

  • Выключение устройств, которые не используются
  • Переключение беспроводного роутера на другой канал в диапазоне 2,4 ГГц или переключение на диапазон 5 ГГц, если у вас двухдиапазонный роутер
  • Отключение других беспроводных устройств от вашего компьютера по одному за раз, чтобы определить виновника.

Отключить улучшения звука

Улучшения звука в Windows часто помогают повысить качество звука в некоторых сценариях, в зависимости от аппаратного обеспечения и аудиосигнала. Однако иногда они могут вызывать такие проблемы, как задержка звука. Вы можете отключить улучшения звука и проверить, поможет ли это устранить проблему.

  1. Перейдите в «Настройки -> Система -> Звук.»

  2. В разделе «Выход» вверху нажмите на ваши Bluetooth-наушники, чтобы открыть соответствующие свойства.

  3. В разделе «Настройки выхода» нажмите «Дополнительно» под «Улучшение звука.»

  4. В следующем окне выберите вкладку «Улучшения» и установите флажок напротив «Отключить все улучшения». Затем нажмите «Применить -> OK.»

  5. Чтобы открыть свойства устройства в Windows 10, выберите наушники в выпадающем списке «Выберите устройство вывода» в разделе «Выход». Нажмите «Свойства устройства -> Дополнительные свойства устройства».
  6. Теперь снова протестируйте наушники. Если проблема сохраняется и общее качество звука снижается, вы можете снова включить улучшение звука.

Убедитесь, что служба Windows Audio настроена правильно

Иногда служба Windows Audio настроена неправильно из-за изменений в некоторых приложениях. Если ни одно из вышеперечисленных решений не помогло, стоит убедиться, что служба настроена правильно.

  1. Найдите «Службы» в поиске Windows и откройте приложение.

  2. Справа найдите службу «Windows Audio» в конце списка и дважды щелкните по ней, чтобы открыть ее свойства.

  3. На вкладке «Общие» убедитесь, что «Тип запуска» установлен на «Автоматический» (а не на «Отложенный запуск»). Нажмите «Применить -> OK.»

Попробуйте воспользоваться встроенным в Windows средством устранения неполадок

Хотя средство устранения неполадок Windows не всегда дает хоть какие-нибудь результаты, его все же стоит попробовать, чтобы подстраховаться. Иногда причиной задержки звука Bluetooth может быть простой неверно настроенный параметр, на который не обращаешь внимание.

  1. Откройте «Настройки -> Система -> Устранение неполадок.»

  2. Нажмите «Другие средства устранения неполадок.«Другие», рядом с «Bluetooth», нажмите «Запустить», чтобы запустить средство устранения неполадок Bluetooth.

  3. В Windows 10 вам нужно выбрать «Обновление & Безопасность» в окне «Настройки», затем «Устранение неполадок» на левой панели и, наконец, «Bluetooth» в разделе «Поиск и устранение других проблем». Затем нажмите «Запустить средство устранения неполадок.»
  4. На основании результатов, полученных средством устранения неполадок, следуйте инструкциям, чтобы включить средство устранения неполадок для решения выявленных им проблем. После этого проверьте, устранена ли задержка звука.

Обновление драйверов Bluetooth

Драйверы устройств часто являются причиной различных проблем с производительностью. В случае задержки звука необходимо убедиться, что в системе установлены последние версии драйверов для наушников Bluetooth.

  1. Нажмите правой кнопкой мыши на кнопку «Пуск» и выберите «Диспетчер устройств»

  2. В разделе «Bluetooth» выберите наушники и нажмите «Обновить драйвер»

  3. Выберите «Автоматический поиск драйверов». Ваш компьютер выполнит поиск обновленных драйверов и установит их автоматически. Перезагрузите компьютер после установки и проверьте, решена ли проблема.

  4. Если компьютер не может найти обновленные драйверы, вы можете вручную загрузить последние версии драйверов с сайта производителя ваших наушников, а затем установить их самостоятельно. Не забудьте перезагрузить компьютер, чтобы изменения вступили в силу.
  5. Вам также следует убедиться, что прошивка ваших наушников не устарела. Чтобы проверить наличие обновления прошивки, воспользуйтесь настройками мобильного приложения ваших наушников.

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-наушниках

Источник: The Guardian / Фото девушки в Bluetooth-наушниках

Нередко в задержке и обрывах связи виноваты вовсе не устройство или сами наушники, а внешние факторы. Их следует исключить, поэтому:

  • Держите наушники поближе к устройству. Обычно проблемы начинаются после превышения дистанции в 10 метров, но если вы находитесь в помещении — помните про двери и стены;

  • Нередко причиной проблем может стать толстая одежда;

  • Держитесь подальше от мест скопления людей. Многие из них также могут пользоваться Bluetooth-наушниками, создавая помехи;

  • Постарайтесь разместиться как можно дальше от роутера и устройств с активным модулем Wi-Fi.

Если ничего из вышеперечисленного не помогло, и проблемы по-прежнему наблюдаются, то, возможно, проблему удастся решить средствами Windows.

Отключение Bluetooth

Источник: CQ / Скриншот Windows 10

Источник: CQ / Скриншот Windows 10

Простой, но нередко выручающий совет — отключите Bluetooth, после чего включите заново и проверьте, нормально ли работают наушники.

Перезагрузка ПК

Источник: CQ / Скриншот Windows 10

Источник: CQ / Скриншот Windows 10

Тоже банальный, но порой помогающий способ. Баги в работе ОС вполне могут стать причиной задержек звука.

Обновление драйвера Bluetooth-адаптера

Не исключено, что причиной проблем со звуком является устаревший драйвер Blueetooth-адаптера. Лучше всего скачать актуальную версию с сайта производителя, но можно обновиться и через Windows:

  • Кликните правой кнопкой мыши по меню «Пуск» и выберите «Диспетчер устройств»;

  • Найдите в списке Bluetooth и разверните его;

Источник: CQ / Скриншот Windows 10

Источник: CQ / Скриншот Windows 10

  • Нажмите правой кнопкой мыши по адаптеру и выберите «Обновить драйвер».

Как убрать задержку в Bluetooth-наушниках на смартфонах и планшетах

Источник: Health / Фото мужчины со смартфоном в Bluetooth-наушниках

Источник: Health / Фото мужчины со смартфоном в Bluetooth-наушниках

В случае с гаджетами вариантов решения проблемы совсем немного. Первый — перезагрузить устройство или включить режим полета, после чего отключить. Это приведет к повторному сопряжению с наушниками. Да, бывает и так, что виной всему баг в работе ОС.

Второе — это удаление устройства из памяти смартфона/планшета и повторное подключение.

Инструкция для Android

Порядок действий:

  • Зайдите в настройки и найдите пункт Bluetooth;

Источник: CQ / Скриншот Android

Источник: CQ / Скриншот Android

  • Кликните по своим наушникам и нажмите «Отменить сопряжение»;

  • После этого выключите Bluetooth и включите заново;

  • Как только гаджет обнаружит наушники — настройте сопряжение.

Внимание — названия пунктов могут отличаться в зависимости от версии ОС и смартфона/планшета.

Инструкция для iOS

Порядок действий:

  • Зайдите в настройки и найдите пункт Bluetooth;

Источник: CQ / Скриншот iOS

Источник: CQ / Скриншот iOS

  • Кликните по своим наушникам и нажмите «Забыть это устройство».

  • После этого выключите Bluetooth и включите заново;

  • Как только гаджет обнаружит наушники — настройте сопряжение.

Что делать, если ничего не помогло

Если вы опробовали все описанное в статье, но наушники продолжают работать некорректно — значит, вы просто используете некачественное или бракованное изделие. В первом случае поможет замена на модель от известного и проверенного бренда, а во втором — замена по гарантии или ремонт в СЦ.

Заглавное фото: How-To Geek

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Классическое средство просмотра изображений для windows 10
  • Оптимизация windows xp для нетбука
  • Geforce 9400 gt driver windows 10
  • Журнал защиты windows 10 как найти
  • Windows authentication iis express