文档章节

SoundPool声音管理

40岁的青春
 40岁的青春
发布于 2015/06/17 11:23
字数 1038
阅读 1083
收藏 4
点赞 1
评论 0

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

SoundPool存在的缺陷
    1.SoundPool最大只能申请1M的内存空间,这就意味着我们只能用一些很短的声音片段,而不是用它来播放歌曲或者做游戏背景音乐。
  2.SoundPool提供了pause和stop方法,但这些方法建议最好不要轻易使用,因为有些时候它们可能会使你的程序莫名其妙的终止。建议使用这两个方法的时候尽可能多做测试工作,还有些朋友反映它们不会立即中止播放声音,而是把缓冲区里的数据播放完才会停下来,也许会多播放一秒钟。
  3.SoundPool的效率问题。其实SoundPool的效率在这些播放类中算是很好的了,但是有的朋友在G1中测试它还是有100ms左右的延迟,这可能会影响用户体验。也许这不能管SoundPool本身,因为到了性能比较好的Droid中这个延迟就可以让人接受了。
  在现阶段SoundPool有这些缺陷,但也有着它不可替代的优点,基于这些我们建议大在如下情况中多使用SoundPool:1.应用程序中的声效(按键提示音,消息等)2.游戏中密集而短暂的声音(如多个飞船同时爆炸)

import android.media.AudioManager;
import android.media.SoundPool;

 

SoundPool soundPool;//声明SoundPool对象


//soundPool实例化,第一个参数为soundPool可以支持的声音数量,这决定了Android为其开设多大的缓冲区,第二个参数为声音类型,在这里标识为系统声音,除此之外还有AudioManager.STREAM_RING以及AudioManager.STREAM_MUSIC等,系统会根据不同的声音为其标志不同的优先级和缓冲区,最后参数为声音品质,品质越高,声音效果越好,但耗费更多的系统资源。

soundPool= new SoundPool(10,AudioManager.STREAM_SYSTEM,5);

//系统为soundPool加载声音 第一个参数为上下文参数,第二个参数为声音的id,第三个参数为声音的优先级,当多个声音冲突而无法同时播放时,系统会优先播放优先级高的。一般我们将声音信息保存在res的raw文件夹下
//载入音频流,返回在池中的id
int sourceid = soundPool.load(this,R.raw.collide,1);

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


注意:
如果SoundPool刚调完加载load函数之后,直接调用SoundPool的play函数可能出现
error "sample 1 not READY"
所以建议,调用加载资源函数load之后,实现资源加载结束的监听函数,在这个监听到资源加载结束之后,播放音频文件。
如:
     SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 5);
      //载入音频流,返回在池中的id 
      final int sourceid = soundPool.load(mContext, R.raw.move_sound, 0);
      //播放音频,第二个参数为左声道音量;第三个参数为右声道音量;第四个参数为优先级;第五个参数为循环次数,0不循环,-1循环;第六个参数为速率,速率最低0.5最高为2,1代表正常速度 
     soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
              
           public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                    // TODO Auto-generated method stub
                    soundPool.play(sourceid, 2, 2, 0, 0, 1);
                   }
     });

© 著作权归作者所有

共有 人打赏支持
40岁的青春
粉丝 2
博文 69
码字总数 13823
作品 0
朝阳
android mediaplayer相关记录 备忘

音频播放和视频播放使用mediaplayer,视频播放也可以使用vidioview,它是封装了mediaplayer和SurfaceView,但是自定义性不如mediaplyer VideoView videoView = new VideoView(this);setConte...

广阔 ⋅ 2012/09/10 ⋅ 0

Android SoundPool 的简单使用

之前只知道Android中可以用MediapLayer播放音乐,原来今天才发现可以用SoundPool,用SoundPool可以播一些短的反应速度要求高的声音,比如游戏中的爆破声,而MediapLayer适合播放长点的。 一般...

秀宇 ⋅ 2015/11/26 ⋅ 0

Android sample 1 not READY

解决方法如下: 一、调用setOnLoadCompleteListener方法来确保音乐加载完成,注意需要SoundPool.OnLoadCompleteListener listener 需要实现SoundPool.OnLoadCompleteListener接口。 soundPoo...

深圳_小白菜 ⋅ 2014/06/11 ⋅ 0

【Android游戏开发之八】游戏中添加音频-详解MediaPlayer与SoundPoo!并讲解两者的区别和游戏中的用途!

李华明Himi 原创,转载务必在明显处注明: 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/312.html 很多童鞋说我的代码运行后,点击home或者back后会程序异常,...

迷途d书童 ⋅ 2012/03/19 ⋅ 0

