Android多媒体---SoundPool

来源:互联网 发布:显微镜图像测量软件 编辑:程序博客网 时间:2024/06/10 15:14

soundpool适用于播放提示音(短促、密集),短信提示音,电话嘟嘟提示音等
这种提示音如果再用ediaplayer就有些不合适了,Mediaplayer占用资源多,延迟时间长,不支持多个音频一起播放。
soundpool使用音效池,可以开始就加载20多个音效然后在程序中按照音效的ID进行播放。
soundpool有个构造器指定了支持多少个声音、声音的品质等(音效池):
SoundPool(int maxStreams,int streamType,int srcQuality)第一个参数指定支持多少个声音;第二个参数指定声音类型;第三个参数指定声音品质。
soundpool资源中用量低,反应延迟小,还支持自行设置品质、音量、播放比率等
soundpool提供了如下四个load方法:

  • int load(Context context,int resId,int priority):从resid对应的文件中加载声音
  • int load(FileDescriptor fd,long offset,long length,int priority):加载fd所对应的文件的offset开始、长度为length的 声音
  • int load(AssetFileDescriptor afd,int priority):从afd对应的文件中加载声音
  • int load(String path,int priority):从path对应的文件中加载声音

上面四个方法中都有一个priority参数,这个参数至今还没什么作用建议设置为1,保持过河未来兼容性。
soundpool播放声音的方法:

    int play(int soundID,float leftVolume,float rightVolume,int priority,int loop,float rate):第一个参数指定播放那个声音;float leftVolume,float rightVolume指定左右音量;priority是优先级;loop是否循环,0不循环,-1循环;rate指播放比率,0.5~2,1为正常

归纳使用步骤:
1)创建soundpool对象
2)使用load方法加载声音,最好使用HashMap< Integer,Integer>来管理声音
3)调用play方法播放
实例:
在res下新建文件夹raw,然后把提示音拷贝到这个文件夹下
写一个方法使用load用于返回声音的ID

private int soundPool(){    if (Build.VERSION.SDK_INT>21){//21版本之前使用new,之后使用builder        SoundPool.Builder builder=new SoundPool.Builder();        builder.setMaxStreams(2);//最多两个soundpool        AudioAttributes.Builder attrbuilder=new AudioAttributes.Builder();        attrbuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC);        builder.setAudioAttributes(attrbuilder.build());        pool=builder.build();    }else {        pool=new SoundPool(2,AudioManager.STREAM_MUSIC,0);    }    return pool.load(getApplicationContext(),R.raw.outgoing,1);}

在onCreate中调用方法soundpool()初始化play的第一个参数

protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    mBtn_play= (Button) findViewById(R.id.button_play);    mBtn_play.setOnClickListener(this);    voiceID=soundPool();}

在按钮操作中调用play()方法启动播放,因为初始化load需要时间,所以onCreate就load,点击事件进行播放不会有延迟

public void onClick(View v) {    switch (v.getId()){        case R.id.button_play:            voiceID= pool.play(voiceID, 1,1,0,-1,1);            break;    }
0 0
原创粉丝点击