Android 多媒体应用——SoundPool音频播放

  SoundPool也是Android提供的一种播放音频的方式,但是它与MediaPlayer是不同的。我们来看一下SoundPool与MediaPlayer的不同:
MediaPlayer:
1. MediaPlayer一般用于播放比较大的音频文件。
2. MediaPlayer播放音频文件占用资源较高,延迟的时间较长。
3. MediaPlayer不支持多个音频的播放。
SoundPool:
1. 一般用于播放密集,短促的音频,一般播放提示音。
2. SoundPool可支持播放多个音频文件。
3. 支持自行设置音频的品质0和播放比率。
4. SoundPool播放音频资源占用小,时间延迟小。

  SoundPool是使用音效池来管理音频文件的,因此支持多个音频同时播放。我们来看一下SoundPool的使用……

SoundPool

1. 创建SoundPool的对象。
  这里需要注意,在API21以前和以后是使用不同的方法来获得SoundPool的对象的,因此我们要进行版本的判断。
API21以前:
  直接使用构造器SoundPool(int maxStreams, int streamType, int srcQuality)获得SoundPool的对象。构造器要传入是三个参数,第一个是支持播放的音频的数量;第二个参数是播放的音频的类型;第三个参数是音乐的品质,这个一般默认为0。
API21以后:
   通过SoundPool.Builder获得 SoundPool的对象。API以后更改后创建对象变得比较麻烦。
1). 首先获得SoundPool.Builder对象。
2). 通过SoundPool.Builder对象调用setMaxStreams(int maxStreams)方法设置支持播放的音频的数量。
3). 通过SoundPool.Builder对象调用setAudioAttributes(AudioAttributes attributes)方法设置音乐的类型。
   这里传入了一个AudioAttributes 的对象,所以我们应该获得AudioAttributes 对象。AudioAttributes对象要通过AudioAttributes.Builder来获得。

AudioAttributes.Builder audioAttributesBuilder = new AudioAttributes.Builder();
audioAttributesBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC);
AudioAttributes aa = audioAttributesBuilder.build();

4). 通过SoundPool.Builder对象调用build()方法获得SoundPool对象。

2. 导入音频文件。
  这里针对不同的资源文件,有不同的加载方式。

load(AssetFileDescriptor afd, int priority)

load(Context context, int resId, int priority)

load(String path, int priority)

load(FileDescriptor fd, long offset, long length, int priority)
  
  使用以上方法加载音频后返回的int型的id,我们用HashMap存储这些id对声音进行管理。
3. 调用play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)方法播放声音。
  这里提供了6个参数:soundID是指我们调用load方法后获得的id,通过这个id来选择调用的方法;leftVolume和rightVolume是指左右的音量;priority是指优先级,数值越大,优先级越高,默认为0;loop是指是否循环播放,0为不循环,-1为循环;rate是指声音的播放比率。

  我们来看具体的应用……

SoundPool的使用

  我们通过点击按钮来播放提示音。

public class MainActivity extends Activity  implements View.OnClickListener{
    private Button mButtonSoundPool;
    private SoundPool pool;
    private int id;

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButtonSoundPool= (Button) findViewById(R.id.button_soundpool);
        mButtonSoundPool.setOnClickListener(this);

        //由于提示音的加载时需要时间的,因此我们将其放在onCreate方法中
        int version = Build.VERSION.SDK_INT;
        if(version>21){
            SoundPool.Builder builder = new SoundPool.Builder();
            builder.setMaxStreams(2);
            //设置声音的类型
            AudioAttributes.Builder audioAttributesBuilder = new AudioAttributes.Builder();
            audioAttributesBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC);
            AudioAttributes aa = audioAttributesBuilder.build();
            builder.setAudioAttributes(aa);
            pool = builder.build();
        }else {
            //第一个参数是最大声音数,第二个参数是声音的类型,第三个参数是声音的品质。
            pool = new SoundPool(2, AudioManager.STREAM_MUSIC,  0);
        }
        id =  pool.load(getApplicationContext(), R.raw.outgoing, 1);

    }
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button_soundpool:
                pool.play(id, 1, 1, 0, -1, 1);
        }
    }
}
SoundPool类是Android中一个用于播放音频的类,它可以实现快速加载音频资源并进行播放。下面是使用SoundPool播放音频文件的方法的实验小结: 1. 创建SoundPool对象 首先需要创建一个SoundPool对象,可以使用SoundPool的构造函数进行创建。例如,可以使用以下代码创建一个SoundPool对象: ``` SoundPool soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0); ``` 其中,第一个参数表示SoundPool对象的最大容量,第二个参数表示使用的音频流类型,第三个参数表示音频品质,可以设置为0。 2. 加载音频资源 在播放音频之前,需要将音频资源加载到SoundPool中。可以使用SoundPool的load方法进行加载。例如,加载一个名为sound1的音频资源: ``` int soundId = soundPool.load(context, R.raw.sound1, 1); ``` 其中,第一个参数表示上下文对象,第二个参数表示音频资源的ID,第三个参数表示优先级。 3. 播放音频 加载音频资源后,可以使用SoundPool的play方法进行播放。例如,播放上一步加载的音频资源: ``` soundPool.play(soundId, 1, 1, 0, 0, 1); ``` 其中,第一个参数表示音频资源的ID,第二个参数表示左声道音量,第三个参数表示右声道音量,第四个参数表示优先级,第五个参数表示循环次数(0表示不循环,-1表示无限循环),第六个参数表示播放速度。 4. 释放资源 最后,需要在不使用SoundPool时释放资源,可以使用SoundPool的release方法进行释放。例如: ``` soundPool.release(); ``` 以上就是使用SoundPool播放音频文件的方法的实验小结。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小_爽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值