Bluetooth-наушники имеют определенные особенности, которые делают их хуже по сравнению с проводными. Одна из них — это отставание звука при передаче аудиоданных, с которым на данный момент ничего нельзя сделать. Задержка звука в наушниках может быть разной: все зависит от аудиокодека и версии Bluetooth, поэтому иногда она вовсе не ощущается. Правда, зачастую задержка является единственной причиной, по которой пользователи отказываются от беспроводной гарнитуры в пользу проводной. Несмотря на это, отставание звука от изображения можно сократить простыми способами. Разберемся, из-за чего возникает задержка звука в блютуз-наушниках и как ее сократить.
Разобрались, почему звук в наушниках отстает от картинки и что с этим делать
❗️ ПОДПИШИТЕСЬ НА НАШ ЯНДЕКС.ДЗЕН, ЧТОБЫ ЧИТАТЬ ЭКСКЛЮЗИВНЫЕ СТАТЬИ, КОТОРЫХ НЕТ НА САЙТЕ
Почему отстает звук в нашуниках
Отставание звука — скорее, фича, а не баг, причем вынужденная. Она возникает из-за того, что аудиоданным, передаваемым со смартфона или ноутбука, необходимо некоторое время для распознавания. Продолжительность задержки для преобразования в аудиосигнал измеряется в миллисекундах — в Bluetooth-наушниках она составляет около 30 мс, а в проводных — 5-10. Одной из главных причин отставания звука является аудиокодек — программа для преобразования звука, которая его сжимает, кодирует и декодирует. Из-за некоторых кодеков возникает большая задержка звука, поэтому пока его не изменят, звук в наушниках будет отставать.
Проводные наушники также имеют отставание звука, но оно крайне мало по сравнению с беспроводными
- Помимо кодека задержка звука в наушниках возникает и по другим причинам.
- Помеха между телефоном и наушниками или плохой сигнал Bluetooth.
- На смартфоне установлены сторонние приложения для настройки эквалайзера или улучшения звука. Их лучше отключить.
- Старая версия Bluetooth: лучше всего, если это Bluetooth 5.0 и выше. Для идеальной работы рекомендуется, чтобы версия модуля совпадала и в смартфоне, и в наушниках.
- Задержка звука возникает из-за подключения дополнительных устройств: например, Wi-Fi, клавиатур или смарт-часов.
- Звук отстает из-за перегрева процессора смартфона или планшета.
А еще в этом виноваты дешевые блютуз-наушники: к их выбору стоит относиться внимательно, иначе начинка вас разочарует, а звук будет подвисать из-за некачественных комплектующих.
❗️ Приложения, удаленные из Google Play, можно найти в нашем удобном каталоге
Как убрать задержку в блютуз наушниках
Есть несколько способов избавиться от задержки в наушниках
Чтобы задержка была менее заметной, можно попробовать сократить ее программно. Для этого вы можете попробовать сменить один кодек на другой.
- Проверьте, какой кодек используют ваши наушники: в настройках подключения он будет отображаться рядом с вашим аксессуаром.
- Проверьте, поддерживают ли ваши наушники более современные кодеки, например, aptX или LDAC.
- После этого активируйте режим разработчика и смените его в настройках.
Читайте также: Как увеличить громкость в наушниках на телефоне
Современные наушники имеют отдельные приложения для настройки, поэтому сменить кодек можно прямо там без использования режима разработчика. Внимательно изучите инструкцию к ним и попробуйте настроить параметры вручную. Если вдруг проблема не исчезла, попробуйте сделать следующее:
- Подключите наушники к другому устройству и проверьте, осталась ли задержка звука. Если проблемы нет, то все дело в смартфоне, если осталась — в наушниках.
- Включите в подключениях опцию «Видимый для всех».
- Попробуйте оставить в настройках гарнитуры «Только аудио», чтобы звонки не перенаправлялись на нее.
Если все настроили правильно, но видимого эффекта нет, попробуйте перезагрузить смартфон и закрыть лишние приложения.
Первый прозрачный телефон Nothing вышел официально. Получилось недурно
Чем отличаются версии Bluetooth
Качество работы Bluetooth зависит от версии модуля
В своих статьях мы всегда рекомендуем проверять версию Bluetooth-модуля. Желательно, чтобы в устройстве была установлена версия не ниже 5.0. Вот, почему это так важно.
- Предыдущие версии (Bluetooth 4.0 и 4.2) вышли в 2010-2014 годах, но вы можете заметить, что такие устройства синхронизируются крайне медленно. Более современные модули подключаются в разы быстрее.
- Более новые версии Bluetooth позволяют точнее определять геолокацию.
- Bluetooth 5.0 и выше позволяет подключить одни наушники к нескольким устройствам, а процесс переключения автоматический. Кроме того, ранее можно было использовать только одно приложение для передачи данных, а остальные блокировались.
- В новых версиях Bluetooth скорость передачи данных и расстояние выросли, а энергозатрты — снижены. Особенно это заметно при сравнении с Bluetooth 4.2.
Не менее важен и кодек LC3 — новый стандарт работы для аудиоустройств. Его особенность заключается в снижении энергопотребления и повышения качества звучания. То есть, качество звучания одного и того же трека с одинаковым битрейтом разительно отличается: например, не слышно треска и «плавания» звука при низком качестве.
Подписывайтесь на наш Телеграм-чат, чтобы не теряться в соцсетях!
Так что, именно для этого LC3 и был создан, чтобы заменить кодек SBC, которым мы пользуемся долго время. Еще это отличный способ сэкономить заряд батареи, поэтому автономность наушников должна вырасти уже в ближайшее время. Но чтобы прочувствовать его на все 100, необходимо, чтобы и наушники, и смартфон поддерживали Bluetooth 5.2.
Bluetooth-наушники не идеальны: в нашей статье мы разобрали самые серьезные недостатки, которые должны исправить уже в ближайшем будущем.
Совсем недавно мы купили новый ноутбук на Windows человеку, который до сих пор пользовался Mac’ами. Одна из замеченных проблем – при просмотре видео звук в Bluetooth наушниках запаздывает по отношению к видео, причём заметно. Используя slow motion видео на телефоне, мы выяснили, что задержка составляет порядка 200мс. Это много, и это мешает воспринимать речь в видео.
В то же время, на маке нет задержки. Почему так? Давайте разбираться.
Причины задержки звука
Воспроизводимый звук всегда будет отставать от источника. Часть этого отставания вызвана вполне физическими процессами – информация о звуке (в виде электронных сигналов) и собственно звук (в виде колебаний среды) должны дойти до наших ушей. Например, наблюдаемые 200мс – это время, за которое звук преодолевает примерно 70 метров в воздухе. Иными словами, если бы мы сидели в 70 метрах от ноутбука, 200мс было бы вполне ожидаемой задержкой.
Однако, мы не сидим в 70 метрах. А свет распространяется настолько быстро, что временем на распространение электронных сигналов можно пренебречь. Тут на первый план выходит задержка на программную обработку сигнала и буферизацию. Bluetooth – беспроводная связь, подверженная шумам и требующая разных согласований и разделений между устройствами, поэтому данные нельзя передавать в реальном времени. Чтобы звук шёл плавно, нужно на устройстве иметь достаточно большой буфер, который (почти) никогда не заканчивается – если передача застряла по любой причине, устройство продолжит играть звук из буфера.
Это очень краткое и грубое объяснение, если хотите подробностей – см. здесь. Главное, что нам нужно знать – через Bluetooth задержка неизбежна. Это вам не проводные наушники (хотя и там есть небольшая задержка).
Есть aptX LL, который должен снижать задержку для интерактивных приложений, но ни наушники, ни ноут этого протокола не поддерживают. Значит, так или иначе у нас будет минимум ~130мс задержки.
А Mac?
Окей, но ведь мак выводит звук без задержки? На самом деле, это не так. Если провести эксперимент и, написав примитивный HTML, заставить мак вывести аудио неожиданно, мы увидим те же самые ~200мс задержки.
Когда воспроизводится видео (ютуб), мак задерживает видеопоток, чтобы синхронизировать картинку и звук. Это нормально, потому что если видео начнёт воспроизводиться на 200мс позже, вы этого не заметите. Из разных источников, которые сейчас я уже не найду, я выяснил, что мак спрашивает у наушников, через сколько времени они выведут звук, и выводит видео с такой же задержкой.
То есть, мак обманывает нас и тем самым устраняет видимую задержку, хотя физически задержка всё ещё на месте. Я хочу быть обманутым!
Почему же винда этого не делает? Сие есть тайна великая. Цель этой статьи – не разрешить эту загадку, а исправить положение дел хоть как-нибудь.
Цель: заставить хром под виндой выводить видео с задержкой, чтобы аудио и видео синхронизировались.
При этом хотелось бы, чтобы при обновлении хрома/винды всё не сломалось.
Мы не будем пытаться узнать у bluetooth устройства, какая у него задержка, потому что писать драйвера под винду у меня сертификата нет.
Chrome
Мак не может задерживать всё видео подряд, потому что тогда весь интерфейс будет на 200мс в прошлом. Значит, он сообщает в Chrome задержку, и тот уже задерживает видео.
И действительно, можно найти вот это место в коде хрома, где аудиопоток запрашивает задержку, и вот эту функцию, где данные получаются из системы.
Под виндой, как ни странно, тоже есть похожий код, который опирается на функцию IAudioClock::GetPosition. Вот только винда не сообщает реальную позицию на аудио-устройстве, а учитывает только время на формирование потока данных. Я потратил пару часов на анализ того, как GetPosition
работает, и что означают записи в реестре по адресу HKLMSOFTWAREMicrosoftWindowsCurrentVersionMMDevicesAudioRender{GUID}Parameter
Коротко говоря, я так и не понял. Разбираться в кишках GetPosition
и её взаимодействий с остальным стеком без исходников очень тяжело. Это COM, весь построенный на интерфейсах, и там чёрт ногу сломит. Обидно: если бы можно было изменить какое-нибудь значение в реестре и указать задержку, проблема была бы решена…
Но ладно, мы выяснили, что хром готов к задержке под виндой, вот только она о ней не сообщает. А давайте проверим, что будет, если бы сообщала? Качаем исходники хрома, настраиваем сборку, и патчим этот код вот так:
Собираем и запускаем по оф. инструкции. Прошло 6 часов сборки, хром запустился. И видео стало опережать аудио на ~200 мс! Значит, предположение верно, хром может делать задержку.
Мы теперь можем пропатчить хром и, скажем, добавить флаг в chrome://flags
, чтобы задавать задержку. Но я могу себе представить, насколько такой флаг понравится хрому. И времени это займёт уйму, и шанс на успех не очень уж большой. Особенно если учесть аналогичный баг под линуксом.
Hack
COM можно перехватывать, если внедрить в Chrome свою DLL, и тогда можно будет управлять возвращаемым из GetPosition
значением, чтобы подкручивать задержку так, как нам хочется. Это решение хорошо по нескольким причинам:
-
Не сломается с обновлением хрома.
-
Будет работать с любой программой, использующей такой же метод доступа к аудио.
-
Быстро реализуется.
Но есть одна большая проблема: мы собираемся внедрять DLL в Chrome. Chrome – это браузер, и он очень активно защищается от любого вида внедрений кода, по понятным причинам. Например, здесь описываются защиты, и они довольно серьёзные. Главное ограничение, которое для нас важно – можно динамически грузить только библиотеки, подписанные ключом Microsoft. Шансов, что MS подпишет нашу библиотеку, не то что бы совсем нет, но величина эта из разряда особо малых.
С другой стороны, есть гитхаб проекта, который внедряет DLL в хром! См. тут. Качаем проект, запускам-проверяем, и видим любопытное:
Значит, хром не так уж и защищается? Потираем руки и пишем свою DLL.
DLL
Если коротко, работу DLL можно описать так: построить IAudioClock
как-нибудь, и пропатчить его vftable (таблицу виртуальных функций), что автоматически изменит все остальные IAudioClock
.
Строим IAudioClock
как-нибудь:
CoInitialize(NULL); // Поднимаем инфру COM
CoCreateInstance(
CLSID_MMDeviceEnumerator, NULL,
CLSCTX_ALL, IID_IMMDeviceEnumerator,
(void**)&pEnumerator); // Получаем IMMDeviceEnumerator
pEnumerator->GetDefaultAudioEndpoint(
eRender, eConsole, &pDevice); // Получаем audio endpoint
pDevice->Activate(
IID_IAudioClient, CLSCTX_ALL,
NULL, (void**)&pAudioClient); // Получаем аудио клиент
pAudioClient->GetMixFormat(&pwfx); // Нам нужен формат, получим
pAudioClient->Initialize(
AUDCLNT_SHAREMODE_SHARED,
0,
hnsRequestedDuration,
0,
pwfx,
NULL); // Инициализируем аудио-клиент
pAudioClient->GetService(IID_PPV_ARGS(&pClock)); // Получаем часы
InstallComInterfaceHooks(pClock, IID_IAudioClock); // И патчим их
Всё довольно просто и, в целом, следует гайду MS по получению аудио клиента (например, этому).
Замечательно, теперь давайте пропатчим полученный вышеpClock
:
// Патчит один метод
HRESULT HookMethod(IUnknown * original, PVOID proxyMethod, PVOID * originalMethod, DWORD vtableOffset)
{
// Получаем vftable
PVOID* originalVtable = *(PVOID**)original;
// Сохраняем оригинальный метод
*originalMethod = originalVtable[vtableOffset];
// Патчим!
originalVtable[vtableOffset] = proxyMethod;
return S_OK;
}
HRESULT InstallComInterfaceHooks(IUnknown * originalInterface, REFIID riid)
{
HRESULT hr = S_OK;
// Это часы?
if (riid == IID_IAudioClock)
{
ATL::CComPtr<IAudioClock> so;
// Получим интерфейс часов из IUnknown - проверка, что он есть
HRESULT hr = originalInterface->QueryInterface(IID_IAudioClock, (void**)&so);
if (FAILED(hr)) return hr; // Это что такое? Нам часы нужны.
// Снимаем защиту с памяти
DWORD dwOld = 0;
::VirtualProtect(*(PVOID**)(originalInterface), sizeof(LONG_PTR)*5, PAGE_READWRITE, &dwOld);
DWORD tmp;
// Патчим метод GetPosition
// Его номер в таблице - 4
HookMethod(so, (PVOID)Hook::GetPositionOriginal, &g_Context->m_OriginalGetPosition, 4);
// Возвращаем защиту памяти как была
::VirtualProtect(*(PVOID**)(originalInterface), sizeof(LONG_PTR)*5, dwOld, &tmp);
}
return hr;
}
Единственное, что неочевидно – откуда брать эту четвёрку, номер функции в vftable. Если посмотреть на IAudioClock
(тут), видно, что GetPosition
в нём под вторым номером ( на MSDN по алфавиту). При этом IAudioClock
наследует от IUnknown
, в котором три функции (QueryInterface
, AddRef
, Release
). Значит, наша GetPosition
– пятая, и имеет смещение 4.
DLL в первом приближении готова, и надо проверить её. Я написал примитивную программу, которая ничего особо не делает, только вызывает GetPosition
, и внедрил DLL в неё. И всё отработало!
Injection
Я воспользовался тем же самым инжектором, который уже работал, и внедрил библиотеку в хром.
Внедрение происходит более-менее стандартным способом: выделяется участок памяти под путь к файлу с DLL, и создаётся поток с точкой входа на LoadLibrary
. Поскольку эта функция принимает ровно один аргумент, его можно передать в CreateRemoteThread
, и поток загрузит DLL. Из забавного только то, что kernel32.dll
, в которой LoadLibrary
находится, не подвержена ASLR, и поэтому её функции всегда имеют один и тот же адрес во всех процессах (одинаковой архитектуры). Поэтому можно найти LoadLibrary
в своём процессе и вызвать по тому же адресу в другом.
Итак, я загрузил DLL, и… ничего не произошло. Библиотека внедрилась в хром, но GetPosition
не вызывался!
Я приаттачился к chrome.exe дебаггером, и увидел, что GetPosition
действительно не вызывается. Что за дела?
Оказывается, за звук в Chrome отвечает особая подсистема, называемая audio.mojom.AudioService
. И это отдельный процесс хрома, в который инжектор не инжектит, из-за вот этой вот проверки. Если проверить в этом процессе дебаггером, видно, что GetPosition
вызывается. Не беда, убираем проверку, запускаем, и… ничего! Библиотека не появляется в списке библиотек.
Вы знаете, как удобно отлаживать внедрение библиотеки? Учитывая, что это извне созданный поток, который выполняет одну единственную функцию LoadLibrary
? И что эта функция возвращает bool
, а ошибка получается через GetLastError
, которая для каждого потока своя? Я отвечу – вообще неудобно! Пришлось приаттачиться к процессу chrome.exe, поставить точку останова в LoadLibrary
, и после этого вызвать создание потока. Ошибка – STATUS_INVALID_IMAGE_HASH
, и это означает, что включилась защита хрома. Эта ошибка возвращается, если библиотека не подписана Microsoft.
См. здесь, страница 29. Получается, хром не защищает корневой процесс, но защищает детей, включая аудио-подсистему.
Ой.
Но ведь мне дают создать поток в хроме и память читать-писать! И вообще, а как же отладчики это всё делают?
Если гора не идёт к Магомету… Давайте сделаем ручками.
Ручной импорт DLL
Что такое импорт DLL? Что такое делает LoadLibrary
, чего мы не можем сделать вручную?
Для нормальной работы DLL нужны следующие действия по её загрузке:
-
Загрузить DLL в память процесса.
-
Настроить reloc’и.
-
Настроить импорты.
-
Передать управление в
DllMain
.
И всё это мы, в целом, можем сделать сами. Часть операций будет производить внешний процесс (выделение памяти, копирование, создание потока), а часть (настройка reloc’ов и импортов, вызов DllMain
) – код загрузчика, который внешний процесс внедряет в chrome.exe.
Код загрузчика (loader’а) должен быть PIC, то есть, poisition-independent, и не должен вызывать никаких библиотечных функций. Тогда этот код будет выглядеть совершенно одинаково в обоих процессах.
Наша библиотека, в свою очередь, не должна ссылаться ни на какие библиотеки, которые не подписаны Microsoft. Но это не проблема – нам нужны две с половиной библиотеки, и они подписаны.
Код загрузчика – многабукав
Давайте посмотрим и разберём код загрузчика – он не очень сложный, но длинный. Я убрал всю обработку ошибок для краткости.
// Структура с данными для лоадера
typedef struct _MANUAL_INJECT
{
PVOID ImageBase;
PIMAGE_NT_HEADERS NtHeaders;
PIMAGE_BASE_RELOCATION BaseRelocation;
PIMAGE_IMPORT_DESCRIPTOR ImportDirectory;
pLoadLibraryA fnLoadLibraryA;
pGetProcAddress fnGetProcAddress;
} MANUAL_INJECT, * PMANUAL_INJECT;
// код лоадера, получает указатель на _MANUAL_INJECT
DWORD WINAPI LoadDll(PVOID p)
{
// пропущены объявления
ManualInject = (PMANUAL_INJECT)p;
pIBR = ManualInject->BaseRelocation;
// смещение загрузки модуля относительно ImageBase из файла
delta = (ULONGLONG)((LPBYTE)ManualInject->ImageBase - ManualInject->NtHeaders->OptionalHeader.ImageBase);
// Reloc'и
// Пока есть блоки...
while (pIBR->VirtualAddress)
{
// Если есть reloc'и
if (pIBR->SizeOfBlock >= sizeof(IMAGE_BASE_RELOCATION))
{
// Каждый reloc - это слово.
count = (pIBR->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(WORD);
list = (PWORD)(pIBR + 1);
for (i = 0; i < count; i++)
{
if (list[i])
{
ptr = (PULONGLONG)((LPBYTE)ManualInject->ImageBase + (pIBR->VirtualAddress + (list[i] & 0xFFF)));
// Патчим память!
*ptr += delta;
}
}
}
// Следующий блок
pIBR = (PIMAGE_BASE_RELOCATION)((LPBYTE)pIBR + pIBR->SizeOfBlock);
}
// Теперь разбираемся с импортами
pIID = ManualInject->ImportDirectory;
while (pIID->Characteristics)
{
OrigFirstThunk = (PIMAGE_THUNK_DATA)((LPBYTE)ManualInject->ImageBase + pIID->OriginalFirstThunk);
FirstThunk = (PIMAGE_THUNK_DATA)((LPBYTE)ManualInject->ImageBase + pIID->FirstThunk);
// Загрузим библиотеку. Тут важно, чтобы она была подписана MS!
hModule = ManualInject->fnLoadLibraryA((LPCSTR)ManualInject->ImageBase + pIID->Name);
while (OrigFirstThunk->u1.AddressOfData)
{
if (OrigFirstThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG)
{
// Числовой импорт
Function = (ULONGLONG)ManualInject->fnGetProcAddress(hModule, (LPCSTR)(OrigFirstThunk->u1.Ordinal & 0xFFFF));
// Патчим!
FirstThunk->u1.Function = Function;
}
else
{
// Импорт по имени
pIBN = (PIMAGE_IMPORT_BY_NAME)((LPBYTE)ManualInject->ImageBase + OrigFirstThunk->u1.AddressOfData);
Function = (ULONGLONG)ManualInject->fnGetProcAddress(hModule, (LPCSTR)pIBN->Name);
// Патчим!
FirstThunk->u1.Function = Function;
}
OrigFirstThunk++;
FirstThunk++;
}
pIID++;
}
// Ищем DllMain
if (ManualInject->NtHeaders->OptionalHeader.AddressOfEntryPoint)
{
EntryPoint = (PDLL_MAIN)((LPBYTE)ManualInject->ImageBase + ManualInject->NtHeaders->OptionalHeader.AddressOfEntryPoint);
// И вызываем её!
return EntryPoint((HMODULE)ManualInject->ImageBase, DLL_PROCESS_ATTACH, NULL); // Call the entry point
}
return TRUE;
}
// Маркер конца кода лоадера
DWORD WINAPI LoadDllEnd()
{
return 0;
}
// Собственно injector
int Inject(DWORD pid, std::wstring dll)
{
// Нам нужны SE_DEBUG_NAME привилегии
if (OpenProcessToken((HANDLE)-1, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
tp.Privileges[0].Luid.LowPart = 20;
tp.Privileges[0].Luid.HighPart = 0;
AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL);
CloseHandle(hToken);
}
// Будем читать DLL
hFile = CreateFile(dll.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); // Open the DLL
FileSize = GetFileSize(hFile, NULL);
// Местный буфер для DLL
buffer = VirtualAlloc(NULL, FileSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
// Читаем DLL
ReadFile(hFile, buffer, FileSize, &read, NULL);
CloseHandle(hFile);
// Парсим DLL
pIDH = (PIMAGE_DOS_HEADER)buffer;
pINH = (PIMAGE_NT_HEADERS)((LPBYTE)buffer + pIDH->e_lfanew);
printf("nOpening target process.n");
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
// Теперь память в процессе под DLL
image = VirtualAllocEx(hProcess, NULL, pINH->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
// Скопируем хедеры
WriteProcessMemory(hProcess, image, buffer, pINH->OptionalHeader.SizeOfHeaders, NULL);
pISH = (PIMAGE_SECTION_HEADER)(pINH + 1);
// Теперь саму DLL, посекционно
for (i = 0; i < pINH->FileHeader.NumberOfSections; i++)
{
WriteProcessMemory(hProcess, (PVOID)((LPBYTE)image + pISH[i].VirtualAddress), (PVOID)((LPBYTE)buffer + pISH[i].PointerToRawData), pISH[i].SizeOfRawData, NULL);
// Если это код, защитим, чтобы DEP не ругался
if (pISH[i].Characteristics & IMAGE_SCN_CNT_CODE) {
VirtualProtectEx(hProcess, (PVOID)((LPBYTE)image + pISH[i].VirtualAddress), ((pISH[i].SizeOfRawData - 1) | 4095 + 1), PAGE_EXECUTE_READ, NULL);
}
}
// Теперь будем копировать loader
mem = VirtualAllocEx(hProcess, NULL, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); // Allocate memory for the loader code
// Заполним структуру для loader'а
memset(&ManualInject, 0, sizeof(MANUAL_INJECT));
ManualInject.ImageBase = image;
ManualInject.NtHeaders = (PIMAGE_NT_HEADERS)((LPBYTE)image + pIDH->e_lfanew);
ManualInject.BaseRelocation = (PIMAGE_BASE_RELOCATION)((LPBYTE)image + pINH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);
ManualInject.ImportDirectory = (PIMAGE_IMPORT_DESCRIPTOR)((LPBYTE)image + pINH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
ManualInject.fnLoadLibraryA = LoadLibraryA;
ManualInject.fnGetProcAddress = GetProcAddress;
// Копируем loader и параметры
WriteProcessMemory(hProcess, mem, &ManualInject, sizeof(MANUAL_INJECT), NULL); // Write the loader information to target process
WriteProcessMemory(hProcess, (PVOID)((PMANUAL_INJECT)mem + 1), LoadDll, (ULONGLONG)LoadDllEnd - (ULONGLONG)LoadDll, NULL); // Write the loader code to target process
// Снова успокоим DEP
VirtualProtectEx(hProcess, (PVOID)((PMANUAL_INJECT)mem), (ULONGLONG)LoadDllEnd - (ULONGLONG)LoadDll + sizeof(MANUAL_INJECT), PAGE_EXECUTE_READ, NULL);
// Вызовем loader - поехали!
hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)((PMANUAL_INJECT)mem + 1), mem, 0, NULL); // Create a remote thread to execute the loader code
// Ждём, пока поток завершится
WaitForSingleObject(hThread, INFINITE);
GetExitCodeThread(hThread, &ExitCode);
CloseHandle(hThread);
VirtualFreeEx(hProcess, mem, 0, MEM_RELEASE);
CloseHandle(hProcess);
VirtualFree(buffer, 0, MEM_RELEASE);
return 0;
}
Если отладка загрузки DLL через LoadLibrary
была болью, то отлаживать вот это вот – 10/10 боли. Ни один дебаггер не понимает, что этот код – DLL, и не маппит проанализированную DLL с сырцами/PDB на код в процессе. Поэтому отладка без анализа. Приходится параллельно сопоставлять отлаживаемый код и проанализированный.
Отладка с помощью printf()
Альтернатива отладчику – логирование. И здесь бы оно очень подошло, потому что отладчик – боль. Проблема в том, что логирование – тоже боль. Процесс аудио подсистемы chrome не имеет прав на запись файлов (даже в Temp) и на создание ключей реестра – это из того, что я проверил.
Этот процесс точно имеет доступ к CoreAudio, но мне сходу не приходит в голову, как выводить логи при помощи аудио девайсов.
Изучая разные подсистемы, обнаружил, что мне дают создавать сокеты и подключаться к внешним ресурсам. Бинго, пишем логгер, который льёт данные в localhost:7777
и слушаем его через nc -kl 7777
.
Но это не главное. Главное – это работает!
Поиск chrome.exe
Осталось всего ничего – находить процесс хрома и внедряться в него. Это сделано при помощи ETW логов, которые, в частности, сообщают о создании процесса. Для них есть библиотека krabs. И отвратительная документация.
krabs::kernel_trace trace(L"My magic trace");
krabs::kernel::process_provider provider;
provider.add_on_event_callback([](const EVENT_RECORD& record, const krabs::trace_context& trace_context) {
krabs::schema schema(record, trace_context.schema_locator);
if (schema.event_opcode() == 1) { // процесс запускается
krabs::parser parser(schema);
DWORD pid = parser.parse<uint32_t>(L"ProcessId");
auto cmdline = GetProcessCommandLine(pid);
// А chrome ли ты?
if (cmdline.find(L"chrome") != std::wstring::npos) {
// А audio подсистема ли ты?
if (cmdline.find(L"--utility-sub-type=audio.mojom.AudioService") != std::wstring::npos) {
std::wcout << "Found process " << pid << ", injecting...n";
Inject(pid, L"ChromePatcherDll.dll");
}
}
}
});
trace.enable(provider);
trace.start();
Дополнительные главы
Подмена GetPosition
для всех аудиоустройств начинает мешать, когда Bluetooth наушники отключаются, и задержка пропадает. Опережение звука – куда большая проблема, чем запаздывание, и мы не хотим вручную каждый раз менять задержку. Поэтому нужно бы узнавать, к какому аудио-девайсу относится данный IAudioClock
, и настраивать задержку соответственно.
Это приводит к двум проблемам:
-
Нужна программа, настраивающая задержки аудиоустройств
-
Загруженная DLL должна знать, какому устройству принадлежит
IAudioClock
Если первая проблема решается довольно просто (см. код здесь), то вторая оказалась крепким орешком. СамIAudioClock
не предоставляет ровно никаких способов достать из негоIMMDevice
(у которого есть GetId
) или самid
.
Есть два способа решения этой проблемы.
Отследить построение IAudioClock
Это один из возможных вариантов сопоставления IAudioClock
-> IMMDevice.
Можно просто перехватить все вызовы создания IMMDevice
-> IAudioClient
-> IAudioClock
, и построить внутренние соответствия между ними.
Это, однако, приводит к ряду проблем. Во-первых, становится необходимо перехватить гораздо больше функций (IMMDevice::Activate
, IAudioClient::GetService
, Release
для всех трёх), и приходится отслеживать создание и удаление объектов, чтобы память не потекла.
Во-вторых, и это более важная проблема, нужно успеть внедрить DLL, пока аудио-устройства ещё не созданы. Практика показывает, что через ETW логи я не очень успеваю это делать.
Можно было бы пропатчить родительский процесс хрома, чтобы он создавал процессы с CREATE_SUSPENDED
, но это очень большой геморрой. И если приложение-инжектор упадёт, хром останется без звука.
Недокументированные подходы
// магия, не трогать
Логика подсказывает, что если IAudioClock
не будет знать, какому IAudioClient
он принадлежит, он не сможет вычислять положение в потоке. Значит, где-то внутри IAudioClock
содержится какая-то ссылка на IAudioClient
.
Если раскопать отладчиком, видно, что IAudioClient
действительно сохраняется в IAudioClock
:
Аналогично, если посмотреть на IAudioClient
, нам повезёт, и там сразу будет ссылка на Unicode строку с id
девайса:
Окей, чтобы хоть немножко повысить переносимость, давайте не будем фиксировать смещения, а поищем их в динамике:
// Храним смещения (в единицах указателей)
struct Offsets {
// Адрес клиента внутри часов
int clockToClientPtr = -1;
// Адрес строки с id внутри клиента
int clientToIdPtr = -1;
};
Offsets offsets;
void FillOffsets(IMMDevice* device, IAudioClient* client, IAudioClock* clock) {
// Ищем известный IAudioClient в IAudioClock
for (int i = 0; i < 100; ++i) {
if (*(((void**)clock) + i) == client) {
offsets.clockToClientPtr = i;
break;
}
}
LPWSTR id;
device->GetId(&id);
auto len = lstrlenW(id);
// Ищем известный id в IAudioClient
for (int i = 0; i < 100; ++i) {
LPWSTR ptr = *((LPWSTR*)client + i);
if (IsBadReadPtr(ptr, len * 2 + 2)) { // Если в вашем коде есть IsBadReadPtr, что-то не так
continue;
}
if (memcmp(id, ptr, len * 2) == 0) {
offsets.clientToIdPtr = i;
break;
}
}
CoTaskMemFree(id);
}
И дальше что-то такое:
if (offsets.clientToIdPtr != -1 && offsets.clockToClientPtr != -1) {
if (!IsBadReadPtr(*((void**)This + offsets.clockToClientPtr), offsets.clientToIdPtr * sizeof(void*))) {
void* clientPtr = *((void**)This + offsets.clockToClientPtr);
if (!IsBadReadPtr(*((void**)clientPtr + offsets.clientToIdPtr), 20)) {
LPWSTR idPtr = *((LPWSTR*)clientPtr + offsets.clientToIdPtr);
std::wstring idStr = idPtr;
clockToDeviceMap[This] = idStr;
myDeviceStr = &clockToDeviceMap[This];
}
}
}
Ужас, конечно, но работает.
Итог
В итоге я использовал оба подхода – если успели перехватить, записываем в словарь. Если не успели, используем подход с поиском клиента и id по смещениям.
Код разбросан по этому файлу.
Результаты
После патчинга видео и аудио синхронизировались идеально:
Так была исправлена неприятная проблема, и речь в Bluetooth наушниках теперь воспринимается отлично.
Работоспособность проверена только под последними версиями Win10 и Win11, на последнем же Chrome.
Links
-
Мой код.
-
Injector для Chrome
-
Ручное внедрение DLL (x86 версия, требует небольших доработок для x64)
-
Krabs
Современные беспроводные наушники уже не уступают своим проводным собратьям. Но есть одна досадная проблема, которой по-прежнему подвержены Bluetooth-наушники – задержка звука. К счастью, есть несколько быстрых решений, которые можно попробовать, чтобы избавиться от этой неприятности в Windows 11 и Windows 10.
Убедитесь, что вы находитесь не слишком далеко
Это может показаться очевидным, но чтобы наушники Bluetooth работали идеально, вы должны находиться в непосредственной близости от компьютера или ноутбука. Хотя вы можете не терять связь или испытывать обрывистый звук даже на расстоянии 3-5 метров от компьютера, расстояние все равно может вызвать задержку звука.
Попробуйте расположиться перед системой и посмотреть, решит ли это проблему. Обычно такие вещи, как стены и даже другие люди между вашими наушниками и компьютером, являются достаточными причинами.
Включить и включить повторно Bluetooth
Извечный трюк с выключением и повторным включением наушников иногда тоже может решить проблему задержки звука Bluetooth.
- Нажмите правой кнопкой мыши на кнопку «Пуск» и выберите «Настройки»
- Выберите слева «Bluetooth & устройства» и выключите опцию Bluetooth. Подождите минуту, затем снова включите его и проверьте, сохраняется ли задержка звука.
- В Windows 10 выберите «Устройства» в окне «Настройки», а затем «Bluetooth & другие устройства» на левой панели. Оттуда включите тумблер Bluetooth.
- Чтобы повторно подключить наушники, сначала нажмите на три вертикальные точки рядом с иконкой наушников и нажмите «Удалить устройство». Пользователи Windows 10 могут просто нажать на иконку наушников, а затем «Удалить устройство».
- Теперь переведите наушники в режим сопряжения, а затем нажмите «Добавить устройство» для повторного сопряжения. Проверьте, удалось ли устранить задержку звука путем повторного сопряжения наушников. В Windows 10 вы можете сделать то же самое, нажав «Добавить Bluetooth или другое устройство.»
Устраните помехи от других устройств
Хотя наушники Bluetooth стали более устойчивы к внешним помехам, они все еще могут столкнуться с такими проблемами, как задержка звука, особенно если поблизости есть несколько беспроводных устройств. Wi-Fi роутеры, Bluetooth колонки, радионяни и даже микроволновые печи могут создавать помехи для ваших наушников из-за наложения частот в диапазоне 2,4 ГГц.
Некоторые простые способы устранить помехи как основную причину:
- Выключение устройств, которые не используются
- Переключение беспроводного роутера на другой канал в диапазоне 2,4 ГГц или переключение на диапазон 5 ГГц, если у вас двухдиапазонный роутер
- Отключение других беспроводных устройств от вашего компьютера по одному за раз, чтобы определить виновника.
Отключить улучшения звука
Улучшения звука в Windows часто помогают повысить качество звука в некоторых сценариях, в зависимости от аппаратного обеспечения и аудиосигнала. Однако иногда они могут вызывать такие проблемы, как задержка звука. Вы можете отключить улучшения звука и проверить, поможет ли это устранить проблему.
- Перейдите в «Настройки -> Система -> Звук.»
- В разделе «Выход» вверху нажмите на ваши Bluetooth-наушники, чтобы открыть соответствующие свойства.
- В разделе «Настройки выхода» нажмите «Дополнительно» под «Улучшение звука.»
- В следующем окне выберите вкладку «Улучшения» и установите флажок напротив «Отключить все улучшения». Затем нажмите «Применить -> OK.»
- Чтобы открыть свойства устройства в Windows 10, выберите наушники в выпадающем списке «Выберите устройство вывода» в разделе «Выход». Нажмите «Свойства устройства -> Дополнительные свойства устройства».
- Теперь снова протестируйте наушники. Если проблема сохраняется и общее качество звука снижается, вы можете снова включить улучшение звука.
Убедитесь, что служба Windows Audio настроена правильно
Иногда служба Windows Audio настроена неправильно из-за изменений в некоторых приложениях. Если ни одно из вышеперечисленных решений не помогло, стоит убедиться, что служба настроена правильно.
- Найдите «Службы» в поиске Windows и откройте приложение.
- Справа найдите службу «Windows Audio» в конце списка и дважды щелкните по ней, чтобы открыть ее свойства.
- На вкладке «Общие» убедитесь, что «Тип запуска» установлен на «Автоматический» (а не на «Отложенный запуск»). Нажмите «Применить -> OK.»
Попробуйте воспользоваться встроенным в Windows средством устранения неполадок
Хотя средство устранения неполадок Windows не всегда дает хоть какие-нибудь результаты, его все же стоит попробовать, чтобы подстраховаться. Иногда причиной задержки звука Bluetooth может быть простой неверно настроенный параметр, на который не обращаешь внимание.
- Откройте «Настройки -> Система -> Устранение неполадок.»
- Нажмите «Другие средства устранения неполадок.«Другие», рядом с «Bluetooth», нажмите «Запустить», чтобы запустить средство устранения неполадок Bluetooth.
- В Windows 10 вам нужно выбрать «Обновление & Безопасность» в окне «Настройки», затем «Устранение неполадок» на левой панели и, наконец, «Bluetooth» в разделе «Поиск и устранение других проблем». Затем нажмите «Запустить средство устранения неполадок.»
- На основании результатов, полученных средством устранения неполадок, следуйте инструкциям, чтобы включить средство устранения неполадок для решения выявленных им проблем. После этого проверьте, устранена ли задержка звука.
Обновление драйверов Bluetooth
Драйверы устройств часто являются причиной различных проблем с производительностью. В случае задержки звука необходимо убедиться, что в системе установлены последние версии драйверов для наушников Bluetooth.
- Нажмите правой кнопкой мыши на кнопку «Пуск» и выберите «Диспетчер устройств»
- В разделе «Bluetooth» выберите наушники и нажмите «Обновить драйвер»
- Выберите «Автоматический поиск драйверов». Ваш компьютер выполнит поиск обновленных драйверов и установит их автоматически. Перезагрузите компьютер после установки и проверьте, решена ли проблема.
- Если компьютер не может найти обновленные драйверы, вы можете вручную загрузить последние версии драйверов с сайта производителя ваших наушников, а затем установить их самостоятельно. Не забудьте перезагрузить компьютер, чтобы изменения вступили в силу.
- Вам также следует убедиться, что прошивка ваших наушников не устарела. Чтобы проверить наличие обновления прошивки, воспользуйтесь настройками мобильного приложения ваших наушников.
8. Используйте другой Bluetooth-приемник
Если ни один из приведенных выше советов не помог вам с вашим встроенным оборудованием Bluetooth, иногда проблему можно решить с помощью внешнего Bluetooth-приемника. Вы можете приобрести внешний Bluetooth начиная от 200 рублей на сайте Яндека.Маркет Подключите его, позвольте Windows автоматически установить драйверы, а затем проверьте, сохраняется ли задержка звука.
В некоторых ноутбуках встроенный контроллер Bluetooth недостаточно мощный, чтобы обеспечить достойный звук. Переход на съемный Bluetooth-ключ может решить любые проблемы со звуком в таких случаях.
Часто задаваемые вопросы
Страдает ли Bluetooth 5.0 от задержки звука?
Последний стандарт Bluetooth и все его итерации, такие как Bluetooth 5.1 и Bluetooth 5.2, могут обрабатывать данные гораздо быстрее, чем предыдущие стандарты, но они не застрахованы от задержки звука. Учитывая это, если ваши Bluetooth-наушники поддерживают более новый стандарт, вам следует использовать именно его, а не старые, чтобы воспользоваться преимуществами более высокой пропускной способности и более высокого качества звука.
Как долго служат Bluetooth-наушники?
Срок службы Bluetooth-наушников зависит от множества факторов, таких как качество компонентов, количество циклов зарядки и тип использования. Как правило, наушники от известных брендов могут прослужить от 3 до 10 лет, в зависимости от модели. Более бюджетные варианты от менее надежных брендов иногда могут выйти из строя в течение 2 лет.
Лучше ли проводные наушники, чем беспроводные?
Проводные наушники и наушники работают с аналоговыми сигналами по сравнению с цифровыми сигналами беспроводных наушников, и, следовательно, имеют более высокую пропускную способность. Они могут обрабатывать звук без сжатия и обеспечивают более чистый звук. Однако современная технология Bluetooth добилась огромных успехов в минимизации разрыва между беспроводными и проводными наушниками. Вы с трудом почувствуете разницу в качестве звука в современных беспроводных и проводных наушниках. Проводные наушники по-прежнему предпочитают профессионалы, которым не нужны компромиссы из-за сжатия данных или задержки звука.
Почему наушники Bluetooth такие дорогие?
В целом, Bluetooth-наушники стоят дороже проводных наушников из-за более сложной конструкции компонентов. Bluetooth-наушники должны содержать значительно более дорогие и высококачественные внутренние компоненты в том же форм-факторе, что и проводные наушники. Это, естественно, увеличивает стоимость производства. Беспроводные наушники имеют дополнительное требование – наличие аккумулятора, с которым проводным наушникам не нужно возиться.
Могут ли проблемы с задержкой звука быть сигналом того, что мои наушники нуждаются в замене?
В редких случаях, но иногда такие проблемы, как задержка звука, могут быть вызваны неисправными наушниками Bluetooth. Помимо физических повреждений, такие симптомы, как искажение звука на высоких уровнях громкости и странный шум, могут подсказать вам, что наушники нуждаются в ремонте или замене.
Зарубин Иван
Эксперт по Linux и Windows
Опытный системный администратор с большим стажем работы на крупном российском заводе. Иван является энтузиастом OpenSource и любителем Windows, проявляя высокую компетентность в обоих операционных системах.
Благодаря его технической грамотности и умению решать сложные задачи, Иван стал неотъемлемой частью команды нашего проекта, обеспечивая непрерывную авторскую работу.
Похожие статьи
- AirPods Pro 2 – это улучшенные AirPods Max
- Что такое Zigbee и как он может сделать ваш дом умнее?
- Подключение Bluetooth-наушников и гарнитуры для прослушивания музыки в Ubuntu
- Blueman – bluetooth-менеджер для Linux
Проблемы с беспроводными Bluetooth наушниками случаются не только на этапе подключения, но и после, когда наушники уже подключены к телефону, но звук через них воспроизводится с каким то искажением, треском, или вообще заикается, останавливается и т. д. Или же звук отстает от видео, появляется рассинхронизация. В этой статье мы рассмотрим несколько решений, которые нужно применить в случае возникновения этой проблемы при использовании беспроводных наушников с телефонами на Android, или с iPhone. Что касается самих наушников, то подобные проблемы бывают абсолютно с любыми моделями и форматами Bluetooth наушников. В том числе с TWS (когда два наушника раздельно). Если у вас похожая проблема, но при подключении наушников к компьютеру, то читайте эту статью: плохой звук в Bluetooth наушниках на компьютере или ноутбуке.
По своему опыту могу сказать, что проблемы с искажением или помехами в воспроизведении звука через беспроводные наушники на Android бывают чаще, чем на iPhone. Там все это работает как-то более стабильно. Так что практически все решения будут именно для Android. Причина в огромном количестве разных устройств (в том числе сильно устаревших), в разных версиях Android, в оптимизации ПО и железа и т. д. То, что звук передается по воздуху, и могут быть проблемы с какими-то помехами и т. д., из-за чего падает качество звука и появляются искажения или рассинхронизация, это понятно. И эти моменты тоже нужно исключить, об этом мы еще поговорим.
Если говорить о причинах, то их можно разделить на две группы:
- Программные: ошибки в программном обеспечении наушников или смартфона, разные функции и настройки, проблемы в работе разных программ (в том числе проигрывателей музыки и видео), кодеки и т. д.
- Аппаратные: производительность телефона (слабое железо), аппаратные поломки наушников или телефона (не редко проблемы с антенной, которая усиливает сигнал Bluetooth, с самим Bluetooth модулем), большая разница в версиях Bluetooth между телефоном и наушниками.
Что делать, если заикается или отстает звук на телефоне через наушники?
- Перезагрузите телефон. Наушник так же выключите и включите. Если у вас TWS наушник, то спрячьте их в кейс, достаньте и подключите к телефону после его перезагрузки.
- Попробуйте запустить воспроизведение музыки или видео, которое хранится в памяти телефона, а не через интернет. Возможно проблема не в передаче звука, а в плохой скорости подключения к интернету, и контент просто не успевает прогружаться, поэтому останавливается.
- Отключите на телефоне Wi-Fi. Понимаю, что это не решение, так как без Wi-Fi тоже никак, но для проверки попробуйте это сделать. И наоборот, если Wi-Fi уже отключен – включите его.
- Если на телефоне есть чехол – попробуйте его снять.
- Удалите наушники на телефоне и подключите их заново. После этого проверьте, как воспроизводится звук, не заикается ли, не отстает ли звук от видео.
- Обновите прошивку телефона (Android или iOS) и наушников (если это возможно в случае с вашими наушниками). ПО наушников как правило можно обновить через фирменное приложение.
- Обязательно проверьте наушник с другим телефоном, или компьютером. Так вы сможете понять в чем причина. После чего можете написать мне в комментариях, постараюсь подсказать решение. Если такая проблема с наушниками на всех устройствах, то это скорее всего аппаратная поломка. В этой ситуации можно обновить ПО наушников, сделать сброс настроек, и подключить их заново.
- Проверьте, будут ли помехи в воспроизведении звука в другом месте. В другой комнате, на улице. Это позволит нам исключить вариант с помехами от Wi-Fi роутера, других устройств и т. д.
- Попробуйте установить и использовать другой проигрыватель.
Другие решения (для Android)
Если перечисленные выше решения не помогли избавиться от проблемы с искажением звука через наушник, или хотя бы выяснить в чем причина, то попробуйте применить более сложные решения. Некоторые из них я вычитал на форумах.. Если что-то не получается, или остались какие-то вопросы – пишите в комментариях.
Включаем кодек AAC в настройках Bluetooth на Android
Скорее всего на вашем смартфоне по умолчанию используется кодек SBC (на iPhone по умолчанию используется AAC). В случае с SBC могут быть проблемы со звуком (треск, шум и т. д.). Нужно в настройках вашего смартфона попробовать переключиться на кодек AAC. На Android это скорее всего (мне сложно сказать где находятся эти настройки на разных версиях Android, разных телефонах и т. д. ) можно сделать в разделе “Для разработчиков” – “Аудиокодек для Bluetooth”. Выберите там AAC.
Можете поэкспериментировать с другими вариантами.
Отключите режим энергосбережения
Если причина в нехватке производительности устройства, то отключение режима энергосбережения может решить проблему с передачей звука. Отключить режим энергосбережения (Экономия заряда) можно в настройках телефона. Самый быстрый способ сделать это, через шторку уведомлений. Там есть отдельная кнопка.
Отключите 4G
В интернете есть много отзывов, что отключение 4G (переход в режим только 3G) решил проблему с помехами при воспроизведении звука с телефона через Блютуз наушник. Возможно, отключение 4G снимает нагрузку с беспроводного модуля, или с процессора. Можете попробовать. Отключить 4G можно в настройках, в разделе “Мобильная сеть” – “Мобильная передача данных”. Пункт “Предпочтительный режим сети”. Ставим там “Только 3G”.
После этого перезагрузите смартфон.
Искажение и рассинхронизация звука из-за приложений
Нужно удалить или закрыть (желательно все же удалить) все лишние приложения, чтобы снять нагрузку с железа и увеличить производительность телефона. Так же есть информация, что звук на наушники может передаваться с искажением из-за голосовых помощников. Например, видел отзыв, в котором автор говорил о том, что проблема ушла после удаления Яндекс браузера с голосовым помощником Алиса. Сам не проверял, но это вполне может быть рабочее решение. Еще видел, когда проблему решали “заморозкой” стандартного голосового ассистента (Voice Assistant).
Отключите звуковые эффекты
Не на всех смартфонах есть такие настройки. Показываю на примере смартфона Redmi. В разделе “Расширенные настройки” может быть пункт “Наушники и звуковые эффекты”. Отключите там “Улучшение звука MI”. Чтобы настройки стали активными нужно подключить наушники.
Запрещаем “Доступ к контактам и журналу звонков”
При первом подключении наушников появляется запрос на разрешение на доступ к контактам и журналу звонков. Как правило, все нажимают “Разрешить”. Попробуйте удалить наушник на своем телефоне по этой инструкции, подключить их заново, и при появлении этого запроса выбрать “Запретить” (Отклонить).
Так же в настройках можно попробовать отключить “Аудиоустройство телефона” (наушники не будут работать как гарнитура) и тот же “Обмен контактами”. Оставить только “Мультимедийное аудиоустройство”.
Отключите “Видимость” для других устройств
Снять нагрузку с Bluetooth модуля можно отключив функцию “Видимость”, когда ваш смартфон доступен для поиска и видим на других устройствах. Это можно сделать в настройках Блютуз.
Если у вас там есть пункт “Поиск Bluetooth-устройств” – отключите его так же. После этих действий звук в наушниках должен воспроизводиться без искажений и зависаний.
Отключение аппаратной разгрузки A2DP
В комментариях Сергей (спасибо ему!) поделился решением. У него на Android 12 после обновления начали заикаться TWS наушники. Помогло отключение аппаратной разгрузки A2DP в параметрах разработчика.
Звук в наушниках заикается и прерывается только на улице при ходьбе
Очень много сообщений об этой проблеме. И это все очень странно. Звук дома в наушниках нормальный, но при выходе на улицу, или при ходьбе/беге звук начинает пропадать. вот в чем может быть проблема? В комментариях Дмитрий поделился интересным наблюдением: причина в одежде. Точнее в синтетической одежде. От нее идут помехи. Такая проблема конечно же не со всеми наушниками.
С удовольствием буду дополнять статью новыми решениями. Если вам удалось победить эту проблему используя решение из этой – оставьте отзыв в комментариях. Если у вас есть какое-то другое решение – поделитесь, буду благодарен! Ну и задавайте вопросы, всем обязательно отвечу.
Похожие статьи
Как подключить наушники TWS i7, i8, i9, i10, i11, i12, F9 к телефону, iPhone, ноутбуку или компьютеру?
Bluetooth наушники (колонка) не определяются как «Аудио» и отображаются как «Другие устройства» в Windows 11, 10
Как включить режим сопряжения Bluetooth на наушниках?
Bluetooth колонка не подключается к ноутбуку, телефону, компьютеру
На чтение 7 мин Просмотров 17.6к. Опубликовано 8 октября 2021
Обновлено 21 мая 2023
Очень часто пользователи беспроводных наушников сталкиваются с проблемой, когда при воспроизведении звук отстает от видео или даже проигрывается рывками, как бы заикается. Особенно это характерно для Bluetooth гарнитур с технологией TWS, то есть когда сами наушники не связаны между собой проводом. Данный баг актуален для любых брендов — JBL, Honor и Huawei Earbuds, Xiaomi и Redmi Airdots, Haylou, Vivo, Samsung и даже Airpods от Apple. Поэтому наша инструкция будет полезна максималтному количеству пользователей блютуз наушников.
Подключение по Bluetooth — причина заикания в наушниках
Чаще всего ошибки с запаздыванием звука возникают по причине некачественной беспроводной связи по блютуз между наушниками или между ними и источником связи, то есть телефоном, ноутбуком, ТВ приставкой или другим устройством.
Расстояние
При использовании гарнитуры стоит учесть, что Bluetooth, это соединение «ближнего радиуса» действия. Стандарт Bluetooth 5 подразумевает максимальную удаленность от передатчика до приемника в 10 метров. И то только в прямой видимости пространстве. В условиях квартиры это может означать, что для качественного приема вы не должны выходить из комнаты. Иначе даже в соседнем помещении звук может начать заикаться и прерываться.
Перегородки
Из первой причины плавно вытекает вторая — наличие перегородок между разными модулями блютуз соединения. Это может быть не только толстая стена или дверь. Например, телефон находится в жестком кейсе или плотном кармане, сумке, чемодане. Любой плотный материал приводит к тому, что музыка в наушниках может начать запаздывать за видео.
Помехи
Еще один фактор, мешающий корректной работе беспроводных наушников, это помехи из-за электромагнитных излучений от других бытовых приборов в доме. Близко расположенный телевизор, микроволновка, роутер или система умного дома создает наводки и ухудшает прием.
Улица
Работа пары передатчик-приемник основана на отправке и получения пакета данных посредством беспроводных сигналов. Отражение этих сигналов от стен минимизирует потери, так как они тоже попадает с одного гаджета на другой. В то время, как на улице необходимо более точное попадание пучка сигнала от того же смартфона на наушники. Поэтому в помещении качество звука будет лучше, чем на улице.
Программные ошибки
Еще одна группа причин, по которым звук в наушниках может прерываться, это ошибки в программном обеспечении.
Интернет
Если у вас музыка отстает от видео или заикается при просмотре роликов из интернета, то прежде всего напрашивается низкая скорость соединения с сетью. Особенно, если речь идет о мобильном интернете 4G. В этом случае помочь может поиск месторасположения с более хорошим приемом сигнала. Или также можно понизить качество видео, например, с 720P до 360P.
Кодеки
Хоть современные TWS наушники в большинстве своем всеядны, случаются ситуации, когда они не поддерживают те же самые кодеки, что и смартфон. В результате звуковая дорожка из проигрывателя не может корректно декодироваться на наушниках, и от этого звук постоянно пропадает, так как не успевает за скоростью воспроизведения.
Режим экономии аккумулятора
Еще одна скрытая настройка, которая может влиять на беспроводную связь, это режим экономии батареи смартфона. По умолчанию он включен для большинства приложений, в том числе и использующих Bluetooth. Его необходимо деактивировать — как, узнаете, если дочитаете данную статью до конца. Кстати, эта функция также иногда может приводить к проблеме тихого звука в наушниках на компьютере и невозможностью увеличить громкость через Windows.
Прошивка
Также стоит проверить, не получала ли гарнитура в последнее время свежую версию прошивки. Кроме багов в самом программном обеспечении, которые будут исправлены разработчиками в следующей версии, ПО могло неправильно установиться. Из-за чего звук постоянно прерывается.
Аппаратные поломки
В числе распространенных проблем, связанных непосредственно с «железом», является разряд батареи наушников. Им попросту не хватает питания, в результате чего звук начинает пропадать. Наконец, не стоит исключать и банальную поломку гарнитуры. В них могла попасть влага или грязь, которая нарушает работу беспроводного модуля.
И еще один момент, когда наушники прерываются в работе при подключении. Современные смартфоны могут работать по Bluetooth соединению сразу с несколькими девайсами одновременно. Например, быть подключенными к беспроводным наушникам и автомагнитоле одновременно. И передавать звук в одно и то же время и на аудиосистему автомобиля, и на стерео гарнитуру. В этом случае следует выключить блютуз связь на втором устройстве, чтобы оно не отвлекало на себя ресурсы наушников.
Как исправить ошибку, когда TWS наушники прерываются, заикаются или отстают?
На основе всего вышесказанного вот вам несколько практических советов, которые могут исправить проблему с некорректно работающими беспроводными наушниками:
- Перед работой зарядите свои наушники до 100 %. Что делать, если они не заряжаются от кейса, я рассказывал в другой статье.
- Используйте их так, чтобы и оба беспроводных модуля, и телефон находились в непосредственной близости друг от друга и вдали от других приборов
- Перезагрузите наушники или сбросьте настройки и подключите их к смартфону заново
- Отключите Bluetooth сеть на телефоне (ноутбуке, компьютере и т.д.). При необходимости удалите гарнитуру из системы полностью («забудьте»), после чего включите блютуз и по новой установите сопряжение с TWS
- Во время прослушивания музыки через наушники не подключайте смартфон к другим гаджетам по блютуз
- Проверьте настройки кодеков для Bluetooth в системных параметрах операционной системы смартфона Android
Практическая инструкция
Теперь давайте посмотрим на практике, что можно сделать внутри ОС Андроид, чтобы постараться улучшить ситуацию с работой звука в наушниках.
Кодеки блютуз
Начнем с того, что нам потребуется разблокировать так называемый «Режим разработчики», который открывает доступ к детальным системным настройкам. Для этого нужно зайти в меню «О телефоне» и несколько раз подряд нажать на «Номер сборки» или «Версия оболочки» в зависимости от модели телефона.
После чего в меню «Система» появится новый раздел — «Для разработчиков»
Теперь можно смело в него войти и пролистать страницу до появления блока конфигурации «Bluetooth». Здесь сначала заходим в «Версию AVRCP» и выставляем самую последнюю, которая поддерживается телефоном.
Далее открываем пункт «Аудиокодеки» и выбираем «AAC»
При сохранении заиканий можно его поменять на «SBC», но качество звучания при этом существенно ухудшится.
Следующий шаг — частота дискретизации. Здесь надо выбрать 44.1 кГц
Далее, «Аудио бит на выборку» — ставим «16»
Наконец, режим аудиоканала — выставляем на «Стерео»
Здесь же принудительно можно ограничить число одновременно подключенных к телефону Bluetooth устройств и поставить «1», чтобы наушники точно работали одни и им никто не мешал
Экономия батареи
И еще один раздел, куда следует заглянуть, это параметры энергосбережения. Да, не удивляйтесь, поскольку Bluetooth соединения существенно влияют на время автономной работы смартфона, он также может принудительно ограничиваться в настройках акукумулятора.
Проще всего найти это меню через поиск — вбиваем слово «батареи» и выбираем «Использование — Настройки энергопотребления»
Откроется страница с графиком текущего потребления заряда. Нам надо найти иконку вызова дополнительного меню в виде трех точек. И выбрать «Показать полное использование устройства»
Далее идем в «Экономия заряда аккумулятора» — «Все приложения»
Находим в списке «Bluetooth» и ставим галочку на «Не экономит заряд».
Теперь любые девайсы, которые подключаются к телефону по блютуз будут использовать все возможности данного интерфейса без ограничений. А значит и качества соединения будет максимально возможным для данной модели.
Актуальные предложения:
Задать вопрос
- 10 лет занимается подключением и настройкой беспроводных систем
- Выпускник образовательного центра при МГТУ им. Баумана по специальностям “Сетевые операционные системы Wi-Fi”, “Техническое обслуживание компьютеров”, “IP-видеонаблюдение”
- Автор видеокурса “Все секреты Wi-Fi”