Android中SoundPool播放音频示例

SoundPool能加载一批声音资源到内存中,并支持同时播放多个音频文件。

创建SoundPool的示例代码如下:

.............
public BeatBox(Context context) {
    mAssetManager = context.getAssets();

    if (Build.VERSION.SDK_INT >= 21) {
        //SDK_INT >= 21时,才能使用SoundPool.Builder创建SoundPool
        SoundPool.Builder builder = new SoundPool.Builder();

        //可同时播放的音频流
        builder.setMaxStreams(MAX_SOUNDS);

        //音频属性的Builder
        AudioAttributes.Builder attrBuild = new AudioAttributes.Builder();

        //音频类型
        attrBuild.setLegacyStreamType(AudioManager.STREAM_MUSIC);

        builder.setAudioAttributes(attrBuild.build());

        mSoundPool = builder.build();
    } else {
        //低版本的构造方法,已经deprecated了
        mSoundPool = new SoundPool(MAX_SOUNDS, AudioManager.STREAM_MUSIC, 0);
    }

    loadSounds();
}
.............

SoundPool播放音频前,需要先加载对应的音频文件,示例代码如下:

public void soundPoolPreload() throws IOException {
    for (Sound sound : mSounds) {
        //sound中含有Assets中的音频文件地址
        //利用AssetManager的接口得到音频文件的afd
        AssetFileDescriptor afd = mAssetManager.openFd(sound.getAssetPath());

        //SoundPool加载音频文件后,将返回一个int类型的id
        //该id与对应音频文件一一对应
        //load接口的后一个参数表示优先级
        int soundId = mSoundPool.load(afd, 1);
        sound.setSoundId(soundId);

        sound.setBeLoaded(true);
    }
}

加载完音频后,就可以进行播放,示例代码如下:

public void play(Sound sound) {
    //得到音频文件对应的id
    Integer soundId = sound.getSoundId();
    if (soundId == null) {
        return;
    }

    //参数为:音频ID、左声道音量、右声道音量、优先级、是否循环及播放速率
    mSoundPool.play(soundId, 1.0f, 1.0f, 1, 0, 1.0f);
}

最后,释放音频的示例代码如下:

public void release() {
    mSoundPool.release();
}

你可能感兴趣的:(Android开发)