使用SoundPool时的Android音频延迟问题

3
public class AndroidSound implements Sound {
int soundId;
SoundPool soundPool;

public AndroidSound(SoundPool soundPool, int soundId) {
    this.soundId = soundId;
    this.soundPool = soundPool;
}

@Override
public void play(float volume) {
    soundPool.play(soundId, volume, volume, 0, 0, 1);
}

@Override
public void dispose() {
    soundPool.unload(soundId);
}}





public class Assets{

public Music theme;
public static Sound sound;

public static void load(Game game) {
        theme = game.getAudio().createMusic("theme.mp3");
        theme.setLooping(true);
        theme.setVolume(0.85f);
        theme.play();

        sound = game.getAudio().createSound("death.wav");
    }
}

然后我通过在不同的类中调用play()来播放这个声音,但是它会有非常大的延迟,大约500毫秒左右。为什么会这样呢?我尝试寻找解决方案,但是有很多人都遇到了这个问题,而且我没有找到任何真正有效的答案。大部分的讨论帖子都比较旧了,也许已经有一个简单的解决方案了,期待您的帮助。

public class AndroidAudio implements Audio {
    AssetManager assets;
    SoundPool soundPool;

    public AndroidAudio(Activity activity) {
        activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
        this.assets = activity.getAssets();
        this.soundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);
    }

    @Override
    public Sound createSound(String filename) {
        try {
            AssetFileDescriptor assetDescriptor = assets.openFd(filename);
            int soundId = soundPool.load(assetDescriptor, 0);
            return new AndroidSound(soundPool, soundId);
        } catch (IOException e) {
            throw new RuntimeException("Couldn't load sound '" + filename + "'");
        }
    }
}


你是如何创建AndroidSound对象实例的? - pskink
1
为什么它会有延迟?我已经对此感到非常沮丧了,找不到任何好的解决方案。我应该使用除了SoundPool之外的其他东西吗?还是有可能是我的设备出了问题?(我没有其他选项可以检查) - Shadov
所以你在 onLoadComplete(SoundPool soundPool, int sampleId, int status) 方法中调用了 play,然后在你调用 play 后注意到了半秒的延迟? - pskink
1
我在完全不同的类中调用play方法,在启动应用程序时,我的加载屏幕会调用这个load(Game game)方法,因此声音在我调用play方法之前就被赋值了(例如Assets.sound.play(0.85f))。没有onLoadComplete方法,只在我检测到角色死亡时的方法中使用(因此使用"death.wav")。 - Shadov
我开始注意到我的游戏应用中所有声音都有500毫升的延迟。在尝试了一下午不同的方法后,我意外地发现是我的新Galaxy Buds Pro耳机导致了应用中一切事物的半秒延迟。对于一个价值160美元的设备来说,这真是令人恼火。我在一个嘈杂的星巴克咖啡店里开发我的游戏。在可穿戴设备设置中切换到“游戏模式”并没有帮助。 - Androidcoder
1个回答

2

我不知道现在是否有帮助,但还是回答一下。

使用SoundPool

1)在应用程序初始化的开始加载所需的音频,例如在级别中需要5个声音,则在开始时加载它们并保持soundID方便。

2)现在,在任何事件上只需调用具有soundID的play。

3)这将播放非常快,当我从SoundPool play调试到HAL层时,大约为10-15毫秒。

有关SoundPool实现的更多信息,请参阅我的github线程: https://github.com/sauravpradhan/Basic-Audio-Routing


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接