Отстает звук по bluetooth windows

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

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

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

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

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

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

Включить и включить повторно 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. Помимо физических повреждений, такие симптомы, как искажение звука на высоких уровнях громкости и странный шум, могут подсказать вам, что наушники нуждаются в ремонте или замене.


Зарубин Иван


Эксперт по Linux и Windows

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

Похожие статьи

Отстает звук в Bluetooth наушникахМногие, впервые подключив беспроводные наушники к 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 телефоне или планшете, вы можете попробовать следующие шаги:

  1. Проверить, какие кодеки поддерживаются вашими 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). Есть и другой способ изменения кодека, о котором далее. Выбрать кодек A2DP на Android
  2. При отставании звука по Bluetooth в интенсивных Android играх можно использовать другое приложение — BTmono, скачать которое можно в Play Маркет: https://play.google.com/store/apps/details?id=com.bedoig.BTmono. После запуска приложения нажмите в нем кнопку «On» (включить). Качество звука станет хуже, но задержка значительно уменьшится, что может позволить более комфортно играть в игры. Приложение BTmono для Android
  3. Если включить режим разработчика на Android последних версий, в параметрах разработчика вы найдете возможность ручного выбора кодека Bluetooth (при условии, что он поддерживается наушниками) и других параметров передачи звука. Можно попробовать изменять кодек, качество аудио и посмотреть, как это повлияет на ситуацию. Изменение кодеков Bluetooth в параметрах разработчика Android
  4. Еще один метод, который в редких случаях срабатывает — при подключенных наушниках Bluetooth зайти на телефоне в Настройки — Подключения — Bluetooth, нажать по кнопке настроек конкретных наушников и при наличии такой возможности оставить включенной только опцию передачи аудио/музыки, без возможности вызовов (звонков). Включить только передачу аудио на Bluetooth

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

Задержка аудио по Bluetooth в VLC

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

Отставание аудио по Bluetooth в Windows 10, 8.1 и Windows 7

Если рассматриваемая проблема у вас появилась при подключении Bluetooth наушников к ноутбуку или компьютеру с Windows 10, 8.1 или Windows 7, можно попробовать такие методы решения:

  1. Если вам не требуется возможность связи по беспроводным наушникам с микрофоном, можно зайти в устройства записи и воспроизведения (Как зайти в «Устройства записи и воспроизведения» Windows 10) и если там на вкладках «Воспроизведение» и «Запись» есть «Наушники» и «Головной телефон» — отключить «Головной телефон» (правый клик — отключить). Отключение головного телефона в устройствах записи и воспроизведения
  2. Там же, выбрав наушники на вкладке «Воспроизведение» откройте их свойства и проверьте все вкладки. Отключите любые включенные эффекты, а если на вкладке «Дополнительно» доступно уменьшение качества аудио, попробуйте использовать его.
  3. Зайдите в Панель управления — Устройства и принтеры, нажмите правой кнопкой мыши по вашим Bluetooth наушникам и откройте их свойства. На вкладке «Службы» попробуйте отключить все службы кроме «Приемник аудио» и применить настройки. Отключение служб наушников Bluetooth
  4. Вы можете проверить поддерживаемые вашими наушниками и используемые в текущий момент кодеки 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 в Windows

Также, по некоторым отзывам, для Bluetooth-адаптеров Intel 8260, 7265/3165/7260/3160 помогает установка драйверов Intel Bluetooth Audio. Причем эти драйверы отсутствуют на сайте Intel, но есть на сайте Dell (устанавливаются и на другие устройства).

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

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

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

Также как и в случае с Android — для скачанного видео вы можете настроить задержку аудио в проигрывателе, например в медиа-плеере VLC вы можете найти такую настройку в меню «Инструменты — Синхронизация дорожек».

И, если ни одно решение не оказалось полезным, помните, что и сами Bluetooth наушники могут создавать заметную задержку, в таком случае манипуляции в ОС Windows и с драйверами оказываются не применимы.

Видео инструкция

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

Audio delay is incredibly frustrating, but fixing it on Windows 11 is a breeze.

man wearing gaming headphones in front of screen

There is nothing worse than delayed audio, especially when it comes from Bluetooth hardware you’ve spent a fortune on. Typically, this issue lies with the operating system, not the hardware, and Windows 11 users are more prone to experiencing it.

If you’re using Windows 11 and experiencing lagging or delayed audio from your Bluetooth hardware, we’ve shared some fixes below to resolve the issue.

1. Reconnect Your Bluetooth Hardware

Make sure it isn’t a temporary interruption that is delaying your audio output before you start troubleshooting. Remove the Bluetooth-enabled hardware from your computer and re-add it to rule it out. If establishing a new connection does not solve the problem, move on to the next step.

2. Rule Out Interference From Other Devices

As a next step, ensure none of the devices you’ve connected to your computer are causing interference. Disconnect each Bluetooth device one by one to find the interfering one. If the audio gets fluid after disconnecting a particular device, you’ve found the culprit. Nonetheless, if it doesn’t make a difference, then rule out the possibility of hardware malfunction.

