Звуковой эффект Libgdx не воспроизводится плавно или полностью, проблема только на Android (эффект задержки звука)

Я разработал хорошую игру с libgdx + java для android в качестве целевой платформы. Я почти подошел к концу, осталось только улучшить карты. До сих пор я выполнял отладку своей игры на рабочем столе, потому что вы знаете, что libgdx кроссплатформенный, и я ожидал, что просто щелкну правой кнопкой мыши и экспортирую для Android. И я, конечно, пробовал, что потом? внезапно я ударился о стену. Проблема в том, что мои звуковые эффекты плохо звучат на Android. Они отлично работают на рабочем столе, но не очень хорошо на Android. Разрешите мне проанализировать этот случай с помощью нескольких вопросов и на примерах: если мы рассматриваем звуковой эффект взрыва: сценарий; автомобиль попадает во взрывчатку. Я ловлю контакт с box2d и вызываю метод play для звукового эффекта взрыва. я ожидаю нормального звука взрыва. На рабочем столе я слышу это, нет проблем, но в Android то, что я слышу, - это просто очень-очень короткий шум (действительно короткий, возможно, несколько миллисекунд), затем долгое молчание, через некоторое время снова короткий шум. Что я пробовал:

Я пробовал рекомендации из многих других тем:

  1. Я пробовал это в форматах 44,1 кГц 16-битный файл wav тот же формат файл ogg 22,05 кГц wav файл, все они звучат одинаково.
  2. звуковой эффект не будет слишком коротким или слишком длинным. Ладно, у меня 3 секунды.
  3. Пытался пересохранить или оформить с fl-studio и смелостью.

Пробовал все равно на s5 mini Experia z1 и z3.

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

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

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

если мы хотим увидеть какой-то код: как я загружаю файл:

это вызывается, когда игра только начинается, когда пользователь терпеливо следит за индикатором выполнения на экране загрузки :)

private void loadSoundEffects(){
    assetMan.load("sounds/explosion.wav", Sound.class);
}

затем я получаю звук в глобальную отсортированную карту другим методом после завершения загрузки

   soundEffects.put("explosion",assetMan.get("sounds/explosion.wav", Sound.class));

в моем классе звукового менеджера у меня есть такой метод

public void playSingle(String name,float x ,float y){
    Sound sound=null;
    sound=soundEffects.get(name);
    long id=sound.play();
    sound.setVolume(id, getVolume(x, y));//dont worry here volume returns always 1 for texting
}

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

Для загрузки вещей я тоже пробовал вот так:

sound=Gdx.audio.newSound(Gdx.files.internal("sounds/explosion.wav"));

это большой проект, поэтому у меня, возможно, более 70 классов => Я не могу вставить их все здесь :) но я чувствую себя готовым ответить на любой вопрос, как, что, где, почему, когда вопросы, задавайте, пожалуйста .. если вам нужен еще код или файл или что-то еще, просто дайте мне знать

посмотрим, как это звучит; Я загрузил обычный wav файл взрыва и тот, который я записал с телефона в этом rar:

http://www.filedropper.com/soundeffects

вы услышите несколько звуков, похожих на тик-так, на самом деле это звучит так :)

РЕДАКТИРОВАТЬ: добавление дополнительной информации

он работает на Windows 7, моя ОС - это победа 7

Я использую последнюю версию libGDX. моя IDE - это затмение. Я попробовал это, отключив кабель, чтобы избавиться от отладчика, но результат тот же.

для использования звукового эффекта размер файла должен быть меньше 1 МБ, как сказано в вики, а мой файл составляет 688 КБ

РЕДАКТИРОВАТЬ: связано с производительностью?

Я начал думать, связано ли это с производительностью моего кода. подумайте о какой-то другой причине, которая вызывает задержку, и это влияет на звуки, но вот некоторые значения, игра работает с 55-60 fps, даже иногда все вычисления занимают менее 15 мс, но я слышу тот же звук, то же самое с очень маленькими файлами вроде 60 КБ. Итак, я буду продолжать думать о файлах. если они сломаны? или все еще проблема формата? у вас есть рабочий файл звуковых эффектов? или какие-нибудь предложения по формату? Я где-то читал 96 кГц 16-битный файл ogg, я тоже пробовал.

РЕДАКТИРОВАТЬ: важное замечание

Я играл в свою игру на мобильном телефоне. Я подорвал взрывчатку на машине. это звучало так же, потом я вернулся в меню. Я забыл открыть свой телефон. Игра была запущена. Но экран автоматически блокируется. Так оставалось минут 15-20. Затем, чтобы попробовать еще раз, я разблокировал экран и что случилось? Внезапно взорвалась вся взрывчатка, я собрал звуки очень хорошо и полно, а экран меню все еще отображался. в результате я думаю, что смогу сделать это, когда игра остановится на достаточное время, звуковые эффекты будут готовы и можно будет играть хорошо. что это значит сейчас? звуковые эффекты еще не загрузились из памяти, но я пытаюсь сыграть? или подготовка имеет другое значение? Я проверил, загружен он или нет, с помощью метода isLoaded () менеджера активов, который вернул true. Я сделал это непосредственно перед вызовом метода воспроизведения звука. я должен доверять этому методу isLoaded? или что?

Что ж, ребята заранее спасибо за помощь.

Извините, я держал это немного долго, я буду продолжать пытаться и исследовать ..


person ömer.bozkurt    schedule 30.08.2015    source источник


Ответы (2)


Я почти уверен, что проблема в том, что ваши звуковые эффекты имеют размер 1 МБ или больше. В вики libgdx говорится, что если размер звукового файла превышает 1 МБ, это вызовет проблемы на Android, и вместо класса звука необходимо использовать класс музыки.

person Nahro    schedule 30.08.2015
comment
Спасибо за быстрый ответ, но я уверен, братан, я проверил, правильно ли Windows вычисляет его, самый большой - 787 КБ, а тот, который я поделился в ra, также меньше 1 МБ, это 688 КБ. извините за это, я, должно быть, добавил эту информацию в свой вопрос - person ömer.bozkurt; 31.08.2015

Я нашел актуальную проблему и ее решение.

это не связано ни с производительностью, ни с файлом, ни с андроидом. это проблема на стороне Android в libGDX (не может считаться ошибкой, но отличается от настольной версии). Позвольте мне кратко обозначить ситуацию, а затем ответить:

У меня много экземпляров звуковых эффектов. Загружается независимо и хранится в независимых указателях. Таким образом, в моем коде нет никакой связи между этими экземплярами звуковых эффектов. Но они как-то связаны где-то в libGDX. Потому что случай такой: у меня в игре есть класс оружия. и пистолет имеет звуковой эффект. если нажата кнопка огня, пистолет продолжает зацикливать свой звуковой эффект, вызывая метод sound.resume (), а если кнопка не нажата, он приостанавливается с помощью метода sound.pause (). на рабочем столе этот метод паузы приостанавливает только звуковой эффект пистолета. но в Android он приостанавливает все звуковые эффекты или не уверен, возможно, только последний звуковой эффект, который был запущен. Итак, в каждом кадре, если пистолет не стреляет, я вызываю метод паузы для звукового эффекта пистолета (моя плохая реализация) при вызове воспроизведения для некоторых других звуковых эффектов, и этот вызов паузы в пистолете отменяет все остальные звуковые эффекты. Вот так я слышу очень короткий шумный ..

Одним из решений является вызов метода паузы с идентификатором звука, который будет приостановлен. Другое решение - попытка другой реализации, для которой не нужно вызывать метод паузы.

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

person ömer.bozkurt    schedule 31.08.2015