我有一款Android游戏,需要播放短音。 SoundPool崩溃dual core phones,Mediaplayer有高达200ms +的延迟,OpenSL需要SDK 9+(我支持1.5)。所以这就离开了AudioTrack。在静态模式下使用AudioTrack的正确方法是什么?
这是我试过的。我创建这样的AudioTrack对象。
protected AudioTrack createAudioTrack() {
final int trackSize = 17408;
return new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT, trackSize, AudioTrack.MODE_STATIC);
}
然后,我为每个游戏声音(约8)创建一个runnable。
private static class SoundRunnable implements Runnable {
private final AudioTrack sound;
private final byte[] rawAudio;
public SoundRunnable(final AudioTrack sound, final byte[] rawAudio){
this.sound = sound;
this.rawAudio = rawAudio;
sound.write(rawAudio, 0, rawAudio.length);
}
@Override
public void run() {
playSound();
}
private synchronized void playSound() {
switch (sound.getPlayState()) {
case AudioTrack.PLAYSTATE_PAUSED:
sound.stop();
sound.reloadStaticData();
sound.play();
break;
case AudioTrack.PLAYSTATE_PLAYING:
sound.stop();
sound.reloadStaticData();
sound.play();
break;
case AudioTrack.PLAYSTATE_STOPPED:
sound.reloadStaticData();
sound.play();
break;
default:
break;
}
}
public synchronized void release() {
sound.release();
}
}
然后,当我需要播放声音时,我将它发送到一个ThreadPool。
private void playSound(final int soundToPlay) {
final SoundRunnable soundRunnable = mediaPlayers.get(soundToPlay);
if(soundRunnable != null){
threadPool.execute(soundRunnable);
}
}
我遇到的主要问题是声音在第一次执行runnable时会播放两次。之后,每隔一段时间,我仍然可能会得到双音,但效果很好。
我还尝试在流模式下创建单个AudioTrack并从runnables写入原始音频。这有点成功,但很难知道何时停止播放。如果你停下来,声音就会缩短,太迟了,你会得到一个getsBuffer错误,并且应用程序被锁定。同时播放两个声音也很困难(可能会使用一组音频轨道)。
我很想看到不涉及流式音频的AudioTrack示例代码。