3. Rule Out Hardware Issues

When you’re sure that it’s not a temporary glitch, you should rule out hardware issues. Therefore, disconnect your audio output device from your computer and connect it to another computer or mobile phone. If the audio lags on the other device, your hardware is to blame.

To rule out range issues, move closer to the receiver and see if the audio output behaves the same. If you’re sure that the hardware is causing the problem, you’ll either have to repair or replace it.

If your speaker or headphone starts working smoothly when you connect them to another device, it might be a problem with your operating system. If that’s the case, you may find the following checks helpful.

After ruling out the hardware issues, ensure that the audio delay does not originate from the media player you are playing the audio or video in rather than the operating system or hardware. Media players can cause annoying issues like the one we are discussing, although it is less likely.

To rule out this possibility, play the media file in another media player you have. If the audio delay occurs across multiple media players, make sure the audio delay isn’t occurring while running a particular file or files in a specific format.

5. Ensure the Issue Isn’t File or Format Specific

Ensure the problem isn’t limited to a specific audio or video file or files in a particular format. To confirm that, play a different audio or video file, preferably in another media player than the one you’re having trouble with.

If audio smooths out after changing file or format, compatibility is to blame. As mentioned above, you can either play these files in another media player or convert them to the supported format. If the problem persists, it might be time to implement system-level fixes.

6. Update the Bluetooth Driver

To begin with system-level fixes, you should update the Bluetooth driver. Outdated drivers are often to blame for unforeseen problems, so it’s important to rule out this possibility before proceeding. Follow the below steps to update the Bluetooth driver:

  1. Right-click on the Windows Start button and click on Device Manager.
  2. Expand the Bluetooth category.
  3. Right-click on the relevant Bluetooth driver and select Update driver.
     Updating Relevant Bluetooth Driver in Windows 11 Device Manager
  4. Select Search automatically for drivers.
    Automatically Updating Drivers by Clicking on Search Automatically for Drivers Option
  5. Give your computer a fresh start after downloading the appropriate driver.

7. Disable Audio Enhancements

The goal of audio enhancements is to make your headphones sound perfect. While it generally succeeds, it is occasionally known for disturbing audio quality. Therefore, if you’ve enabled this setting, it’s best to disable it to see if it fixes the problem.

Follow the below steps to disable audio enhancements:

  1. Right-click the Windows Start button and select Settings.
  2. On the left sidebar, click the System tab.
  3. In the right-hand pane, click Sound.
  4. From the Output section, select your relevant audio device.
     Selecting Relevant Bluetooth Headphones in Sound Output Settings in Windows 11 Settings App
  5. Click on Advanced under Enhance audio in the Output settings.
    Opening Advanced Option in the Sound Output Settings in Windows 11 Settings App
  6. In the Properties window, click the Enhancements tab.
  7. Check the box that says Disable all enhancements.
     Disabling Audio Enhancements from the Properties Window of Headphones in Windows 11
  8. Hit OK after clicking Apply.

Disabling the audio enhancements may result in a smoother audio experience. If it doesn’t help, move on to the next fix.

Note: Occasionally, disabling audio enhancements further deteriorates the sound quality. For the same result, uncheck the same box again to enable audio enhancements.

8. Use a Built-In Windows Troubleshooter

As with its predecessor, Windows 11 includes a Bluetooth troubleshooter that automatically diagnoses and fixes Bluetooth problems. Hence, running a troubleshooter will likely resolve your issue if the above checks and fixes haven’t helped you find the culprit.

Follow the below steps to run the troubleshooter:

  1. Right-click on the Windows Start button and click Settings.
  2. In the left sidebar, click the System tab.
  3. In the right-hand pane, click Troubleshoot.
  4. Go to Other troubleshooters.
  5. Next to the Bluetooth troubleshooter, click Run.
    Running Bluetooth Troubleshooter to Detect Issues Automatically in Windows 11

Make sure you correctly follow the instructions you see on the screen and let the troubleshooter diagnose the problem. If it finds the issue and prompts you for access, give the troubleshooter permission to resolve it for you. When that’s done, the audio delay should be resolved.

9. Tweak Windows Audio Service

If none of the fixes have worked for you, you should ensure that Windows audio service is configured correctly. Follow the below steps to do so:

  1. Type Services in the Windows Search to open the Services app.
  2. In the right-hand pane, locate the Windows Audio service.
  3. Double-click the Windows Audio service.
  4. Ensure Automatic is selected in the Startup type dropdown in Windows Audio Properties. (Make sure Automatic (Delayed Start) isn’t set)
    Setting the Startup Type of Windows Audio Service to Automatic in Services Settings
  5. Click Apply and OK once you’ve made this change.

Improve the Quality of Your Windows 11 System Audio

By following the above fixes, you should be able to get rid of delayed audio and make it more fluid. If all the fixes fail, update your Windows OS if an update is available. If that fails, contact your hardware manufacturer’s customer support, as you might need to install a dedicated driver to resolve the audio delay issue.

