Испытание Android заикания во время блокировки экрана/пробуждения

57
4

Я работаю над Android-приложением, основанным на воспроизведении звука, и я испытываю некоторое неустойчивое поведение (заикание звука и икота), которые, как я подозреваю, могут быть присущи определенным устройствам, версиям ОС или, возможно, собственному размеру буфера устройства.

О моей реализации - мне нужна низкая латентность, поэтому я обрабатываю свой звук в обратных вызовах OpenSL ES и использую довольно небольшой размер буфера из 128 образцов для размещения буферов. Я делаю mp3-декодирование во время обратного вызова, но с размером буфера звонка мне не нужно декодировать в течение каждого цикла обратного вызова.

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

    Samsung Galaxy S4 w/Android 4.4 - нет проблем с воспроизведением звука Samsung Galaxy S4 w/Android 4.3 - пользователь испытывает выпадения звука/заикание при блокировке/снятии блокировки устройства Samsung Galaxy Note 2 w/Android 4.1.2 - никаких проблем Samsung Galaxy Note 2 w/Android 4.3 - выпадение аудио во время воспроизведения и заикания при блокировке/разблокировке экрана.

Лично у меня есть Galaxy S3 w/4.1.2 и Nexus 5 с 4.4 и никогда не сталкивались с этими проблемами. У меня также есть несколько старых 2.3.7 устройств, где эти проблемы не возникают (2010 Droid Incredible, LG Optimus Elite).

Я довольно уверен, что я не перерабатываю процессор, так как я могу добиться этого на старых устройствах Gingerbread.

Мои вопросы:

Если я подниму базовый SDK на 4.2, я могу определить собственный размер буфера из аппаратного обеспечения и использовать несколько кратных этому во время обратных вызовов очереди буферов. Будет ли это иметь большое значение в случаях, когда заикание и выбывание являются проблематичными, особенно во время блокировки экрана? Есть ли известная ошибка с Android 4.3, где звучит воспроизведение звука, особенно во время действий блокировки экрана? Возможно, это вопрос Samsung? Существуют ли другие способы повышения производительности, чтобы избежать этой проблемы? Мне абсолютно нужно OpenSL ES для моего приложения.

Благодарю.

спросил(а) 2020-04-04T00:02:49+03:00 5 месяцев, 4 недели назад
1
Решение
91

Увеличение размера буфера решает некоторые проблемы, связанные с искажениями и шумом. Да, вы можете определить собственный размер буфера из оборудования, если ваш SDK выше 4.2 с помощью этого:

String size = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);

Но еще один подход к получению минимального размера буфера для аудиозаписей:

int minForAudioRecord = AudioRecord.getMinBufferSize(8000,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT);

И для воспроизведения аудио:

int minForAudioTrack = AudioTrack.getMinBufferSize(8000,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT);

Если ваша версия SDK больше или равна 4.2, вы можете выбрать частоту выборки для своего аудио.

String rate = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);

Я обнаружил, что устройства samsung хуже всего относятся к этим вещам, потому что у каждого устройства есть другой подход к работе с аудио драйверами.

ответил(а) 2020-04-04T00:18:48.471477+03:00 5 месяцев, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема