1. 程式人生 > 程式設計 >android實現小音訊頻繁播放

android實現小音訊頻繁播放

android中多媒體檔案(音樂和視訊)的播放是用MediaPlayer方式是大家比較熟悉的,但是現在要來說一下另外一種音樂檔案播放的方式SoundPool,相比較而言,用MediaPlayer來播放音樂的話,佔用的系統資源是很多的,載入資源也需要時間,所以它不適合用來頻繁播放小音訊檔案,比如控制元件焦點、點選時需要播放小音訊檔案,這個時候用SoundPool來播放音訊檔案,比用MediaPlayer來播放效率要高很多。這裡也來說說,如果用MediaPlayer來播放小音訊檔案的話,會出現延時,點選了之後等會兒才出現聲音。所以,SoundPool比MediaPlayer更輕量級,適合用於頻繁播放的小音訊檔案。

下面就來說說它的用法:

第一步:放置目標音訊檔案

將音訊檔案放在res/raw目錄下,這樣就可以通過R來引用它了。如果想放在Assert目錄下也是可以的,這裡先放在raw下。

第二步:編寫音訊播放的類

public class MusicPlayer {
  private Context mContext ;
  private static MusicPlayer sInstance ;
  static class Type{
    public final static int MUSIC_CLICK = 1 ;
    public final static int MUSIC_FOCUSED = 2 ;
  }
  private SoundPool mSp ;
  private Map<integer,integer=""> sSpMap ;
  private MusicPlayer(Context context){
    mContext = context ;
    sSpMap = new TreeMap<integer,integer="">() ;
    mSp = new SoundPool(10,AudioManager.STREAM_MUSIC,100) ;
    sSpMap.put(Type.MUSIC_CLICK,mSp.load(mContext,R.raw.click,1)) ;
    sSpMap.put(Type.MUSIC_FOCUSED,R.raw.focused,1)) ;
  }
   
  public static MusicPlayer getInstance(Context context){
    if(sInstance == null)
      sInstance = new MusicPlayer(context) ;
    return sInstance ;
  }
   
  public void play(int type){
    if(sSpMap.get(type) == null) return ;
    mSp.play(sSpMap.get(type),1,1) ;
  }
}

第三步:呼叫介面,播放音訊

// 在介面上需要這樣呼叫
// 初始化
mMusic = MusicPlayer.getInstance(MainActivity.this) ;
// 在onClick中播放click時的聲音
mMusic.play(MusicPlayer.Type.MUSIC_CLICK) ;
// 在onFocusChange中聚焦狀態播放聚焦的聲音
mMusic.play(MusicPlayer.Type.MUSIC_FOCUSED) ;

如果想放在Assert中的話,要注意在引用音訊檔案時要用AssetFileDescriptor,具體方式如下:

MediaPlayer mMediaPlayer = new MediaPlayer() ; 
  AssetFileDescriptor fd = mContext.getAssets().openFd(“music/click.pm3”) ; // assert目錄下的music目錄
  mMediaPlayer.setDataSource(fd.getFileDescriptor(),fd.getStartOffset(),fd.getLength()) ;
  mMediaPlayer.prepare() ;
  mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer arg0) {
      mMediaPlayer.release() ;
    }
  }) ;
  mMediaPlayer.setOnErrorListener(new OnErrorListener() {
    @Override
    public boolean onError(MediaPlayer arg0,int arg1,int arg2) {
      mMediaPlayer.release() ;
      return false;
    }
  }) ;
mMediaPlayer.start() ;

注意:在用MediaPlayer時要記住釋放資源!在兩個回撥介面中實現。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。