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

Android中播放声音的两种方法

 
阅读更多
       在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播放写在了按键中处理了

  • 大小: 7 KB
分享到:
评论

相关推荐

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

    介绍android如果使用两个工具类进行声音播放 详见转载博客 http://blog.csdn.net/ygswine/article/details/17297571

    Android开发中播放声音的两种方法分析

    本文实例讲述了Android开发中播放声音的两种方法。分享给大家供大家参考,具体如下: 在Android中,音频、视频等多媒体元素的加入,使得应用程序的用户体验更好。可以说,现在的手机,已经远远不只作为通信工具,更...

    一种Android视频播放的双屏异显实现方法及系统.docx

    一种Android视频播放的双屏异显实现方法及系统.docx

    在Android上播放声音及控制源码

    今天在做一款应用,想在里面添加一些音乐来增加用户体验,于是否翻看Android API,发现了其中有一个 MediaPlayer 类来控制媒体的音频播放,使用它有两种方式来达到声音播放的效果: MediaPlayer实例.setDataSource...

    Android音频系统AudioTrack使用方法详解

    在android中播放声音可以用MediaPlayer和AudioTrack两种方案的,但是两种方案是有很大区别的,MediaPlayer可以播放多种格式的声音文件,例如MP3,AAC,WAV,OGG,MIDI等。而AudioTrack只能播放PCM数据流。 事实上,...

    深入理解Android:卷I--详细书签版

    笔者根据研究Android代码的心得,在本书中尝试性地采用了精简流程、逐个击破的方法进 行讲解,希望这样做能帮助读者更快、更准确地把握各模块的工作流程及其本质。本书大部分章节中都专门撰写了“拓展思路”的内容...

    基于Android的手机音乐播放器的开题报告.doc

    " "课题的研究方案(拟采用的研究方法、技术路线、试验方案) " "基于Android的音乐播放器是当下手机应用市场中较为流行的一种音乐播放软件,A" "ndroid操作系统的完全开发正是给了开发者一个很好的平台,结合自己...

    Android开发资料合集--续

    81、获得屏幕像素的两种方法 126 82、ShowDialog(int id); 126 83、透明效果的实现 128 84、根据网络或GPS获得经纬度 128 85、TextView 130 90、获取存储卡和手机内部存储空间 130 91、获得当前应用的UID 131 92、...

    声音采集源码java-AudioAnalyze:Android主要实现录音功能,集合了录音、暂停、停止、播放、重录、计时、pcm转wav等功能

    AudioRecord和MediaRecorder两种都可以录制音频,MediaRecorder基于文件录音,系统已实现大量的封装,集成了录音、编码、压缩等,支持少量的音频格式文件,操作起来更加简单,而AudioRecord基于字节流录音,...

    一个集画画和钢琴两种功能的app

    一个集画画和钢琴两种功能的app,全英文的哦,适合新手参考 画板集成了多种功能,有擦除,换颜色,加粗变细等功能 钢琴集成了两种声音。钢琴声和笛声。

    真实吉他 Real_guitar_2.0.0.apk

    当前版本:2.0.0 软件语言:非中文 软件类别:乐器模拟 软件大小:18.47 MB 适用固件:2.3及更高固件 内置广告:有广告 适用平台:Android 真实吉他是最逼真的模拟之吉他一, 具有简单、...✔ 两种类型:尼龙和钢弦吉他

    3G应用开发之Android

    3G,全称为3rd Generation,中文含义就是指第三代数字通信。 所谓3G,是指将无线通信与国际互联网等多媒体通信结合的新一代移动通信系统。...第三代与前两代的主要区别是在传输声音和数据的速度上有很大的提升

    alan-sdk-android:Alan AI Android SDK向您的应用添加了语音助手或聊天机器人。 支持Java,Kotlin

    创建语音助手或使用两种输入模式(语音和手势)同步工作来构建多模式界面。艾伦(Alan)是语音AI平台Alan是一个对话式语音AI平台,可让您为您的应用创建智能语音助手。 它提供了所有必要的工具来设计,嵌入和主持您...

    SipDroid客户端源码

    5. 直接用ant debug的方法编译出的程序,只支持A率和U率两种音频编码格式,其他的都需要通过NDK的方法导入后,才能使用。 6. 如果对端终端支持视频的话(如linphone),菜单如下: 保持,静音, 转移 发送视频 挂断 ...

    android 入门

    所谓3G,是指将无线通信与国际互联网等多媒体通信结合的新一代移动通信系统。 3G只是一种通信技术标准,符合这个标准的技术有WCDMA、CDMA2000、TD-...第三代与前两代的主要区别是在传输声音和数据的速度上有很大的提升

    Android彩信介绍

    MMS的工业标准是由两个组织,WAP Forum(WAP论坛)和3GPP 所制订的。因此, MMS是设计成可以在WAP协议的上层运行,它不局限于传输格式,既支持电路交换数据 格式(circuit-switched data),也支持通用分组无线服务...

    3g android开发

    对安卓开发中3G开发的详解 “3G,全称为3rd Generation,中文含义就是指第三代数字通信。 所谓3G,是指将无线通信与国际互联网等多媒体通信...第三代与前两代的主要区别是在传输声音和数据的速度上有很大的提升。 ”

    CalenGoo 便捷日程管理 For Android v1.0.87.zip

    一款日程应用程序,可以与Android日历和谷歌日历进行同步。让你更方便快捷的管理你的日程!  软件具有五种日历视图:日、周、月、议程和横向日历。  通过这款软件,可以对你即将要办的事进行记录和安排,可以...

    我的闹钟 Alarm Clock for Me 2.73.1 中文免费版.zip

    •关闭闹钟的两种新方法:数学闹钟可用来启动大脑或摇动闹钟选项以唤醒您的身体; •振动/淡入/贪睡选项使您的唤醒更柔和。 其他功能可增强整体体验: •在主屏幕上使用可自定义的时钟小部件。 •调整屏幕亮度,以...

Global site tag (gtag.js) - Google Analytics