Задержка звука bluetooth наушники windows 10

Что делать, если звук в Bluetooth наушниках отстает от видео и в играх на телефоне Android или в Windows 10, 8.1 и Windows 7. Причины проблемы и возможные методы исправления.

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

Совсем недавно мы купили новый ноутбук на 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 работает, и что означают записи в реестре по адресу HKLMSOFTWAREMicrosoftWindowsCurrentVersionMMDevicesAudioRender{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

Содержание

  1. Почему отстает звук в беспроводных Bluetooth наушниках
  2. Проблемы и пути решения
  3. Что делать с ПК, если в Bluetooth наушниках прерывается звук?
  4. Что делать со смартфоном, если пропадает звук в Блютуз наушниках?
  5. Прерывается звук
  6. Плохое качество звука
  7. Как сократить задержку Bluetooth-наушников?

Почему отстает звук в беспроводных Bluetooth наушниках

Прежде всего некоторые важные нюансы, касающиеся передачи аудио по Bluetooth, которые стоит знать и учитывать:

  • Задержка при передаче звука по Bluetooth есть всегда: где-то отсутствие синхронизации явно заметно, где-то оно проявляется в меньшей степени и на него можно не обращать внимания.
  • Время задержки может зависеть от конкретных устройств (смартфона, Bluetooth адаптера на ноутбуке, самих наушников), используемого профиля и кодека (SBC, aptX, LDAC и другие) для передачи аудио, настроек качества передаваемого звука.

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

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

Проблемы и пути решения

Проблемы со звуком в блютуз наушниках могут быть вызваны разными причинами:

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

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

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

Что делать с ПК, если в Bluetooth наушниках прерывается звук?

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

2. Если адаптер беспроводной связи вставлен в компьютере в задний порт USB, перенесите его в разъем на передней панели (при наличии). Еще можно купить специальный USB хаб с удлинителем и разместить его на столе.

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

Что делать со смартфоном, если пропадает звук в Блютуз наушниках?

Если пропадает звук в Блютуз наушниках либо немного отстает при подключении к телефону, стоит проверить правильность и целесообразность всех настроек:

1. Режим «Видимый для всех» на телефоне иногда снижает нагрузку на процессор.
2. В настройках Android версии 6.0 есть пункт «Передача по BT» в разделе «Разрешения приложений». В нём надо снять все галочки за исключением «Громкость» и нажать на «Изменение настроек» – «Не отключать».

3. Поднесите устройства в процессе воспроизведения друг к другу вплотную и поставьте на паузу. Может понадобиться несколько секунд для полноценной синхронизации.

4. Существуют специальные программы для ускорения работы мобильного телефона: Antutu CPU, SetCpu, Tegrak и многие другие. Возможно, смартфону просто не хватает мощности и это поможет.

5. Плохо заряженная аккумуляторная батарея — еще одна причина плохой связи. При низком уровне заряда большинство гаджетов автоматически снижают мощность процессора для экономии энергии, из-за чего может начать отставать воспроизведение.

Прерывается звук

Когда в bluetooth наушниках прерывается звук, также не комфортно смотреть видео и  слушать песни. Плохое качество передачи звука в наушники, частые заикания преодолевается следующими мерами:

  1. Прежде всего, если звук в наушниках то пропадает, то появляется, перезагрузите устройства и выполните по новой блютуз соединение.
  2. На телефоне в настройках проверьте активность режима «Видимый для всех».
  3. Может помочь очистка памяти смартфона, с которого транслируется звукоряд. Также следует отключить работающие в фоновом режиме приложения.
  4. Подзарядите аккумуляторы смартфона и наушников.
  5. Не рекомендуется через блютуз наушники слушать композиции формата FLAC. Композиции с повышенным битрейтом может воспроизводится с микропаузами. Отдавайте предпочтение битрейту mp3 320 Кбит/сек.
  6. Может помочь в настройках медиаплеера смена параметров discret sound на wave out или наоборот.

Плохое качество звука

Плохое качество звучания при подключении блютуз наушников к персональному компьютеру чаще возникает из-за наличия в них микрофона.

Windows определяет Head Set двояко как:

  • стереонаушники — Stereo;
  • гарнитуру — Hands Free.

В этом случае в Windows задействован профиль HFP — при подключённом микрофоне можно слушать треки только в монорежиме. Для улучшения качества звука необходимо сменить профиль.

Это делается следующим образом:

  • После подключения наушников к ПК входят в панель управления звуком.
  • В появившемся окошке выбирают строку «Устройства воспроизведения».
  • В новом окне bluetooth наушники отобразятся дважды как «Наушники» и «Головной телефон».
  • Правой кнопкой мыши топают по графе «Наушники», а затем выбирают «Использовать по умолчанию» и подтверждают, нажав на «ОК».
  • После всех манипуляций Head Set должны воспроизводить чистое, качественное стереозвучание.

Как сократить задержку Bluetooth-наушников?

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

  1. Убедиться, что наушники используют кодек с потерями (с большой задержкой). В настройках Bluetooth необходимо найти в списке сопряженных устройств подключенные беспроводные наушники. Рядом с их названием будет отображаться название кодека. Например, SBC— аудиокодек с потерями, поэтому рекомендуется изменить его.
  2. Проверить, поддерживают ли наушники поддерживают другие кодеки (например, aptX или LDAC). Если устройство по умолчанию поддерживает только SBC, изменить его не получится.
  3. Активировать «Режим разработчика» в смартфоне и вручную изменить используемый кодек.

Если проблема осталась нерешенной, помогут следующие способы:

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

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

Источники

  • https://myearphones.ru/instruktsii/otstaet-zvuk-v-blyutuz-naushnikah
  • https://remontka.pro/bluetooth-headphones-audio-lags-sync/
  • https://besprovodnik.ru/otstaet-zvuk-v-bluetooth-naushnikax/
  • https://NaushnikIn.ru/sovety/pochemu-bluetooth-naushniki-zaikautsya
  • https://1bluetooth.ru/blyutuz-naushnik/otstaet-zvuk-zaderzhka-i-preryvanie
  • https://AndroidLime.ru/bluetooth-headphone-delay

Есть беспроводные наушники bluetooth 5.0. Я купил USB свисток Digma (RTL8761B, bluetooth 5.0), чтобы подключить их к ПК. У меня Windwos 10 (это важно). Поставил драйвера и почему-то была задержка звука. Через вот этот «тестер» https://www.youtube.com/watch?v=XTppcw0UdaQ на глаз задержка примерно 400мс. На телефоне я получал задержку где-то в 50-80мс. Никаких экранирующих объектов рядом не было.

У меня есть ноутбук, на котором стоит windows 11. Я снёс встроенный Bluetooth на ноуте и поставил свисток. На моё удивление задержка была такая же, как на телефоне: 50-80мс.

Тогда я решил установить windows 11 на ПК, на старый hdd, чтобы убедиться, что дело в драйверах (потому что было предположение, что на моей windows 10, с отключенным обновлением, не может докачаться какой-то важный драйвер). На ПК действительно задержка пропала в windows 11. Чтобы убедиться, что это дело не в системе, а в драйверах, я на тот же hdd накатил windows 10, обновил её до последней версии, поставил те же самые драйвера на USB свисток и там всё равно была задержка.

для тех, кто начнёт говорить про порты и экранирование, ещё раз повторяю: в одном и том же порту на чистой windows 11 нет задержки, а на чистой windows 10 есть.

Как завести на windows 10 беспроводные наушники без задержки?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

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

блютуз наушники

Проблемы и пути решения

Проблемы со звуком в блютуз наушниках могут быть вызваны разными причинами:

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

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

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

Отстает звук

Часто при просмотре видео на ноутбуке, смартфоне или компьютере случается такая проблема как рассинхрон аудио и видео. Звук иногда запаздывает на доли секунды, но смотреть ролик или фильм очень неприятно. Варианты решения проблемы, если отстает звук в наушниках блютуз:

  1. Всегда при проблемах с беспроводными устройствами сначала имеет смысл провести повторное сопряжение.
    Можно также перезагрузить уши и источник.
  2. Если хотите посмотреть видео, то можно задать синхронизацию в настройках медиаплеера.
    Видеоряд будет идти с небольшой задержкой, подстраиваясь под звук. К сожалению, для игр это недоступно.
  3. В ноутбуке можно попробовать запрет Виндовс отключать Блютуз передатчик для экономии энергии.
    Диспетчер устройств, Bluetooth, нужный передатчик в списке, его свойства левой кнопкой мыши, управление электропитанием, снять галочку с “разрешить отключение…”.
  4. В ПК попробовать переставить модуль блютуз в другое гнездо, с передней панели на заднюю или наоборот.
  5. Для ПК и ноутов можно попробовать удалить драйвер блютуз, перезагрузить устройство и обновить драйвер автоматически, либо найти и скачать его вручную.
  6. Проверить в приложении звук, являются ли наушники устройством для передачи звука по умолчанию, если нет, то назначить.
  7. Там же в свойствах наушников открыть вкладку дополнительно.
    И выбрать частоту дискретизации для DVD, если там CD, или наоборот. Попробовать разрешить или запретить монопольный режим. Каждое изменение сопровождать перезагрузкой и проверкой.
  8. Открыть устройства и принтеры в панели управления, найти гарнитуру блютуз, открыть свойства.
    Вкладка службы, убрать галочку с “беспроводная телефонная связь”.
  9. При сопряжении с любым устройством попробовать отключить различные спецэффекты и улучшатели звука в приложении наушников.
  10. Отодвинуть ил отключить рядом стоящие приборы, типа СВЧ-печи или маршрутизатора.

Читайте также

Как увеличить звук в наушниках на компьютере или ноутбуке

Прерывается звук

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

  1. Повторное сопряжение устройств с их перезагрузкой.
  2. Если источником сигнала является телефон, активируйте режим “Видимый для всех”.
  3. Для Андроид 6.0 доступен такой вариант — “Передача по BT”, разрешения приложений, убрать все галочки, оставить только на звук, выбрать изменение настроек и активировать “не выключать”.
  4. Когда сопрягаете устройства, расположите их вплотную друг к другу на 30 секунд, чтобы наладился стабильный сигнал. Это можно сделать и при просмотре видео, достаточно включить паузу на время.
  5. Иногда в том, почему в bluetooth наушниках прерывается звук, виноват слабенький процессор смартфона. Нужно почистить память, отключать работу приложений в фоновом режиме, для этого есть специальные программы в плеймаркете. Там же можно скачать приложения для ускорения работы смартфона, например Set CPU, Antutu CPU, Tegrak.
  6. Низкий уровень заряда в наушниках блютуз или в смартфоне не дают Bluetooth работать в полную силу.
  7. Отстает звук в наушниках и при выборе формата аудиофайлов FLAC. Такие композиции будут самыми качественными, если использовать девайсы способные их передать. В противном случае звук отстает. Лучше выбирать битрейт МП3 320 Кбит/сек.
  8. Можно поэкспериментировать в настройках медиаплеера, поменять формат звучания с Discret Sound на Wave Out.

Плохое качество звука

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

  • разная версия Bluetooth наушников и устройства-источника;
  • кодеки, применяемые на ушах, не поддерживаются на смартфоне. Лучшими считаются Atpx, Atpx HD, LDAC, но с условием их использования на обоих устройствах;
  • если вы только выбираете наушники для покупки и модуль блютуз для компьютера, то обратите внимание на устройства, которые поддерживают функцию Low Latency, она обеспечивает передачу по блютуз без задержек;
  • помехи для сигнала в виде большого расстояния между устройствами или преград — одежды, предметов, стен;
  • некачественная блютуз-гарнитура. Дешевые китайские наушники могут сильно разочаровать.

Что делать:

  1. Повторно провести сопряжение наушников и источника, перезагрузив каждое устройство.
  2. Расположить устройства близко без помех в виде предметов или одежды.
  3. Попробовать снизить качество воспроизведения в настройках аудиоустройства до 128 Кбит/сек.
  4. Отключить дополнительные улучшения звука в приложении наушников.
  5. Избавиться от постороннего шума иногда помогает изменение настроек эквалайзера.

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

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

Выводы

Читайте также

Не работают блютуз наушники: причины и решение проблемы

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

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

Что такое aptX и почему речь о нём

  • Это аудио кодек. Говоря проще он уменьшает задержку и делает звук чище, становится больше деталей в сравнении с SBC и AAC;
  • Присутствует не только в дорогих наушниках;
  • Достаточный для повседневных целей: посмотреть фильм, послушать музыку онлайн с битрейтом 320 kbs;
  • Не избыточный, менее труднодоступный в сравнении Aptx HD и LDAC;
  • По сравнению с SBC и AAC разница есть и различима на слух, если слушать музыку хотя бы в 320kp или смотреть видео.

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

Как начать пользоваться

На iPhone, iPad — никак. На Android зависит от устройства. На компьютерах Mac проблем не будет, даже относительно старые модели со встроенным Bluetooth поддерживаю Aptx. Есть нюанс — нужно следить за тем, через какой кодек Mac передает звук на беспроводное аудиоустройство.

Когда используется не одно устройство, допустим клавиатура и наушники Mac отдает приоритет первому подключенному устройству. Подключенные после него наушники не получат Aptx. Проверить это легко: держите Option, нажимаете на иконку Bluetooth в верхнем баре, выбираете устройство и смотрите через какой кодек оно работает.

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

Ситуация с Windows

«Куплю самый новый и дорогой адаптер от фирмы, которая у всех на слуху и в нём всё будет» — Не-а, не будет.

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

Решение

Aptx запатентован Qualcomm. Мне не ясно почему, но многие производители не выпускают адаптеры с его поддержкой. Нужен адаптер на чипе CSR8510 от Qualcomm. Не буду говорить за все варианты на рынке, но Windows 10 подхватывает большинство адаптеров на этом чипе и сторонних драйверов устанавливать не нужно. Aptx будет работать сразу. Не буду называть брендов, скажу, что цены варьируются от 150-250р. на Али и до 500-700 в магазинах.

Решение кажется очевидным, но не тогда, когда ты пытаешься выбрать адаптер из десятков брендовых и ноунеймов. Когда ни у каких из них не указана поддержка Aptx по-человечески, ты видишь только тонны негативных отзывов, по большей части, о комплектных драйверах, которые на практике устанавливать нет необходимости. Aptx на Windows есть, он работает и имеет смысл, следуй за белым кроликом, как говорится (за чипом Qualcomm).

На чтение 7 мин Просмотров 14.6к. Опубликовано 8 октября 2021
Обновлено 1 февраля 2022

Очень часто пользователи беспроводных наушников сталкиваются с проблемой, когда при воспроизведении звук отстает от видео или даже проигрывается рывками, как бы заикается. Особенно это характерно для Bluetooth гарнитур с технологией TWS, то есть когда сами наушники не связаны между собой проводом. Данный баг актуален для любых брендов — JBL, Honor и Huawei Earbuds, Xiaomi и Redmi Airdots, Haylou, Vivo, Samsung и даже Airpods от Apple. Пожтому наша инструкция будет полезна максималтному количеству пользователей блютуз наушников.

Подключение по Bluetooth — причина заикания в наушниках

Чаще всего ошибки с запаздыванием звука возникают по причине некачественной беспроводной связи по блютуз между наушниками или между ними и источником связи, то есть телефоном, ноутбуком, ТВ приставкой или другим устройством.

Расстояние

При использовании гарнитуры стоит учесть, что Bluetooth, это соединение «ближнего радиуса» действия. Стандарт Bluetooth 5 подразумевает максимальную удаленность от передатчика до приемника в 10 метров. И то только в прямой видимости пространстве. В условиях квартиры это может означать, что для качественного приема вы не должны выходить из комнаты. Иначе даже в соседнем помещении звук может начать заикаться и прерываться.

Перегородки

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

Помехи

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

Улица

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

беспроводные наушники caseguru

Программные ошибки

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

Интернет

Если у вас музыка отстает от видео или заикается при просмотре роликов из интернета, то прежде всего напрашивается низкая скорость соединения с сетью. Особенно, если речь идет о мобильном интернете 4G. В этом случае помочь может поиск месторасположения с более хорошим приемом сигнала. Или также можно понизить качество видео, например, с 720P до 360P.

Кодеки

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

Режим экономии аккумулятора

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

Прошивка

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

беспроводные наушники harper hb-520

Аппаратные поломки

В числе распространенных проблем, связанных непосредственно с «железом», является разряд батареи наушников. Им попросту не хватает питания, в результате чего звук начинает пропадать. Наконец, не стоит исключать и банальную поломку гарнитуры. В них могла попасть влага или грязь, которая нарушает работу беспроводного модуля.

беспроводные наушники tws i11

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

Как исправить ошибку, когда TWS наушники прерываются, заикаются или отстают?

На основе всего вышесказанного вот вам несколько практических советов, которые могут исправить проблему с некорректно работающими беспроводными наушниками:

  • Перед работой зарядите свои наушники до 100 %. Что делать, если они не заряжаются от кейса, я рассказывал в другой статье.
  • Используйте их так, чтобы и оба беспроводных модуля, и телефон находились в непосредственной близости друг от друга и вдали от других приборов
  • Перезагрузите наушники или сбросьте настройки и подключите их к смартфону заново
  • Отключите Bluetooth сеть на телефоне (ноутбуке, компьютере и т.д.). При необходимости удалите гарнитуру из системы полностью («забудьте»), после чего включите блютуз и по новой установите сопряжение с TWS
  • Во время прослушивания музыки через наушники не подключайте смартфон к другим гаджетам по блютуз
  • Проверьте настройки кодеков для Bluetooth в системных параметрах операционной системы смартфона Android

Практическая инструкция

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

Кодеки блютуз

Начнем с того, что нам потребуется разблокировать так называемый «Режим разработчики», который открывает доступ к детальным системным настройкам. Для этого нужно зайти в меню «О телефоне» и несколько раз подряд нажать на «Номер сборки» или «Версия оболочки» в зависимости от модели телефона.

После чего в меню «Система» появится новый раздел — «Для разработчиков»

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

Далее открываем пункт «Аудиокодеки» и выбираем «AAC»

При сохранении заиканий можно его поменять на «SBC», но качество звучания при этом существенно ухудшится.

Следующий шаг — частота дискретизации. Здесь надо выбрать 44.1 кГц

Далее, «Аудио бит на выборку» — ставим «16»

Наконец, режим аудиоканала — выставляем на «Стерео»

Здесь же принудительно можно ограничить число одновременно подключенных к телефону Bluetooth устройств и поставить «1», чтобы наушники точно работали одни и им никто не мешал

Экономия батареи

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

Проще всего найти это меню через поиск — вбиваем слово «батареи» и выбираем «Использование — Настройки энергопотребления»

Откроется страница с графиком текущего потребления заряда. Нам надо найти иконку вызова дополнительного меню в виде трех точек. И выбрать «Показать полное использование устройства»

показать полное использование

Далее идем в «Экономия заряда аккумулятора» — «Все приложения»

Находим в списке «Bluetooth» и ставим галочку на «Не экономит заряд».

Теперь любые девайсы, которые подключаются к телефону по блютуз будут использовать все возможности данного интерфейса без ограничений. А значит и качества соединения будет максимально возможным для данной модели.

Актуальные предложения:

Александр ВайФайкин

Задать вопрос

  • 10 лет занимается подключением и настройкой беспроводных систем
  • Выпускник образовательного центра при МГТУ им. Баумана по специальностям «Сетевые операционные системы Wi-Fi», «Техническое обслуживание компьютеров», «IP-видеонаблюдение»
  • Автор видеокурса «Все секреты Wi-Fi»

Понравилась статья? Поделить с друзьями:
  • Задержка ввода с клавиатуры windows 10
  • Задержка в играх что делать windows 10
  • Задействовать dma windows 7 что это
  • Задействовал не всю память жесткого диска при установке windows 10
  • Задвоилась учетная запись в windows 10 при входе