Android中播放声音的两种方法

标签: android 播放 声音 | 发表时间:2014-07-01 09:27 | 作者:iaiai
出处:http://www.iteye.com
       在Android中,音频、视频等多媒体元素的加入,使得应用程序的用户体验更好。可以说,现在的手机,已经远远不只作为通信工具,更成为娱乐、办公的必备产品。

Android提供了简单的音频API。一般大家使用的是MediaPlayer播放音频,这也是最常见的一种播放声音的工具。这种工具在互联网上有大量的实例,因此在此只做简单的介绍。

对播放行为的控制是三个大家非常熟悉的方法:start()、stop()和pause()。
通过static MediaPlayer create(Context, Uri)这个方法,可以获得一个新创建的MediaPlayer对象。
在播放过程中,有几个可以监听播放过程的监听器,如:
n setOnCompletionListener(MediaPlayer.OnCompletionListener listener),监听音频播放结束;
n setOnErrorListener(MediaPlayer.OnErrorListener listener),监听播放过程中的错误事件;
n setOnPreparedListener(MediaPlayer.OnPreparedListener listener),当prepare()被调用时触发。
然而,使用MediaPlayer播放时,也有一些问题。我们知道MediaPlayer在创建和销毁时都会耗费大量的系统资源,且创建和销毁的时间相对较长。此外,如果我们需要在同一时刻播放很多声音,MediaPlayer是不支持的。
因此,我们需要一个更加轻量级的声音播放工具。

Android提供了另外一种,叫做SoundPool,它适合播放那些需要反复播放,但时间较短的音效。它支持同时播放多种声音,这些声音在系统开始时会加载到列表中,按照这些声音的id,我们可以调用这些音效。

下面我们进入一个实例看看SoundPool到底是怎么工作的。

例如,现在在一个五子棋游戏中,我们需要在棋子落盘的时候播放一段声音。我们可以利用SoundPool,因为它时间很短,而且需要反复播放,并且我们不希望声音占用太大资源。

先看看代码:
private SoundPool soundPool;
soundPool= newSoundPool(10,AudioManager.STREAM_SYSTEM,5);
soundPool.load(this,R.raw.collide,1);
soundPool.play(1,1, 1, 0, 0, 1);

代码非常简单,第一行是声明了一个SoundPool对象,这个一般是作为类的成员属性出现的。第二行将soundPool实例化,第一个参数为soundPool可以支持的声音数量,这决定了Android为其开设多大的缓冲区,第二个参数为声音类型,在这里标识为系统声音,除此之外还有AudioManager.STREAM_RING以及AudioManager.STREAM_MUSIC等,系统会根据不同的声音为其标志不同的优先级和缓冲区,最后参数为声音品质,品质越高,声音效果越好,但耗费更多的系统资源。

第三行,系统为soundPool加载声音,第一个参数为上下文参数,第二个参数为声音的id,一般我们将声音信息保存在res的raw文件夹下,如下图所示。

第三个参数为声音的优先级,当多个声音冲突而无法同时播放时,系统会优先播放优先级高的。

第四行就是播放了,第一个参数为id,id即为放入到soundPool中的顺序,比如现在collide.wav是第一个,因此它的id就是1。第二个和第三个参数为左右声道的音量控制。第四个参数为优先级,由于只有这一个声音,因此优先级在这里并不重要。第五个参数为是否循环播放,0为不循环,-1为循环。最后一个参数为播放比率,从0.5到2,一般为1,表示正常播放。

SoundPool只能用于播放音效,因为超过大约5.6秒的声音便播放不出来,而且加载超过大约5.6秒的音效还会导致其它声音播放的问题

游戏开发中,通过资料和书籍了解到在有两种播放音频形式可以用在我们的游戏开发中,第一个:MediaPlayer 类 ;第二个:SoundPool 类!
当然还有一个JetPlayer 但是 播放的文件格式比较麻烦,所以这里抛开不解释,有兴趣的可以去自己研究下

SoundPool存在的一些问题:
1. SoundPool最大只能申请1M的内存空间,这就意味着我们只能使用一些很短的声音片段,而不是用它来播放歌曲或者游戏背景音乐(背景音乐可以考虑使用JetPlayer来播放)。
2. SoundPool提供了pause和stop方法,但这些方法建议最好不要轻易使用,因为有些时候它们可能会使你的程序莫名其妙的终止。还有些朋友反映它们不会立即中止播放声音,而是把缓冲区里的数据播放完才会停下来,也许会多播放一秒钟。
3. 音频格式建议使用OGG格式。使用WAV格式的音频文件存放游戏音效,经过反复测试,在音效播放间隔较短的情况下会出现异常关闭的情况(有说法是SoundPool目前只对16bit的WAV文件有较好的支持)。后来将文件转成OGG格式,问题得到了解决。
4.在使用SoundPool播放音频的时候,如果在初始化中就调用播放函数进行播放音乐那么根本没有声音,不是因为没有执行,而是SoundPool需要一准备时间!囧。当然这个准备时间也很短,不会影响使用,只是程序一运行就播放会没有声音罢了,所以我把SoundPool播放写在了按键中处理了



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [android 播放 声音] 推荐:

Android中播放声音的两种方法

- - 移动开发 - ITeye博客
       在Android中,音频、视频等多媒体元素的加入,使得应用程序的用户体验更好. 可以说,现在的手机,已经远远不只作为通信工具,更成为娱乐、办公的必备产品. Android提供了简单的音频API. 一般大家使用的是MediaPlayer播放音频,这也是最常见的一种播放声音的工具. 这种工具在互联网上有大量的实例,因此在此只做简单的介绍.

优秀的Android Podcast播放器

- Yao - Solidot
John Ryan 写道 "Podcast是通过互联网传播、分成多集播放的节目. 它包括了音频和视频文件,大多数Podcas文件可供下载. 术语podcasting最早是在2004年发明的,某些人可能会错误以为这种媒体需要苹果的iPod才能收听. Android Market 中有大量独立和集成的Podcast播放器,部分功能有限,部分开发还没完成.

优秀的Android音频播放器

- SUN - Solidot
Simon Jessop 写道 "我们常常看到人们把Android设备当成音乐播放器使用,但Android自带的播放器有许多不足,例如缺乏无缝播放. 不过好在Android平台上有许多免费和功能丰富的音乐播放器替代. 这里收集了八款优秀的Android音乐播放器,包括了Winamp,MixZing,Songbird,开源播放器Cubed Music Player,DeaDBeeF Player,等等.

Android三种播放视频的方式

- - CSDN博客推荐文章
在Android中,我们有三种方式来实现视频的播放:. 指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型. 2、使用VideoView来播放. 在布局文件中使用VideoView结合MediaController来实现对其控制. 3、使用MediaPlayer类和SurfaceView来实现,这种方式很灵活.

Android 4.4中播放HTML视频的Bug

- - 爱谷地
近期Nexus 4手机自动升级到Android4.4,本来挺好的一件事儿,结果发现自己的应用中出现一个Bug,应用中使用了Webview播放HTML5视频,代码如下:. 在4.3版本之前播放正常,新版本中播放时只能听到声音,而画面停留在最初的画面,也就是poster属性中的图片,但不会显示视频动画,只有点击暂停按钮,然后再次点击播放按钮时,视频动画才会显示正常.

开源的Android视频播放器

- - CSDN博客推荐文章
之前尝试自己解码视频,然后播放显示,虽然音视频都可以播放,但是实现不了音视频的同步,所以使用第三方的视频库Vitamio来实现视频播放器功能,这样自己只需要实现播放解码的制作不不要关心底层解码和显示问题. 是使用Vitamio 4.0,制作的视频播放器,后续会继续添加直播,网络播放功能. 2.使用ListView显示本地视频的缩略图,文件名称,播放时间.

Android播放HLS协议的流媒体

- - CSDN博客推荐文章
最近需要测试Android是否支持HLS协议的流媒体播放,在网上找了些例子都是播放本地文件的,还有一些播放网络文件的却不是HLS协议的流媒体. 据Android3.0的更新说明介绍,Android3.0已经开始支持大部分的HLS流媒体类型,于是就做了一下测试. mvdView.setVideoURI(uri); // mvdView是一个videoView控件.

【Android】播放视频的简易播放器源码

- - CSDN博客推荐文章
一,MainActivity.java源码. if(!checkSDCard()) //如果没有SD卡. mSurfaceView01 = (SurfaceView) findViewById(R.id.mSurfaceView1); //显示动画用的容器. 三,源码中所需其余图片等 ,自备就可以.

MIUI 音乐播放器[Android] | 小众软件 > Android

- zhipeng - 小众软件 - Appinn
如果你用 Android ,你应该听过 MIUI ,最近小米手机发布的消息更是异常火爆. 这里给大家推荐一下 MIUI 的本地音乐播放器 – MIUI Music Player. MIUI Music Player 黑色调、简约风格,歌词与封面下载等功能一应俱全,标配均衡器,是一款值得体验的音乐播发器.

XBMC Romote:用 Android 手机控制 XBMC 媒体播放

- 亚 强 - Wow! Ubuntu
现在 XBMC 开发组已经发布了 10.1 的发布版了,但是这个不是今天在这里介绍的重点,XBMC Remote 才是今天介绍的重点,这个是一款开源的Android应用程序. 专门用来远程控制你的XBMC,同时也支持浏览你的 XBMC 媒体库的功能,作用就是把你的 Android 手机作为一个高端的 XBMC 遥控器.