Android中的soundpool小结

之前只知道android中可以用mediaplayer播放音乐,原来今天才发现 可以用soundpool,用soundpool可以播一些短的反应速度要求高的声音, 比如游戏中的爆破声,而mediaplayer适合播放长点的。 1....

Carl_ ⋅ 2015/01/08 ⋅ 0

android开发中音频的使用

当进行android开发或游戏开发时,常常会涉及背景音乐的播放,以及短音效的使用 1.当涉及到背景音乐等长音乐播放时通常使用MediaPlayer类进行播放操作 MediaPlayer类常用方法: 1.public sta...

qq_38555940 ⋅ 05/28 ⋅ 0

android mediaplayer 播放速度调慢

最近小弟在搞一个播放声音节奏的app,里面要用到mediaplayer,这个控件非常适合我的开发条件,可是唯一不满足的就是它不能调节它的播放速度,不能像soundpool那样可以控制播放速度。我有考虑...

hjr888 ⋅ 2014/07/25 ⋅ 1

安卓点击事件音效(增加+控制)

项目中遇到的问题,跟大家分享 开发环境:Android Studio 项目中用到的类(关键):SoundPool 项目github地址:https://github.com/zw21544182/BtMusicDemo 项目中所用到的关键知识: 1.基类抽...

掌上微科技 ⋅ 2017/09/08 ⋅ 0

Android平台游戏声音播放实践

大部分游戏都有音效,不然游戏乐趣会降低很多,而几乎所有音效都是重复播放的。 下面的代码只加载一次音频文件,但是却可以被多次使用。请将音频文件放置在/res/raw路径中。 public static ...

Kevin_Gan ⋅ 2010/07/07 ⋅ 0

Android平台游戏声音播放实践

大部分游戏都有音效,不然游戏乐趣会降低很多,而几乎所有音效都是重复播放的。 下面的代码只加载一次音频文件,但是却可以被多次使用。请将音频文件放置在/res/raw路径中。 public static ...

Kevin_Gan ⋅ 2010/08/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

内核线程、轻量级进程、用户线程

线程与进程概念 在现代操作系统中,进程支持多线程。 进程是资源管理的最小单元; 线程是程序执行的最小单元。 即线程作为调度和分配的基本单位,进程作为资源分配的基本单位 一个进程的组成...

117 ⋅ 31分钟前 ⋅ 0

elasticsearch2.4.6升级为elasticsearch-5.5.0的经历

将elasticsearch-5.5.0 中的配置 path.data 指向原来的数据路径 即 path.data: /usr/local/src/elasticsearch-2.4.6/data 注意: elasticsearch-5.5.0 需要将jdk版本升级到1.8...

晨猫 ⋅ 32分钟前 ⋅ 1

lvm讲解 磁盘故障小案例

1

oschina130111 ⋅ 36分钟前 ⋅ 0

那些提升开发人员工作效率的在线工具

本文转载自公众号 Hollis 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中要经常使用到的。 Hollis偏爱使用...

时刻在奔跑 ⋅ 48分钟前 ⋅ 0

restful风格 实现DELETE PUT请求 的web.xml的配置

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframe......

泉天下 ⋅ 54分钟前 ⋅ 0

Shell数组

Shell数组 Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。 bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数...

蜗牛奔跑 ⋅ 今天 ⋅ 0

nmap为了开发方便 可以做简单的修改

因为nmap扫描是默认使用的是nse脚本,但是在开发的过程中需要修改后缀(主要是因为后缀为lua才能显示高亮,所以这里用一个取巧的办法) nse_main.lua文件中我们找到如下代码 local t, path = cn...

超级大黑猫 ⋅ 今天 ⋅ 0

springmvc获取axios数据为null情况

场景:前端用了vue没有用ajax与后台通信,用了axios,但是在代码运行过程中发现axios传递到后台的值接受到数据为null。 问题原因:此处的问题在与axios返回给后台的数据为json类型的,后台接...

王子城 ⋅ 今天 ⋅ 0

hadoop技术入门学习之发行版选择

经常会看到这样的问题:零基础学习hadoop难不难?有的人回答说:零基础学习hadoop,没有想象的那么难,也没有想象的那么容易。看到这样的答案不免觉得有些尴尬,这个问题算是白问了,因为这个...

左手的倒影 ⋅ 今天 ⋅ 0

806. Number of Lines To Write String - LeetCode

Question 806. Number of Lines To Write String Solution 思路:注意一点,如果a长度为4,当前行已经用了98个单元,要另起一行。 Java实现: public int[] numberOfLines(int[] widths, Str...

yysue ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部