码迷,mamicode.com
首页 > 移动开发 > 详细

[android] SoundPool详解

时间:2015-05-26 21:37:37      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:

今天做一个小Demo用到了SoundPool,总结一下。

MediaPlayer缺点不能重叠播放音乐,封装程度比较高,所以加载起来会比较慢。

SoundPool简介

Android系统提供了另一种播放音效的类。用来加载多个音效,短促音效和多个短促音效,可自行设置声音品质,音量,重复和优先级。在一定场合还是很好用的。

技术分享

属于android.media包下,继承自Object。

  • 构造方法

public SoundPool(int maxStreams, int streamType, int srcQuality) {...}
参数一 maxStreams支持多少个声音(也就是池的大小)
参数二 streamType:指定声音类型通过AudioManager获取对应的常量值。
参数三 srcQuality:采样率变换质量,没用到。默认是0,没查到资料。。

<span style="font-size:24px;">SoundPool<span style="color:#ff0000;"> pool</span> = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);</span>
    指定了该池最多指定三个音频,使用用于系统声音的音频流。于AudioManager参数有很多,可以戳---> AudioManager

  • 加载数据

有四个构造方法:

  • public int load(String path, int priority)
从完整文件路径名载入
path:文件路径
priority:优先级,0的优先级最低
返回值:这个声音的ID,用于打开和关闭音乐。
  • public int load(AssetFileDescriptor afd, int priority)
从Asset对象载入
afd:一个assets文件中的描述器,可以获得assets下文件的信息;
priority:
返回值:
  • public int load(Context context, int resId, int priority)
从APK资源获取 
context:
resId:文件的ID(res文件夹里的文件才有id)
priority:
  • public int load(FileDescriptor fd, long offset, long length, int priority)
从FileDescriptor对象载入  

fd文件描述类的实例
offset从声音文件开始的偏移量(从什么地方播放)
length声音长度
priority

  • 播放

构造方法:
public final int play(int soundID, float leftVolume, float rightVolume,int priority, int loop, float rate)
参数一 soundID:所播放的声音ID,是load方法返回的
参数二 leftVolume:左音量,值从(0.0-1.0)
参数三 rightVolume:右音量,值从(0.0-1.0)
参数四 priority:优先级,0的优先级最低。
参数五 loop:是否循环,0不循环,-1一直循环。
参数六 rate:播放速率,1为正常速率。范围从0.5-2。

如果需要播放多首:需要一个集合来存储音频的ID,就是上面load方法返回的int。
如果指定播放一首:就不用建集合了,假设音频位于
技术分享

<span style="font-size:24px;">//获取资源</span>
<span style="font-size:24px;"><span style="white-space:pre">	</span>AssetFileDescriptor fd = getResources().openRawResourceFd(R.raw.music)</span>
<span style="font-size:24px;">//加载音频
<span style="white-space:pre">	</span>int soundID = pool.load(fd, 1);</span>
<span style="font-size:24px;">//播放音频,soundID是上面的返回值
<span style="white-space:pre">	</span>pool.play(soundID, 1, 1, 0, 0, 1);</span>


这样完成了一首音频的播放。
最后一个问题:播放多首音频。

声明一个集合存放音频
HashMap<Integer, Integer> soundMap = new HashMap<Integer, Integer>();
soundMap.put(1, pool.load(this, R.raw.music1, 1));
soundMap.put(2, pool.load(this, R.raw.music2, 1));
soundMap.put(3, pool.load(this, R.raw.music3, 1));

存放三个音频;
pool.play(soundMap.get(1), 1, 1, 0, 0, 1);
pool.play(soundMap.get(2), 1, 1, 0, 0, 1);
pool.play(soundMap.get(3), 1, 1, 0, 0, 1);

这样就完成多首音频的播放

  • 释放资源及其他

release()方法释放所有SoundPool对象占据的内存和资源。

pause(soundID)暂停播放

stop(soundID)停止播放

......

[android] SoundPool详解

标签:

原文地址:http://blog.csdn.net/bless2015/article/details/46010759

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!