`

详解MediaPlayer与SoundPool的利弊以及各个在游戏中的用途

阅读更多

Himi  原创, 欢迎转载,转载请在明显处注明! 谢谢。

原文地址:http://blog.csdn.net/xiaominghimi/archive/2010/12/28/6101737.aspx

游戏开发中,通过资料和书籍了解到在有两种播放音频形式可以用在我们的游戏开发中,第一个:MediaPlayer 类 ;第二个:SoundPool 类!

PS:当然还有一个JetPlayer 但是 播放的文件格式比较麻烦,所以这里抛开不解释,有兴趣的可以去自己研究下、呵呵;

运行效果图:


                         

 MediaPlayer 和:SoundPool 类!那么他们之间的利弊各是什么呢?或者说,我们游戏开发到底用哪一个更佳呢?

答案就是:两者都必须要!!!分析利弊与各自的用途后,等各位童鞋熟习每个播放形式实现之后我会详细道来!

 下面仍然是先上代码:(先看代码 然后我讲解两个播放形式的利弊关系和各个用途以及其中解释代码中的几个备注!)


  一、 MediaPlayer 播放音频的实现步骤:

1. 调用MediaPlayer.create(context, R.raw.himi); 利用 MediaPlayer类调用create方法并且传入通过id索引的资源音频文件,得到实例;

2. 得到的实例就可以调用 MediaPlayer.star();

简单吧、其实MediaPlayer还有几个构造方法,大家有兴趣可以去尝试和实现,这里主要是简单的向大家介绍基本的,毕竟简单实用最好!

  二、 SoundPlayer 播放音频的实现步骤:

1.   new出一个实例 ;   new SoundPool(4, AudioManager.STREAM_MUSIC, 100);第一个参数是允许有多少个声音流同时播放,第2个参数是声音类型,第三个参数是声音的品质;

2.loadId = soundPool.load(context, R.raw.himi_ogg, 1);

3. 使用实例调用play方法传入对应的音频文件id即可! 

下面讲下两个播放形式的利弊:

         使用MediaPlayer来播放音频文件存在一些不足:

例如:资源占用量较高、延迟时间较长、不支持多个音频同时播放等。

这些缺点决定了MediaPlayer在某些场合的使用情况不会很理想,例如在对时间精准度要求相对较高的游戏开发中。

最开始我使用的也是普通的MediaPlayer的方式,但这个方法不适合用于游戏开发,因为游戏里面同时播放多个音效是常有的事,用过MediaPlayer的朋友都该知道,它是不支持实时播放多个声音的,会出现或多或少的延迟,而且这个延迟是无法让人忍受的,尤其是在快速连续播放声音(比如连续猛点按钮)时,会非常明显,长的时候会出现3~5秒的延迟,【使用MediaPlayer.seekTo() 这个方法来解决此问题】;

        相对于使用SoundPool存在的一些问题:

1. SoundPool最大只能申请1M的内存空间,这就意味着我们只能使用一些很短的声音片段,而不是用它来播放歌曲或者游戏背景音乐(背景音乐可以考虑使用JetPlayer来播放)。 

2. SoundPool提供了pause和stop方法,但这些方法建议最好不要轻易使用,因为有些时候它们可能会使你的程序莫名其妙的终止。还有些朋友反映它们不会立即中止播放声音,而是把缓冲区里的数据播放完才会停下来,也许会多播放一秒钟。 
3. 音频格式建议使用OGG格式。使用WAV格式的音频文件存放游戏音效,经过反复测试,在音效播放间隔较短的情况下会出现异常关闭的情况(有说法是SoundPool目前只对16bit的WAV文件有较好的支持)。后来将文件转成OGG格式,问题得到了解决。

4.在使用SoundPool播放音频的时候,如果在初始化中就调用播放函数进行播放音乐那么根本没有声音,不是因为没有执行,而是SoundPool需要一准备时间!囧。当然这个准备时间也很短,不会影响使用,只是程序一运行就播放会没有声音罢了,所以我把SoundPool播放写在了按键中处理了、备注4的地方

大概看完了利弊解释,那么来看我的代码备注的地方:

备注1:

 这里我定义了一个 HashMap ,这个是哈希表,如果大家不是很了解这个类,那建议百度 google学习下,它与Hashtable很常用的,它俩的主要区别是: HashMap   不同步、空键值、效率高;  Hashtable   同步、非空键值、效率略低 ;而 在J2ME中不支持HashMap ,因为me中不支持空键值,所以在me中只能使用hashtable、咳咳、言归正传,我这里使用hashmap主要是为了存入多个音频的ID,播放的时候可以同时播放多个音频。

上面也介绍了,SoundPool可以支持多个音频同时播放,而且SoundPool在播放的时候调用的这个方法(备注3 )soundPool.play(loadId, currentVol, currentVol, 1, 0, 1f); 第一个参数指的就是之前的loadId !是通过 soundPool.load(context, R.raw.himi_ogg, 1);方法取出来的,

那么除此之外还要注意一点的就是定义hashmap的时候一定要定义成这种形式HashMap<Integer, Integer> hm = new Hash<Integer, Integer>,声明此哈希表就是一个key和volue值都是Integer的哈希表! 为什么要这么做,因为如果你只是简单的定义成 HashMap hm =new HashMap(),那么当你在播放的时候,也就是备注4 方法这里的第一个id参数使用Hashmap.get()这个方法的时候总会出现错误的提示!

《SoundPool最大只能申请1M的内存空间,这就意味着我们只能使用一些很短的声音片段》为什么只能使用一些很短的声音呢?

大家还是看备注4 方法的第一个参数,这里要求传入的Id类型是个int值,那么这个int其实对应的是通过load()方法返回的音频id,而且这个id会因音频文件的大小而变大变小,那么一旦我们的音频文件超过int最大值,那么就会报内存错误的异常。所以为什么用SoundPool只能播放一些简短的音频这就是其原因了。当然os 里为什么这么定义 我也无从查证和说明。

备注4 :此方法中参数的解释

第一个参数是我通过SoundPool.load()方法返回的音频对应id,第二个第三个参数表示左右声道大小,第四个参数是优先级,第五个参数是循环次数,最后一个是播放速率 1.0 = 正常播放 ,范围是 0.5至 2.0)

备注2:

 这里是通过媒体服务得到一个音频管理器,从而来对音量大小进行调整。这里要强调一下,调整音频是用这个音频管理器调用setStreamVolume()的方式去调整,而不是MediaPlayer.setVolue(int LeftVolume,int RightVolume);这个方法的两个参数也是调正左右声道而不是调节声音大小。

   好了,对此我们对游戏开发中到底需要用什么来做进行了分析,总结就是SoundPool适合做特效声,其实播放背景音乐我感觉还是用MediaPlayer比较好,当然啦,用什么都看大家喜好和选择啦!下面附上项目下载地址:(项目10+MB因为含有res音频文件)

有人问  怎么才知道一首歌曲播放完了,那么这里给说下:

PlaybackCompleted 状态: 文件正常播放完毕,而又没有设置循环播放的话就进入该状态,并会触发 OnCompletionListener onCompletion() 方法。此时可以调用 start() 方法重新从头播放文件,也可以 stop() 停止 MediaPlayer ,或者也可以 seekTo() 来重新定位播放位置。

注意:1、 别忘记绑定操作!  mp.setOnCompletionListener(this);

2、如果你设置了循环播放  mp.setLooping(true); 的话,那么永远都不会监听到播放完成的状态!!!!这里一定要注意!

源码下载地址:http://download.csdn.net/source/2943074    (里面有一首我的手机铃声 )

(推荐大家订阅本博客,因为咱的更新速度可是很快的~娃哈哈)

分享到:
评论

相关推荐

    MediaPlayer与SoundPool总结

    在Android开发中,处理音频播放是一项常见的任务,而MediaPlayer和SoundPool是两个主要的音频处理类,用于在应用程序中播放声音。本篇文章将对这两个组件进行深入的总结,探讨它们的特点、用途以及如何实现多个音频...

    android安卓app音频播放方式 MediaPlayer与SoundPool的区别.zip

    android安卓app音频播放方式 MediaPlayer与SoundPool的区别.zip

    MediaPlayer+SoundPool游戏点击声音和背景音乐

    3. **资源管理**:注意在适当的时候释放`MediaPlayer`和`SoundPool`资源,尤其是在游戏暂停或退出时。 4. **音量控制**:可以独立调整背景音乐和点击声的音量,适应不同用户的偏好。 在给定的文件名`fillwords`中,...

    MediaPlayer和SoundPool区别及简单实例

    在Android开发中,播放音频是常见的功能之一,而MediaPlayer和SoundPool是两个主要用来处理音频播放的类。本文将深入探讨这两个组件的区别以及如何通过它们实现音频播放。 首先,我们来了解一下`MediaPlayer`。它是...

    Android中播放声音的两种方法MediaPlayer 和SoundPool

    在Android平台上,开发人员可以利用两种主要的工具来播放...以上是对`MediaPlayer`和`SoundPool`在Android中播放声音的详细介绍。在实际操作中,可以通过`SoundPoolDemo`这样的示例代码来更好地理解和实践这两种方法。

    android背景音乐音效,使用MediaPlayer、SoundPool实现

    在Android开发中,为应用程序添加背景音乐和音效是提升用户体验的重要一环。本文将详细介绍如何使用`...在实践中,还需要注意音频资源的管理,以及音频焦点和播放状态的处理,以确保音频播放的流畅性和一致性。

    Android的SoundPool类使用与利弊

    ### Android的SoundPool类使用与利弊 #### 一、SoundPool 类简介 在Android开发过程中,音频播放是一项常见的需求,特别是在游戏开发中。对于简短的音效播放,`SoundPool`类提供了非常高效且实用的方法。相比于`...

    Soundpool实例

    在Android开发中,SoundPool是一个非常实用的类,主要用于播放短小、重复的音频效果,如游戏中的音效。这个"Soundpool实例"是为开发者提供一个了解和学习如何使用SoundPool来管理与播放音频资源的参考。让我们深入...

    Android 中MediaPlayer使用详解源码

    在Android开发中,`MediaPlayer`类是一个至关重要的组件,它为开发者提供了播放音频和视频的能力。这个类使得我们可以处理各种媒体资源,包括本地文件、网络流媒体甚至是通过HTTP或RTSP协议传输的数据。本文将深入...

    Android用SoundPool播放音效

    在游戏开发中,SoundPool常用于播放角色移动、攻击、得分等音效。在消息提醒应用中,可以使用SoundPool播放自定义的通知声效。 综上所述,SoundPool是Android平台上实现高效音效播放的关键组件,尤其适用于需要快速...

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

    本篇文章将深入探讨如何使用SoundPool类来实现游戏音效的播放,让玩家在游戏过程中感受到更加生动和真实的声音效果。 SoundPool是Android系统提供的一种高效的声音播放工具,特别适合用于短小、循环或需要快速响应...

    使用 SoundPool 同时播放多个音频

    在Android开发中,有时我们需要实现同时播放多个音频的效果,例如在游戏场景中或者音乐应用的混音功能。这时,`SoundPool` 类成为一个理想的解决方案。`SoundPool` 是Android系统提供的一个音频处理工具,它允许...

    4-15-2(SoundPool音效).7z

    本资源“4-15-2(SoundPool音效).7z”可能包含了一系列与SoundPool相关的音频文件和示例代码,用于帮助开发者了解和实践如何在Android应用中使用SoundPool来实现音效的播放。 SoundPool是Android SDK中的一个类,它...

    即时音效, 通过android.media.SoundPool实现

    在Android开发中,即时音效的实现通常依赖于`android.media.SoundPool`类。`SoundPool`是一个高效的声音播放管理器,特别适用于处理小型、短促的音频剪辑,如游戏中的点击声、按钮音效等。下面我们将深入探讨如何...

    Android3D游戏开发技术详解与典型案例源代码(16-22章).rar

    《Android 3D游戏开发技术详解与典型案例源代码(16-22章)》是一部深入探讨Android平台3D游戏开发的专业教程,包含了丰富的实践案例和源代码,旨在帮助开发者掌握构建高性能3D游戏的关键技术和策略。以下是这些章节中...

    MediaPlayer与SeekBar和Chronometer的简单交互

    在Android开发中,`MediaPlayer`、`SeekBar`和`Chronometer`是三个常见的组件,它们在音频和视频播放中起到至关重要的作用。本篇将详细阐述这三个组件的使用及其交互方式。 `MediaPlayer`是Android提供的一个类,...

    Android SoundPool使用案例及源码分析

    释放资源时,`SoundPool`会释放与之关联的所有音频资源以及`AudioTrack`对象。这一过程需要谨慎处理,以确保所有资源都能被妥善回收。 ### 总结 通过本文档,我们深入了解了Android平台下SoundPool的基本使用方法...

    Android MediaPlayer 自定义循环次数

    本文将深入探讨如何使用MediaPlayer自定义循环播放的次数,这在需要重复播放特定音频片段的应用场景中非常实用,比如在教育应用、游戏或是语音提醒应用中。 ### 1. MediaPlayer简介 MediaPlayer是一个功能强大的类...

    SoundPool demo

    在Android平台上,`SoundPool`是一个非常实用的音频管理类,它主要用于播放短小的音频片段,如游戏音效或简单的通知声音。`SoundPool`的特性在于它可以同时播放多个音轨,且加载和播放速度快,非常适合需要快速响应...

    Android 使用MediaPlayer播放视频

    在这个场景中,我们将详细探讨如何使用`MediaPlayer`来播放视频,同时结合`SurfaceView`来显示视频画面。本文将深入解析相关知识点,并提供一个实践示例。 首先,`MediaPlayer`类是Android多媒体框架的一部分,它...

Global site tag (gtag.js) - Google Analytics