Как проверить, можно ли обновить ваш ПК с Windows 10 до Windows 11?

Попробуйте хаки, перечисленные здесь, чтобы расстаться с задержкой звука Bluetooth на ПК с Windows 11.

Microsoft уже выпустила новую версию Windows 11, более элегантную, удобную и изящную, чем ее предшественница Windows 10. Но новый дизайн с множеством функций не означает, что в нем нет ошибок и проблем. Microsoft быстро работает над устранением этих проблем и исправлением ошибок.

Как исправить задержку звука Bluetooth в Windows 11 - rdd.media 2023

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

Отключите, а затем снова подключите устройство Bluetooth.

Это один из самых простых хаков, но поверьте мне, он работает как шарм и способен исправить большинство случайных и необъяснимых ошибок на вашем ПК с Windows 11. Кроме того, очень легко удалить и снова подключить устройства Bluetooth. Оставив это в стороне, давайте вернемся и посмотрим, как отключить и повторно соединить устройство Bluetooth.

Прежде всего, откройте приложение «Настройки» на ПК с Windows 11. Вы можете сделать это, коснувшись приложения «Настройки» в закрепленном разделе или введя «настройки» в строке поиска меню «Автозагрузка» и щелкнув соответствующий результат.

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

Задержка звука Bluetooth в Windows 11

  • Затем нажмите кнопку «Добавить устройство» в окне «Bluetooth и устройства».
  • Когда откроется экран «Добавить устройство», нажмите на опцию Bluetooth, чтобы увидеть список всех доступных устройств.
  • Нажмите на Bluetooth-устройство, которое вы хотите подключить, чтобы начать сопряжение с Bluetooth-устройством.
  • Как только устройство Bluetooth будет успешно сопряжено, вы услышите звуковой сигнал, подтверждающий процесс.

Обновите драйвер Bluetooth для устройства

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

  • Чтобы обновить драйвер Bluetooth вашего устройства, перейдите в меню «Пуск» и введите «Диспетчер устройств». Как только вы увидите его плитку в результатах поиска, нажмите на нее, чтобы открыть.
  • Затем щелкните треугольник перед опцией Bluetooth, чтобы увидеть список устройств.
  • Теперь щелкните правой кнопкой мыши устройство Bluetooth, для которого вы хотите обновить драйвер.

Как исправить задержку звука Bluetooth в Windows 11 - rdd.media 2023

  • Теперь выберите параметр «Обновить драйвер» в открывшемся контекстном меню.
  • В окне обновления драйверов выберите здесь параметр «Автоматический поиск драйверов».
  • После обновления драйвера перезагрузите компьютер и посмотрите, устранена ли задержка звука Bluetooth.

Запустите средство устранения неполадок Bluetooth на ПК с Windows 11.

Это еще один простой способ исправить задержку звука на устройствах Bluetooth. Опция устранения неполадок Bluetooth умело обнаружит и устранит любую системную проблему, которая создает эту проблему. Вот что вам нужно сделать:

  • Прежде всего, откройте меню «Пуск» на ПК с Windows 11 и введите параметры в строке поиска меню «Пуск» Windows 11.
  • Теперь щелкните первый результат поиска, чтобы открыть приложение «Настройки».
  • В приложении настроек вам нужно выбрать плитку «Система» на левой панели настроек Windows.
  • Затем перейдите к правой части приложения «Настройки», найдите плитку «Устранение неполадок» и щелкните ее, чтобы открыть средство устранения неполадок.
  • В этом окне найдите раздел «Параметры» и нажмите, чтобы открыть параметр «Другие средства устранения неполадок».

Как исправить задержку звука Bluetooth в Windows 11 - rdd.media 2023

  • В этом разделе на правой панели найдите параметр «Bluetooth» и нажмите кнопку «Выполнить», расположенную в правом конце окна. Это откроет новое окно на экране.
  • Вы увидите, что средство устранения неполадок начнет работать и обнаружит проблемы, связанные с проблемами Bluetooth. Когда процесс завершится, Windows 11 предложит возможные меры по устранению проблемы.

Вывод

Здесь мы подошли к концу краткого руководства по устранению задержки звука Bluetooth на ПК с Windows 11. Это очень распространенная проблема, которая может возникнуть из-за устаревшего драйвера или неправильной настройки. Надеемся, что один из вышеперечисленных методов обязательно решит проблему, с которой вы столкнулись. Знаете какой-нибудь другой способ исправить эту задержку звука в устройствах Bluetooth? Будем рады узнать.

Содержание статьи

  • Отключите, а затем снова подключите устройство Bluetooth.
  • Обновите драйвер Bluetooth для устройства
  • Запустите средство устранения неполадок Bluetooth на ПК с Windows 11.
  • Вывод

  • Отрубается интернет windows 10 через кабель
  • Отображение ярлыков на рабочем столе windows 10
  • Отображение текста в windows 10
  • Отображение содержимого файла в проводнике windows 10
  • Отстает звук микрофона windows 10