說到音頻,在android中有兩種方法可是實現(xiàn):SoundPool以及MediaPlaer。通過這兩個類都可以實現(xiàn)在android設備上播放音頻。
那這兩個類有什么區(qū)別呢?
SoundPool
- SoundPool適合一些短促、比較小的音頻,比如通知鈴聲、字母或數(shù)字的單音頻等。
- SoundPool可以批量預加載資源,得到資源id,根據(jù)資源id來播放音頻(啟動延遲短)。
- SoundPool播放完成后沒有回調。
MediaPlayer
- MediaPlayer可以播放一些比較長的音樂
- MediaPlayer啟動延遲高,不適合播放短小間隔小的音頻,比如字母與數(shù)字單音頻組成的提示音。
- MediaPlayer有播放狀態(tài)的回調。
SoundPool播放音頻的用法
首先加載資源得到sound ID,再根據(jù)sound ID來播放音頻。
加載音頻一般有下面幾種方法(一般使用前面三種方法):
1.public int load(Context context, int resId, int priority)
2.public int load(String path, int priority)
3.public int load(AssetFileDescriptor afd, int priority)
4.public int load(FileDescriptor fd, long offset, long length, int priority)
加載資源后,load方法會返回一個sound ID,根據(jù)這個ID可以調用SoundPool的play方法來播放音頻資源:
/*
* @param soundID 加載資源得到的id
* @param leftVolume 音量
* @param rightVolume 音量
* @param 音頻流優(yōu)先級
* @param loop 循環(huán) 0 不循環(huán) -1 無限循環(huán)
* @param rate 播放速率 1.0 正常速率(0.5-2.0)
* @return 成功返回id,否則為0
*/
public final int play(int soundID, float leftVolume, float rightVolume,
int priority, int loop, float rate)
由于soundpool沒有播放完成的回調方法,那么我們怎么在一個音頻播放完成之后去播放下一個或者做其他處理呢?
我的方處理法是:在播放前計算出音頻的時長,播放音頻后,再該時長之后做相應的處理,該時間間隔可以比音頻時長略長。
最后在不使用的情況下記得調用soundPool.release()方法釋放資源。
MediaPlayer播放音頻的用法
MediaPlayer只需創(chuàng)建對象,然后將音頻的path或者uri傳入就可以了。
MediaPlayer mediaPlayer= new MediaPlayer();
mediaPlayer.setDataSource(mConext, uri);
mediaPlayer.prepare();
mediaPlayer.start();
或者使用path:
mediaPlayer.setDataSource(path);
也可以更簡單直接使用create方法傳入path或者uri得到MediaPlayer對象:
public static MediaPlayer create(Context context, Uri uri){...}
當然有很多的傳參方式,具體參考文檔。MediaPlayer 提供了很多的播放狀態(tài)接口,比如OnPreparedListener、OnCompletionListener、OnBufferingUpdateListener、OnErrorListener等等。只需在創(chuàng)建對象之后傳入監(jiān)聽對象就可以了,例如:
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
}
});
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
return false;
}
});
在回調接口里面就可以處理你的具體業(yè)務啦。
當然現(xiàn)在github上也有很多音頻播放的開源項目,大家可以根據(jù)自己的需求去參考使用O(∩_∩)O哈哈~。