Android --- 多媒体应用(SoundPool播放音频)

如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:


1) 延时时间较长,且资源占用率高。
2) 不支持多个音频同时播放。
Android中除了MediaPlayer播放音频之外还提供了SoundPool来播放音效,SoundPool使用音效池的概念来管理多个短促的音效,例如它可以开始就加载20个音效,以后在程序中按音效
的ID进行播放。


SoundPool主要用于播放一些较短的声音片段,与MediaPlayer相比,SoundPool的优势在于CPU资源占用量低和反应延迟小。另外,SoundPool还支持自行设置声音的品质、音量、 播放 比率等参数。


使用SoundPool播放音频的步骤如下:

1,创建SoundPool对象

SoundPool(int maxStreams,int streamType,int srcQuality)
//其中,maxStreams用来指定可以容纳多少个音频,streamType用来指定声音类型,可以通过AudioManager类提供的常量进行指定,通常使用STREAM_MUSIC; srcQuality参数用于指定音频的品质,0为默认


2.加载所要播放的音

Public int load(Context context,int resid,int priority)
//用于通过指定的资源来加载音频,返回soundID,用于播放使用

Public int load(String path,int priority)
//用于通过音频文件的路径来加载音频,返回soundID,用于播放使用

Public int load(AssetFileDescriptor afd,int priority)
//用于从AssetFileDescriptor所对应的文件中加载音频,返回soundID,用于播放使用

Public int load(FileDescriptor fd,long offset,long length,int priority)
//用于加载FileDescriptor对象中,从offset开始,长度为length的音频,返回soundID,用于播放使用

3、播放音频

play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
//参数说明:
//参数 描述
//soundID 用于指定要播放的音频,该音频为通过load()方法返回的音频soundID
//leftVolume 用于指定左声道的音量,取值为0-1.0
//rightVolume 用于指定左声道的音量,取值为0-1.0
//priority 用于指定播放音频的优先级,数值越大,优先级越高
//loop 用于设置循环次数0为不循环-1为循环
//rate 用于指定速率,1为正常,最小值为0.5 最高值为2

作为测试的代码

package com.xykj.mediaplayerdemo;

import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import java.util.HashMap;
import java.util.Map;

public class SoundPoolActivity extends AppCompatActivity implements View.OnClickListener {
    //存放声音资源的Map
    private Map<Integer, Integer> soundMap;

    private SoundPool mSoundPool;
    //音频管理器
    private AudioManager am;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sound_pool);
        findViewById(R.id.btn1).setOnClickListener(this);
        findViewById(R.id.btn2).setOnClickListener(this);
        findViewById(R.id.btn3).setOnClickListener(this);
        findViewById(R.id.btn4).setOnClickListener(this);
        findViewById(R.id.btn5).setOnClickListener(this);
        findViewById(R.id.btn6).setOnClickListener(this);
        findViewById(R.id.btn7).setOnClickListener(this);
        initSoundPool();
        //加载系统音频管理器
        am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    }

    private void initSoundPool() {
        //初始化SoundPool(声音数量,类型,质量)
        mSoundPool = new SoundPool(7, AudioManager.STREAM_MUSIC, 100);

        // 初始化资源
        soundMap = new HashMap<>();
        //load方法表示加载音频资源(Context对象,音频资源,优先级)
        soundMap.put(1, mSoundPool.load(this, R.raw.c4, 1));
        soundMap.put(2, mSoundPool.load(this, R.raw.d4, 1));
        soundMap.put(3, mSoundPool.load(this, R.raw.e4, 1));
        soundMap.put(4, mSoundPool.load(this, R.raw.f4, 1));
        soundMap.put(5, mSoundPool.load(this, R.raw.g4, 1));
        soundMap.put(6, mSoundPool.load(this, R.raw.a4, 1));
        soundMap.put(7, mSoundPool.load(this, R.raw.b4, 1));
    }

    private void play(int index){
        //获取当前音量
        float currentVolumn = am.getStreamVolume(AudioManager.STREAM_MUSIC);
        //最大音量
        float maxVolumn = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);  // 100
        float volumn = currentVolumn/maxVolumn;
        /**
         * 第一个参数表示音频的下标
         * 第二个参数和第三个参数表示左右声道(0,1)
         * 第四个参数表示优先级
         * 第五个参数表示是否需要循环,-1表示循环,0表示不循环
         * 第六个参数表示 rate:0.5-2.0 其中1表示正常
         */
        mSoundPool.play(index,volumn,volumn,1,0,1.0f);
    }

    @Override
    public void onClick(View v) {
        String str = ((Button)v).getText().toString();
        int index = Integer.parseInt(str);
        play(index);
    }
}

七个资源包是音频 do、re 、mi、fa、so、la、si

可以做一个钢琴的键设置监听来实现弹奏钢琴的demo


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值