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 (里面有一首我的手机铃声 )
分享到:
相关推荐
android安卓app音频播放方式 MediaPlayer与SoundPool的区别.zip
在Android游戏开发中,音效是提升用户体验的关键因素之一,它可以增强游戏的沉浸感和互动性。本篇文章将深入探讨如何使用SoundPool类来实现游戏音效的播放,让玩家在游戏过程中感受到更加生动和真实的声音效果。 ...
在Android开发中,处理音频播放是一项常见的任务,而MediaPlayer和SoundPool是两个主要的音频处理类,用于在应用程序中播放声音。本篇文章将对这两个组件进行深入的总结,探讨它们的特点、用途以及如何实现多个音频...
在Android平台上,开发人员可以利用两种主要的工具来播放声音:`MediaPlayer`和`SoundPool`。它们各自具有不同的特点和适用场景,下面将详细解释这两种方法及其使用方法。 ## 1. MediaPlayer `MediaPlayer`是...
在Android开发中,为游戏添加音频效果是提升用户体验的关键因素之一。`MediaPlayer`和`SoundPool`是Android SDK中用于处理音频播放的两个重要组件,它们各有特点,适用于不同的场景。下面将详细介绍这两个类以及如何...
在Android开发中,播放音频是常见的功能之一,而MediaPlayer和SoundPool是两个主要用来处理音频播放的类。本文将深入探讨这两个组件的区别以及如何通过它们实现音频播放。 首先,我们来了解一下`MediaPlayer`。它是...
在Android开发中,MediaPlayer是一个非常重要的组件,它用于播放各种媒体资源,如音频和视频文件。本教程将深入探讨如何使用Android的MediaPlayer类来播放MP3格式的音频文件。了解这个知识点对于Android开发者来说至...
在本文中,我们将深入探讨如何基于给定的“android游戏开发源码 体育游戏-----2D迷你桌球”项目进行Android游戏开发。这个项目使用了Java编程语言(JDK 1.6.0_18版本)和Android SDK 2.1,开发环境为Eclipse 3.5.1。...
在Android开发中,多媒体处理是应用功能的重要组成部分,尤其是音频播放。`MediaPlayer`类是Android提供的一个核心组件,专门用于播放各种音频文件。本篇将深入讲解如何使用`MediaPlayer`来实现音频播放,并通过示例...
在Android开发中,为应用程序添加背景音乐和音效是提升用户体验的重要一环。本文将详细介绍如何使用`MediaPlayer`和`SoundPool`这两个核心组件来实现这一功能。 首先,`MediaPlayer`是Android系统提供的一个用于...
在提供的`1503SoundPool`压缩包中,可能包含了一个或多个音频文件以及一个简单的Android项目,展示了如何在代码中应用这些概念。解压并分析这些文件,你将更深入地理解`SoundPool`的工作原理及其在实际项目中的应用...
在Android游戏开发中,音频元素是提升用户体验的关键组成部分。本教程将聚焦于如何在Android游戏中集成和管理音频资源,这是Android游戏开发系列教程的第四讲。通过这份源码,开发者可以深入理解Android游戏中的音频...
在Android应用开发中,MediaPlayer类是用于播放各种音频和视频资源的核心组件。在这个特定的示例中,我们关注的是如何使用MediaPlayer与进度条(SeekBar)结合,创建一个简单的音频播放器。以下是对这个Android应用...
在Android开发中,SoundPool是一个非常重要的音频管理工具,它允许开发者高效地管理和播放短期的、重复的声音效果。本资源“4-15-2(SoundPool音效).7z”可能包含了一系列与SoundPool相关的音频文件和示例代码,用于...
在Android开发过程中,音频播放是一项常见的需求,特别是在游戏开发中。对于简短的音效播放,`SoundPool`类提供了非常高效且实用的方法。相比于`MediaPlayer`类,`SoundPool`更加适合播放短小的音频片段,并能够很好...
总而言之,"android游戏开发示例"涵盖了Android平台上的游戏开发各个方面,包括但不限于编程语言、游戏引擎、图形渲染、音频处理、网络通信和性能优化。通过学习和实践这些示例,开发者能够逐步构建自己的游戏项目,...
在Android游戏开发中,音乐与音效的处理是至关重要的组成部分,它们为玩家带来沉浸式的游戏体验。本篇文章将深入探讨“太鼓达人”这类音乐节奏游戏的开发原理,通过雨松MOMO的专业讲解,我们可以了解到如何在Android...
在Android平台上,游戏开发已经成为一个繁荣的领域,吸引了众多开发者和玩家的关注。Android以其开源、免费和广泛的设备覆盖,为游戏开发者提供了丰富的机遇。本文将深入探讨Android游戏开发的基础知识,帮助初学者...
总的来说,这份"Android游戏开发大全PPT课件"将引导你逐步掌握Android游戏开发的各个方面,从基础的编程语言到高级的游戏特性,帮助你成为一个出色的Android游戏开发者。通过深入学习和实践,你将能够创造出属于自己...
在Android平台上进行游戏开发是一项有趣且具有挑战性的任务,尤其当你使用的是强大的集成开发环境(IDE)——Android Studio。本文将深入探讨如何基于Android Studio开发一款名为“飞飞机大战”的小游戏,该游戏具备...