android:soundPool使用

本文详细介绍了在Android开发中,SoundPool相比于MediaPlayer更适合用于游戏音效的播放,因为它具有更低的CPU资源占用和更小的反应延迟。文章讲解了SoundPool的加载资源API,包括从资源、文件、AssetFileDescriptor和路径加载声音的方法,以及如何使用play方法播放声音。同时,文章还提供了使用SoundPool播放音效的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介

android开发过程中还是会遇到一些音频的播放,在android系统集成的音乐播放器有MediaPlayer、SoundPool等。
如果播放背景音乐等长时间运行的音频,MediaPlayer合适。MediaPlayer存在如下缺点:

1.延时时间较长,且资源占用率高。
2.不支持多个音频同时播放。

如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。SoundPool主要用于播放一些较短的声音片段,与MediaPlayer相比,SoundPool的优势在于CPU资源占用量低和反应延迟小。SoundPool提供了如下加载资源的api:

int load(Context context, int resld, int priority):从 resld 所对应的资源加载声音。
int load(FileDescriptor fd, long offset, long length, int priority):加载 fd 所对应的文件的offset开始、长度为length的声音。
int load(AssetFileDescriptor afd, int priority):从afd 所对应的文件中加载声音。
int load(String path, int priority):从path 对应的文件去加载声音。

上面的方法中都有一个priority参数,该参数目前还没有任何作用,Android建议将该参数设为1,保持兼容性。

上面的方法加载声音之后,都会返回该声音的的ID,以后程序就可以通过该声音的ID 来播放指定声音。SoundPool提供的播放指定声音的api:

int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate):
soundID指定播放哪个声音;
leftVolume、rightVolume指定左、右的音量;
priority指定播放声音的优先级,数值越大,优先级越高;
loop指定是否循环,0为不循环,-1为循环;
rate指定播放的比率,数值可从0.5到2, 1为正常比率。

二、soundPool的使用

归纳起来,使用SoundPool播放声音的步骤如下:

1.调用SoundPool的构造器创建SoundPool的对象。
2.调用SoundPool对象的load()方法从指定资源、文件中加载声音。最好使用HashMap< Integer, Integer>来管理所加载的声音。
3.调用SoundPool的play方法播放声音。

为了更好地管理SoundPool所加载的每个声音的ID,程序一般会使用一个HashMap<Integer,Integer>对象来管理声音。下面的程序示范了如何使用SoundPool来播放音效。程序代码如下:

 // 初始化MediaPlayer
    public void initMediaPlayer() {
        poolMap = new HashMap<String, Integer>();
        // 实例化SoundPool,大小为8
        pool = new SoundPool(8, AudioManager.STREAM_MUSIC, 0);

        // 装载音频进音频池,并且把ID记录在Map中
        poolMap.put("start", pool.load(mContext, R.raw.start, 1));
        poolMap.put("pause", pool.load(mContext, R.raw.pause, 1));
        poolMap.put("restart", pool.load(mContext, R.raw.restart, 1));
        poolMap.put("end_1", pool.load(mContext, R.raw.end_1, 1));
        poolMap.put("end_2", pool.load(mContext, R.raw.end_2, 1));
        poolMap.put("end_3", pool.load(mContext, R.raw.end_3, 1));
        poolMap.put("end_4", pool.load(mContext, R.raw.end_4, 1));
        poolMap.put("end_5", pool.load(mContext, R.raw.end_5, 1));

        pool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {

            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId,
                                       int status) {
                // 当前装载完成ID为map的最大值,即为最后一次装载完成
                if (sampleId == poolMap.size() && "end".equals(Constants.TRACK_STATE)) {
                    // 装载完成首先播放
                    pool.play(poolMap.get("start"), 1.0f, 1.0f, 0, 0, 1.0f);
                }
            }
        });
    }

注意:1.SoundPool虽然可以一次性加载多个声音,但由于内存限制,因此应该避免使用SoundPool来播放歌曲或者背景音乐,只有那些短促、密集的声音才考虑使用SoundPool进行播放。播放的音频尽量在1M以内。
2.在当前界面销毁后记得回收pool,否则容易造成内存泄露。

关于soundPool的使用就简单的分享到这里,希望这篇博客对你有些帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值