即使Libgdx说它被加载到内存中,声音也没有第一次播放

时间:2016-03-05 18:08:45

标签: java android audio libgdx

我使用Libgdx和AssetManager将资源加载到内存中。首先,我认为我的项目出了问题,所以我做了一个新的,但问题仍然存在。

即使我使用" IsLoaded"声音也没有播放方法,并没有第一次播放(如果你真的快速跳进游戏)。声音很小,比如40KB,这只发生在Android上(适用于桌面/ iOS)。我在Android上测试的设备是带有Lolipop的HTC One M7。这是一个干净项目的代码。

package com.mygdx.game;
import com.badlogic.gdx.Application;
import com.badlogic.gdx.Audio;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.ScreenAdapter;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.audio.Sound;


public class MyGdxGame extends ScreenAdapter {

    private AssetManager assetManager;

    @Override
    public void show() {
        super.show();

        assetManager = new AssetManager();

            assetManager.load("sound/jump.mp3", Sound.class);

    }


    Sound jump;
    boolean isLoaded;

    @Override
    public void render(float delta) {

        super.render(delta);


        if(isLoaded) return;

        assetManager.update();

        if(assetManager.isLoaded("sound/jump.mp3", Sound.class)) {
            assetManager.finishLoading();
            jump = assetManager.get("sound/jump.mp3", Sound.class);
            isLoaded = true;
            System.err.println("LOADED");
            jump.play();

        }



        }
    }

在LOGCAT中我得到" soundpool样本1没有准备好"错误。 有什么想法吗?

注意:如果我给它一点时间,声音正常播放(如果我不按"播放"立即播放)。

问题是为什么Libgdx认为声音被加载到内存中,即使它没有。

4 个答案:

答案 0 :(得分:0)

您是否尝试过使用.ogg? 在我的libgdx项目中,我总是使用.ogg,因为它的许可证免费且很好,它从未给我带来过问题!

您还应该注意不同的Sound导入。我记得你有时可以直接从libgdx导入.ogg .mp3类,这会导致问题。

另外,我认为问题在于,即使加载了音频文件,资产管理员仍在加载其他资源..所以它忙着做另一项任务。

我要么:

a)在没有资产管理者的情况下播放该声音,因为它只是用于加载,对吗?

b)(这需要检查)但是也许使用不同的资产管理器来播放音频?不确定拥有2名资产管理人员会浪费多少资源。

但是,我会尝试。首先更改为.ogg,确保音频正好从0:00开始并更新到最后一个libgdx版本。

答案 1 :(得分:0)

我遇到了同样的问题。我使用的是libgdx版本1.9.2。到目前为止,我试过了:

  • 将mp3更改为ogg
  • 使用不同的资产管理器进行声音

并没有帮助。

用Music对象替换了声音对象,它确实提供了帮助。但我不确定这是否是正确的方法,因为我的应用程序中有很多短音。

答案 2 :(得分:0)

我知道这是一个旧线程,但我遇到了同样的问题,我就这样解决了..

private Sound sound;
private float soundVolume;

public void playSound(String path, float volume) {
    sound = assetManager.get(path, Sound.class);
    soundVolume = volume;
}

@Override
public void render () {
    super.render();

    // Because of some weird Android bug
    if (sound != null) {
        sound.play(soundVolume);
        sound = null;
    }
}

这是我的主要游戏类,我可以从任何其他类调用playSound()方法。

答案 3 :(得分:0)

它可能是由Gdx.audio.newSound()方法引起的,它是通过异步加载声音而不是向处理器断言声音加载过程。我通过添加"延迟来解决这个问题。播放声音过程仅适用于第一次播放。这解决了我的问题。

private static void soundBugFixer(Sound sfx, float volume)
{
    Timer x = new Timer();
    x.scheduleTask(new Timer.Task() {
        @Override
        public void run() {
            sfx.play(volume);
        }
    }, 0.1f );
}

public static void remove(float volume) {
    if(sfxRemove == null)
    {
        sfxRemove = Gdx.audio.newSound(Gdx.files.internal("sfx/sfx_remove.wav"));
        soundBugFixer(sfxRemove, volume);
    }
    else
    {
        sfxRemove.play(volume);
    }
}