我正在使用SoundPool为我的Android应用播放声音。所有声音都在应用程序开头加载,以防止在应用程序本身期间出现任何滞后现象。只要它们没有设置为循环,所有声音都可以正常播放。当我将循环设置为true(设置为-1)时,声音不会播放。
根据用户的输入,有6种不同的声音停止和启动。它播放的第一个声音很好但后来声音无法播放。
我尝试了各种方法,例如暂停而不是停止,将音量设置为0并循环为0而不是暂停,将循环设置为任意大数字而不是真正的重复,使声音更短,这些都没有奏效。
我的代码如下:
public int loadSound(int soundFile)
{
int soundID;
try
{
if (m_loadedSounds.containsKey(soundFile))
{
soundID = m_loadedSounds.get(soundFile);
}
else
{
soundID = m_soundPool.load(m_context, soundFile, 1);
m_loadedSounds.put(soundFile, soundID);
}
}
catch (Exception e)
{
soundID = -1;
}
return soundID;
}
public void playSound(int soundFile, boolean loop)
{
// Grab it from the map
int soundID = loadSound(soundFile);
int loops = loop ? -1 : 0;
float streamVolume = m_audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
streamVolume /= m_audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
// If succeeded then play the sound
if (soundID != -1)
{
if (m_soundStreams.containsKey(soundID))
{
int streamID = m_soundStreams.get(soundID);
m_soundPool.setLoop(streamID, loops);
m_soundPool.resume(streamID);
}
else
{
int streamID = m_soundPool.play(soundID, streamVolume, streamVolume, 1, loops, 1.0f);
Log.d("SOUNDS", "Sound played! ID: " + soundID + " At volume: " + streamVolume + " Looping: " + (loop ? "Yes": "No") + " Success: " + (streamID != 0 ? "Yes" : "No"));
if (streamID != 0)
{
m_soundStreams.put(soundID, streamID);
}
}
}
}
public void stopSound(int soundFile)
{
int soundID = loadSound(soundFile);
Integer streamID = m_soundStreams.get(soundID);
if (streamID != null)
{
m_soundPool.pause(streamID);
}
}
在运行时LogCat中给出的错误是:
01-03 16:03:20.142: ERROR/AudioFlinger(2359): not enough memory for AudioTrack size=670096
01-03 16:03:20.142: DEBUG/MemoryDealer(2359): AudioTrack (0x389a0, size=1048576)
01-03 16:03:20.142: DEBUG/MemoryDealer(2359): 0: 0005b090 | 0x00000000 | 0x00010080 | F
01-03 16:03:20.142: DEBUG/MemoryDealer(2359): 1: 0006db58 | 0x00010080 | 0x0007B8A0 | A
01-03 16:03:20.142: DEBUG/MemoryDealer(2359): 2: 0005af70 | 0x0008B920 | 0x0005C280 | A
01-03 16:03:20.142: DEBUG/MemoryDealer(2359): 3: 000752c0 | 0x000E7BA0 | 0x00018460 | F
01-03 16:03:20.142: DEBUG/MemoryDealer(2359): size allocated: 883488 (862 KB)
01-03 16:03:20.142: ERROR/AudioTrack(11584): AudioFlinger could not create track, status: -12
01-03 16:03:20.142: ERROR/SoundPool(11584): Error creating AudioTrack
有没有人知道这个恼人问题的解决方案,或者我没有尝试过的任何解决方法?
答案 0 :(得分:1)
我能想出的最佳解决方案是为这些声音添加一个特殊情况,并使用MediaPlayer播放这些声音。然后我必须停下来&当它们不使用时释放它们,然后当我想再次播放它们时重新加载它们。当声音发生变化时,有一个明显但轻微的加载时间,但这是我能做的最好的。任何其他答案仍然非常感谢。
答案 1 :(得分:0)
确保在onPause()中释放SoundPool资源以防止内存泄漏。您应该在onResume()中加载声音。
答案 2 :(得分:0)
我遇到了同样的问题。当您开始播放想要循环的声音时,将声音的优先级设置为99并降低其余部分。更高的价值是更高的优先级。但是在播放声音时我有一个很大的延迟问题。如果您有任何解决方案,请通知我。(我也使用soundpool和int数组作为ID池。)
Which I mean:
int streamID = m_soundPool.play(soundID, streamVolume, streamVolume, 99, loops, 1.0f);
答案 3 :(得分:0)
SoundPool soundPool;
int soundID;
boolean plays = false, loaded = false;
float actVolume, maxVolume, volume;
AudioManager audioManager;
audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
actVolume = (float) audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
maxVolume = (float) audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
volume = actVolume / maxVolume;
this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
}
});
soundID = soundPool.load(this, R.raw.audiofile, 1);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
soundPool.play(soundID, volume, volume, 1, -1, 1f);
}
},1000);
尝试此解决方案。它应该起作用。