`
zxl_ong
  • 浏览: 126652 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

使用SoundPool播放游戏音效

阅读更多
在Android开发中我们经常使用MediaPlayer来播放音频文件,但是MediaPlayer存在一些不足,例如:资源占用量较高、延迟时间较长、不支持多个音频同时播放等。这些缺点决定了MediaPlayer在某些场合的使用情况不会很理想,例如在对时间精准度要求相对较高的游戏开发中。

        在游戏开发中我们经常需要播放一些游戏音效(比如:子弹爆炸,物体撞击等),这些音效的共同特点是短促、密集、延迟程度小。在这样的场景下,我们可以使用SoundPool代替MediaPlayer来播放这些音效。

        SoundPool(android.media.SoundPool),顾名思义是声音池的意思,主要用于播放一些较短的声音片段,支持从程序的资源或文件系统加载。与MediaPlayer相比,SoundPool的优势在于CPU资源占用量低和反应延迟小。另外,SoundPool还支持自行设置声音的品质、音量、播放比率等参数,支持通过ID对多个音频流进行管理。下面是SoundPool基本使用方法的例子代码:

 public static final int SOUND_EXPLOSION = 1;  
 public static final int SOUND_YOU_WIN = 2;  
 public static final int SOUND_YOU_LOSE = 3;  
   
 private SoundPool soundPool;  
 private HashMap<Integer, Integer> soundPoolMap;  
   
 private void initSounds() {  
     //这里指定声音池的最大音频流数目为4,音效质量100
     soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);  
     soundPoolMap = new HashMap<Integer, Integer>();  
     soundPoolMap.put(SOUND_EXPLOSION, soundPool.load(getContext(),  
             R.raw.explosion, 1));  
 }  
   
 public void playSound(int sound) {  
     AudioManager mgr = (AudioManager) getContext().getSystemService(  
             Context.AUDIO_SERVICE);  
     float streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);   
	    float streamVolumeMax = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);//设置最大音量       
	    float volume = streamVolumeCurrent/streamVolumeMax;   //设备的音量
	    //播放音频,可以对左右音量分别设置,还可以设置优先级,循环次数以及速率
	    //速率最低0.5最高为2,1代表正常速度
	    //soundPool.play(soundID, leftVolume, rightVolume, priority, loop, rate)
	    soundPool.play(soundPoolMap.get(sound), volume, volume, 1, 0, 1f);//播放
 }  
   
 public void update() {  
     if (isExploding()) {  
         playSound(SOUND_EXPLOSION);  
     }  
 } 


遗憾的是SoundPool目前存在的问题还比较多,我们需要谨慎使用,尽量避免程序在调用SoundPool过程中出现异常关闭的情况。相信 Google在Android的后续版本中会将这些问题修复(或者推出一个功能类似、健壮度更高的API),但是如果你现在就需要使用SoundPool 开发你的程序,也许你需要知道这些问题:
    1. SoundPool最大只能申请1M的内存空间,这就意味着我们只能使用一些很短的声音片段,而不是用它来播放歌曲或者游戏背景音乐(背景音乐可以考虑使用JetPlayer来播放)。
    2. SoundPool提供了pause和stop方法,但这些方法建议最好不要轻易使用,因为有些时候它们可能会使你的程序莫名其妙的终止。还有些朋友反映它们不会立即中止播放声音,而是把缓冲区里的数据播放完才会停下来,也许会多播放一秒钟。
    3. 音频格式建议使用OGG格式。在我的小游戏Agile Buddy中,我一开始使用WAV格式的音频文件存放游戏音效。经过反复测试,在音效播放间隔较短的情况下会出现异常关闭的情况(有说法是 SoundPool目前只对16bit的WAV文件有较好的支持)。后来将文件转成OGG格式,问题得到了解决。      

                                                                             
分享到:
评论

相关推荐

    Android使用SoundPool实现播放音效

    如果在程序应用中(比如:游戏的音效等)需要播放密集、短促的音效,这时就使用SoundPool来播放音效,SoundPool使用音效池的概念来管理多个短促的音效,例如它可以开始就10个音效,以后在程序中按音效的ID进行播放。...

    android使用SoundPool播放音效的方法

    在游戏开发中我们经常需要播放一些游戏音效(比如:子弹爆炸,物体撞击等),这些音效的共同特点是短促、密集、延迟程度小。在这样的场景下,我们可以使用SoundPool代替MediaPlayer来播放这些音效。 SoundPool...

    Android游戏设计之-------游戏音效的播放 SoundPool

    Android游戏设计之-------游戏音效的播放 SoundPool

    Android编程实现使用SoundPool播放音乐的方法

    此时我们可以用SoundPool来播放音效,SoundPool使用音效池的概念来管理多个短促的音效,例如它可以开始就加载20个音效,以后在程序中按音效的ID进行播放 SoundPool主要用于播放一些较短的声音片段,优势在于CPU资源...

    Android使用SoundPool播放音效实例

    SoundPool一般用来 播放密集,急促而又短暂的音效,比如特技音效:Duang~,游戏用得较多,你也可以为你的 APP添加上这个音效,比如酷狗音乐进去的时候播放”哈喽,酷狗” 是不是提起了对于SoundPool的兴趣了呢 ...

    Android游戏音效播放的工具类

    闲余时间写的一个实现音频播放的工具类,可以帮助用户以尽量精简的代码来实现音效播放的功能,如Android中开发应用的按钮等的点击音效,android游戏中的音效等

    Android音乐、音效架包(可以简化游戏或者音乐播放器的开发)

    Android音乐、音效架包(可以简化游戏或者音乐播放器的开发) 有两个大类:SoundPool MediaPlayer,只需调用架包中的方法就可以完成音乐音效的播放

    Android中SoundPool的使用步骤实例

    大家知道MediaPlayer占用的资源比较多,且不可以同时支持播放多个音频,所以我们有一种叫做SoundPool,比如我们常见的按键音或者是手机提示音,还比如我们在游戏的开发中会有大量的音效效果等,下边介绍一下她的用法...

    连连看 Android 版 开发源码.rar

     连连看是过关游戏,带有音效,源代码中定义了各个游戏类,包括声音文件、定时器,碰撞测试等,有些地方写的很科学,比如音效控制部分,初始化soundPool 对象,第一个参数是允许有多少个声音流同时播放,第2个参数是...

    soundEffect

    一个基本的SoundPool应用,点击按钮会有爆炸音效,在游戏中很常用,希望有你想要的

    Android如何给按钮添加点击音效

    有很多制作精良的APP都自带点击音效,那么如何简单的来实现这一效果,这里需要使用到的一个概念叫做SoundPool,这个类主要用于播放一些比较小的音频文件,因为比较方便,通常用在游戏里比较多。 代码 闲话不多说,...

    android游戏开发从入门到应用实例

    4-15-2(SoundPool音效) 4-16-1(游戏保存之SharedPreference) 4-16-2(游戏保存之Stream) 4-3(View游戏框架) 4-4(SurfaceView游戏框架) 4-7-1(贝塞尔曲线) 4-7-2(Canvas画布) 4-8(Paint画笔) 4-9(Bitmap位图渲染与操作...

    疯狂Android讲义源码

     11.1.2 使用SoundPool播放音效 432  11.1.3 使用VideoView播放视频 435  11.1.4 使用MediaPlayer和  SurfaceView播放视频 436  11.2 使用MediaRecorder录制  音频 439  11.3 控制摄像头拍照 442  11.3.1 ...

    疯狂Android讲义.part2

    11.1.2 使用SoundPool播放音效 432 11.1.3 使用VideoView播放视频 435 11.1.4 使用MediaPlayer和 SurfaceView播放视频 436 11.2 使用MediaRecorder录制 音频 439 11.3 控制摄像头拍照 442 11.3.1 通过Camera进行拍照...

    疯狂Android讲义.part1

    11.1.2 使用SoundPool播放音效 432 11.1.3 使用VideoView播放视频 435 11.1.4 使用MediaPlayer和 SurfaceView播放视频 436 11.2 使用MediaRecorder录制 音频 439 11.3 控制摄像头拍照 442 11.3.1 通过Camera进行拍照...

    Java小游戏开放源码

    定义了三个音效,子弹打中的时候、子弹爆炸的时候和飞机与boss战斗的时候,利用的soundpool的方法实现了。 当小飞机没有生命会显示你输掉了,boss没有血量你显示你赢了 2.如何绘制背景 定义一个 y1,y2,来确定...

    ShootingGame_Updated:Android射击游戏

    ShootingGame_Updated 一个简单的Android Shooting游戏,使用SurfaceView,2D图形,CustomViews,AsyncTask等概念开发而成,用户可以使用佳能的小子弹击中目标,还具有使用SoundPool的背景音乐,特殊音效等功能。

    60个Android开发精典案例 Android软件源码.zip

    4-15-2(SoundPool音效) 4-16-1(游戏保存之SharedPreference) 4-16-2(游戏保存之Stream) 4-3(View游戏框架) 4-4(SurfaceView游戏框架) 4-7-1(贝塞尔曲线) 4-7-2(Canvas画布) 4-8(Paint画笔) 4-9(Bitmap位图渲染与操作...

    DefenseCommander

    这个android应用程序使用动态视图,对象动画师,ValueAnimator,插值器,SoundPool,MotionEvents,滚动背景,TouchEvents,远程数据库,线程 该应用程序是一款游戏,是80年代视频游戏的现代作品,用户可以保护自己...

Global site tag (gtag.js) - Google Analytics