В своем приложении для Android я использую Android NDK для воспроизведения музыки, выполнив следующие действия:
Чтобы избежать недоразвития, я делаю первые 2 шага в отдельном потоке, чтобы извлечь и обработать звук немного заранее (это добавляет немного задержки, но это не проблема для моего приложения). Это решение прекрасно работает на каждом устройстве, которое я тестировал до сих пор.
Но по какой-то причине, когда я соединяю свое устройство с динамиком Bluetooth и когда я играю музыку, на некоторых устройствах, таких как Samsung S7 или Nokia 1 (кажется, что не на всех устройствах), возникают неполадки.
Эта ошибка выглядит настолько случайной для меня, что я не знаю, с чего начать. Он работает так, как будто соединение Bluetooth использует довольно много ресурсов процессора, поэтому у моего приложения недостаточно ресурсов для правильной работы.
Кто-нибудь испытывал нечто подобное? Должен ли я что-то сделать в своем коде для обработки соединения Bluetooth, чтобы он не использовал процессор (например, чтобы избежать повторной дискретизации звука)?
Спасибо за вашу помощь.
Android + Bluetooth аудио — это мир боли. Главное, что следует отметить в Bluetooth, — это то, что приемник звука работает с частотой, не зависящей от других аудиоустройств, поэтому родной медиаплеер будет выполнять такие вещи, как отображение видео, в соответствии с любой частотой, с которой подключенное аудиоустройство потребляет сэмплы, по существу подчиняясь себе. часы аудиоустройства BT. Если вы хотите управлять скоростью с Android (то есть с помощью временной шкалы SystemClock), вам нужно использовать AudioTrack, растягивающий по времени. (Это может быть сделано, но поддержка драйверов неустойчива и общая стабильность системы танков).
Во-первых, вы хотите устранить проблемы самих устройств. Можете ли вы без проблем воспроизводить ogg-файлы в медиаплеере на динамике Bluetooth с S7 или Nokia 1? Если так, то это твой код!
Мне кажется, что динамик по какой-то причине потребляет сэмплы быстрее, чем устройство. В основном проверяйте обратные вызовы, чтобы убедиться, что всякий раз, когда аудиоподсистема запрашивает больше данных, вы фактически предоставляете их. Обязательно ведите свой конвейер декодирования в соответствии с выполняемыми обратными вызовами и не системные часы или любые другие предположения о времени.
Наконец, аудио Bluetooth, по крайней мере A2DP, в отличие от прямой потоковой передачи MP3, потребует некоторой обработки для повторного сжатия аудио во время его отправки, но эти устройства должны иметь достаточно места для этого, может быть, даже специальные DSP. Я сделал это с воспроизведением видео 1080P одновременно, и он начинает разваливаться сразу с двумя видео!
Других решений пока нет …