游戏开发中音效技术

1.MediaPlay与SoundPool

MediaPlay会占用大量的系统资源,而且播放时还需要进行缓冲,有较大的延时,MediaPlay无法实现即时音效。
SoundPool将声音资源加载到内存中,然后在需要的时候进行即时播放,几乎没有延时。对于同一个音效文件,在不改变其时长的情况下,
可以采用降低采样率或由立体声改成单声道的方式来缩小体积。

 

SoundPool实例:

public class SoundPoolActivity extends Activity {
    /** Called when the activity is first created. */
 private SoundPool sp;
 private HashMap<Integer,Integer> hm;
 int currStreamId;
 private Button start ,stop;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        iniSoundPool();
       
        start=(Button)findViewById(R.id.startButton);
        stop=(Button)findViewById(R.id.stopButton);
        start.setOnClickListener(new OnClickListener(){

   @Override
   public void onClick(View v) {
    playSound(1,0);
    Toast.makeText(getApplicationContext(), "播放音效", Toast.LENGTH_SHORT).show();
    
   }
        });
       
        stop.setOnClickListener(new OnClickListener(){

   @Override
   public void onClick(View v) {
    sp.stop(currStreamId);
    Toast.makeText(getApplicationContext(), "停止播放", Toast.LENGTH_SHORT).show();
    
   }
         
        });
    }
 private void iniSoundPool() {
  sp = new SoundPool(2,AudioManager.STREAM_MUSIC,0);
  hm=new HashMap<Integer,Integer>();
  hm.put(1, sp.load(this, R.raw.musictest,1));
 }
 
 private void playSound(int sound, int loop) {
  AudioManager am=(AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
  float streamVolumeCurrent=am.getStreamVolume(AudioManager.STREAM_MUSIC);
  float streamVolumeMax=am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
  float volume=streamVolumeCurrent/streamVolumeMax;
  currStreamId=sp.play(hm.get(sound), volume, volume, 1, loop, 1.0f);
 }
}

注:MediaPlay较适合做游戏背景音效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值