@cxm-2016
2016-09-14T16:47:28.000000Z
字数 1646
阅读 2456
android
no
作者:陈小默(水平有限,望批评指正)
前面已经介绍过了一款音乐播放控件MediaPlayer,但是如果程序中需要播放密集短促的音效时,MediaPlayer就不适用了。MediaPlayer存在如下缺点:
- 资源占用率高,延迟大
- 不支持多音频同时播放
为了解决这个问题,Android中引入了另一种专门用来播放音效的控件SoundPool[1]
SoundPool使用音效池的概念来管理多个短促的音效,并且以ID管理音效。SoundPool主要用于播放较短的声音片断,与MediaPlayer相比,SoundPool还支持设置声音的品质、音量、播放比特率等参数。
SoundPool提供了一个构造器,该构造器可以用来指定它总共支持多少个声音以及声音的品质等。
在API 21以前需要直接使用构造方法如下所示,第一个参数表示音效池的容量,第二个参数表示音效类型,第三个参数表示声音品质
val pool = SoundPool(20,AudioManager.STREAM_SYSTEM,5)
API 21及以后,Android其大部分控件的创建都采用了建造者模式,也就是这样
val pool = SoundPool.Builder().setMaxStreams(20).build()
这样的模式使得创建过程清晰,不像直接调用构造方法不容易看懂参数含义
当我们创建完成SoundPool对象之后,我们就可以使用load方法加载声音了,SoundPool提供了4中重载
1,从指定文件路径去加载声音,第二个参数代表优先级,下同
public int load(String path, int priority)
2,从对应的资源id加载声音
public int load(Context context, int resId, int priority)
3,根据文件描述去加载一个声音
public int load(AssetFileDescriptor afd, int priority)
4,根据文件描述加载一个声音的部分
public int load(FileDescriptor fd, long offset, long length, int priority)
我们在第三步中加载文件后会的到一个int类型的返回值,这个返回值就是代表了声音的ID,于是当我们需要播放声音的时候,可以使用ID。
public final int play(int soundID, float leftVolume, float rightVolume,
int priority, int loop, float rate)
上面方法第一个参数就是声音的ID,第二个参数为左声道音量(最大值为1.0F),第三个参数为右声道音量,第四个参数为优先级,第五个参数为是否循环播放(0为不循环,-1为循环),第六个参数为播放速度(取值范围为0.5F-2.0F,正常值为1F)
这里给出一个简短的Demo
class SoundPoolActivity : AppCompatActivity() {
val pool = SoundPool(20, AudioManager.STREAM_SYSTEM, 5)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_sound_pool)
val id = pool.load(this, R.raw.sound, 1)
spPlay.setOnClickListener {
pool.play(id, 1F, 1F, 1, 0, 1F)
}
}
}