我有一个音板应用程序,我使用SoundPool来控制我的声音播放。在我尝试添加大约30秒长的声音之前,一切都很顺利。当我单击该声音的按钮时,它只播放几秒钟然后停止。有没有办法使用SoundPool防止这种情况发生?这是我的代码。谢谢!
public class SoundManager {
private SoundPool mSoundPool;
private HashMap<Integer, Integer> mSoundPoolMap;
private AudioManager mAudioManager;
private Context mContext;
public SoundManager()
{
}
public void initSounds(Context theContext) {
mContext = theContext;
mSoundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
mSoundPoolMap = new HashMap<Integer, Integer>();
mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
}
public void addSound(int Index,int SoundID)
{
mSoundPoolMap.put(Index, mSoundPool.load(mContext, SoundID, 1));
}
public void playSound(int index)
{
float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
streamVolume = streamVolume / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f);
}
public void playLoopedSound(int index)
{
float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
streamVolume = streamVolume / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, -1, 1f);
}
}
答案 0 :(得分:1)
我在开发音乐应用时会收到一些Soundpool信息。以下是原始文档中未涉及声音长度限制的一些指导原则:
Length of Sound Khz
-------------------- ---------------
1-5 Secs. 44khz - Stereo
6-11 Secs. 22khz - Stereo
12-21 Secs. 11khz - Mono
21+ Secs. 8khz - Mono
因此,如果您有任何音频文件被SoundPool切断,请使用此转换。当然,当转换为11khz或更低时,音频开始听起来有点低质量,但总比没有好。我用来转换的程序是:免费的MP3 WMA OGG转换器。在处理Soundpool时我总是使用ogg文件。希望这有帮助的人。
答案 1 :(得分:0)
它仅用于播放短音,请阅读SDK页面。
答案 2 :(得分:0)
SoundPool的内存限制为1(一)Mb。 如果您的声音质量非常高,您可能会遇到这种情况。 如果你有很多声音并达到这个限制,只需创建更多的音池,并在它们之间分配声音。
答案 3 :(得分:0)
SoundPool是一个轻量级播放器,只能解码前1Mb数据,但如果你想使用更高质量或更长的音频文件,你需要:
* Use MediaPlayer interface instead of SoundPool. MediaPlayer is more complicated mechanism so the playback startup time longer than SoundPool.
* Use MediaCodec API to decode data firstly then call AudioTrack API to playback PCM data as requested.This solution will decode the data firstly then do PCM playback directly, so the delay will be the same as SoundPool but it's more complicated for programming.