一般大家使用的是MediaPlayer来播放音频,它的创建和销毁都是非常消耗资源的,如果我们的需求是播放一些短促而且频繁播放的音频的话MediaPlayer就有些不合适了,我们来讲讲SoundPool来播放短促的音频:


SoundPool结构如下

初始化SoundPool

初始化SoundPool 我们直接new SoundPool (int maxStreams, int streamType, int srcQuality)即可

参数解释:

参数 解释
maxStreams 最大的流的数量
streamType 流的类型(看下图)建议AudioManager.STREAM_SYSTEM
srcQuality 频的质量,默认是0,目前没有影响

重要方法

加载音频

load方法中我们一般是把音频文件放到resraw文件夹下,然后使用load(Context context, int resId, int priority)方法来加载音频到SoundPool中:

参数解释:

参数 解释
context 上下文
resId 音频文件的地址:R.raw.deep
priority 优先级:都是短促音频无影响设置为1即可

播放音频

播放音频比较简单,使用play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)

参数解释:

参数 解释
soundID 声音的id(即:load到SoundPool的顺序,从1开始)
leftVolume\rightVolume 左\右声道的音量控制, 0.0 到 1.0
priority 优先级,0是最低优先级
loop 是否循环播放,0为不循环,-1为循环
rate 播放比率,从0.5到2,一般为1,表示正常播放

第一小结

总结一下播放一个音频的所需代码如下:

//初始化SoundPool
private SoundPool soundPool= newSoundPool(10,AudioManager.STREAM_SYSTEM,5);
//加载deep 音频文件
soundPool.load(this,R.raw.deep,1);
//播放deep
soundPool.play(1,1, 1, 0, 0, 1);

封装

如果我们在很多Activity中都要用到音频文件,比如给所有点击操作加上音效,那么我们每个Activity都要new ,然后load,在play,这样做是非常繁琐而且混乱的,那么我们做如下的分装:

/**
*
* @author zsl
* @blog http://blog.csdn.net/yy1300326388
*
*/
public class SoundPlayUtils {
// SoundPool对象
public static SoundPool mSoundPlayer = new SoundPool(10,
AudioManager.STREAM_SYSTEM, 5);
public static SoundPlayUtils soundPlayUtils;
// 上下文
static Context mContext; /**
* 初始化
*
* @param context
*/
public static SoundPlayUtils init(Context context) {
if (soundPlayUtils == null) {
soundPlayUtils = new SoundPlayUtils();
} // 初始化声音
mContext = context; mSoundPlayer.load(mContext, R.raw.beng, 1);// 1
mSoundPlayer.load(mContext, R.raw.click, 1);// 2
mSoundPlayer.load(mContext, R.raw.diang, 1);// 3
mSoundPlayer.load(mContext, R.raw.ding, 1);// 4
mSoundPlayer.load(mContext, R.raw.gone, 1);// 5
mSoundPlayer.load(mContext, R.raw.popup, 1);// 6
mSoundPlayer.load(mContext, R.raw.water, 1);// 7
mSoundPlayer.load(mContext, R.raw.ying, 1);// 8 return soundPlayUtils;
} /**
* 播放声音
*
* @param soundID
*/
public static void play(int soundID) {
mSoundPlayer.play(soundID, 1, 1, 0, 0, 1);
} }

我们先把所有的文件都加载起来,用的时候直接查询看一下它是第几个加载的,然后直接调用play方法即可:


使用

第一步:在程序入口的Activity的onCreate方法中添加如下代码:

//初始化音效
SoundPlayUtils.init(this);

第二步:在任何地方播放时,直接使用如下代码:

  • 播放beng
//播放声音
SoundPlayUtils.play(1);
  • 播放water
//播放声音
SoundPlayUtils.play(7)

