說到音頻叭首,在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哈哈~丘薛。