soundpool播放声音的更多相关文章

  1. 使用SoundPool播放音效

    针对应用程序经常需要播放密集.短促的音效,因为MediaPlayer存在如下缺点: 1.资源占用量较高.延迟时间较长. 2.不支持多个音效同时播放. SoundPool使用音效池的概念来管理多个短促的 ...

  2. android SoundPool播放音效

    MediaPlayer的缺点: 资源占用量高,延时时间较长 不支持多个音效同一时候播放 SoundPool主要用于播放一些较短的声音片段,CPU资源占用率低和反应延时小,还支持自行色设置声音的品质,音 ...

  3. SoundPool 音频播放 详解 示例

    简介 如果应用程序经常播放密集.急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了.因为MediaPlayer存在如下缺点: 1) 延时时间较长,且资源占用率高. 2) ...

  4. Android开发之SoundPool使用具体解释

    使用SoundPool播放音效 假设应用程序常常播放密集.急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了.由于MediaPlayer存在例如以下缺点: 1)      ...

  5. SoundPool

    如果应用程序经常播放密集.急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了.因为MediaPlayer存在如下缺点: 1) 延时时间较长,且资源占用率高. 2) 不支持 ...

  6. Android多媒体技术之音频播放

    1.Android中音频播放的方式和区别. MediaPlayer:主要用于播放音频,可以播放视频,但是一般不用其进行视频播放. SoundPool:主要用于播放一些短促的声音片段,主要优势是cpu资 ...

  7. Android 使用SoundPool播放音效

    在Android开发中我们经常使用MediaPlayer来播放音频文件,但是MediaPlayer存在一些不足,例如:资源占用量较高.延迟时间较长.不支持多个音频同时播放等.这些缺点决定了MediaP ...

  8. Android的SoundPool

    开发Android软件中我们可能经常需播放多媒体声音文件,一般使用MediaPlayer类但该类占用资源较多,对于游戏等应用可能不是很适合,SoundPool类在SDK的android.media.S ...

  9. SoundPool没有声音的问题

    在项目中需要播放一个提示,很短的一个声音,Android中播放声音有两种方式:MediaPlayer和SoundPool.相对来说SoundPool比较轻量级一些,多用在播放比较短急的声音,Media ...

随机推荐

  1. Linux命令-帮助命令:whatis,apropos

    whatis可以查看命令简化版的帮助内容 whatis ls 查看简化版的ls命令的帮助内容 whatis ifconfig 查看简化版的ifconfig命令的帮助内容 apropos可以查看配置文件 ...

  2. pycharm 控制台字体背景颜色设定让你美到爆

    还在为你控制台字体颜色不入眼而发愁吗? 在某些特殊时刻想要改变下字体的颜色却无从下手而发愁吗? 那你就进来看一看,瞧一瞧,之需看2分钟,花2分钟理解,花3分钟练练手就能让你的控制能字体炫酷起来! 一. ...

  3. cocos2dx 关于lua 绑定的环境配置官方文档翻译与 将自己定义c++方法绑定到lua的的方法

    网上有好多写如何讲自己定义的方法绑定到lua的文章,当中都仅仅对环境配置做了简单的介绍,看到有的帖子写在绑定中遇到了各种各样的error.大部分是因为环境配置不对导致的,下面是官方的文档有标准的说明, ...

  4. mysql create table 语法详解

    create table 可以分成三类 一.一般create table 语句: 1 语法 create [temporary] table [if not exists] tbl_name (cre ...

  5. springmvc mybatis 声明式事务管理回滚失效,(checked回滚)捕捉异常,传输错误信息

    一.知识点及问题 后端框架: Spring .Spring mvc .mybatis 业务需求: client先从服务端获取用户大量信息到client,编辑完毕之后统一Post至服务端,对于数据的改动 ...

  6. Eclipse中导入JDK类库的源代码以及添加指定的API

    一.在Eclipse中导入JDK类库的源代码 操作步骤: 打开eclipse->“window”-> “Preferences” -> “Java” -> “Installed ...

  7. jinja2问题集锦

    用jinja2写模板的时候遇到了一些问题,记录一下 抽出base.html作为模板 之前的小项目写得都很不规范,模板都是能用就行,基本上只用到if语句,for语句和变量.导航栏都是复制粘贴,没有把共同 ...

  8. 好工具 VHD

    通过powershell 互转 Convert-VHD –Path F:\debian.vhdx –DestinationPath F:\debian.vhd 举个栗子 附加参考 Convert-VH ...

  9. 高德地图sdk的AMapNavi.getInstance为null解决办法

    问题,动态库没有全部导入,之前我只放到了armeabi下,可是没想到我手机是armeabi-v7a的. 最近做Android项目,先用的是百度地图,可是后来发现百度地图没有提供地图的View点击事件( ...

  10. 读取大csv文件数据插入到MySql或者Oracle数据库通用处理

    import java.io.BufferedInputStream; import java.io.BufferedReader;import java.io.BufferedWriter;impo ...