Android音視頻開發(fā)之MediaPlayer使用教程
MediaPlayer
Android多媒體框架支持播放提供了MediaPlayerAPI,可以通過MediaPlayer來實現(xiàn)媒體文件播放??梢哉fMediaPlayer是非常方便使用的多媒體播放器,只需要簡單設置就能實現(xiàn)對音頻和視頻播放功能,其內(nèi)部幫助開發(fā)者實現(xiàn)了播放對象獲取解碼以及播放功能。
簡單使用
MediaPlayer支持多種資源形式:本地資源、內(nèi)部URI、外部網(wǎng)址。
//播放器實例化
mediaPlayer = new MediaPlayer();
//準備播放素材
Uri uri = Uri.fromFile(new File("sdcard/DCIM","Camera/test.mp4"));
try {
//播放器載入資源
mediaPlayer.setDataSource(this,uri);
} catch (IOException e) {
e.printStackTrace();
}
//播放器異步準備
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
//播放操作
mediaPlayer.start();
}
});
//播放窗口展示
SurfaceView surfaceView = new SurfaceView(this);
surfaceView.post(new Runnable() {
@Override
public void run() {
mediaPlayer.setSurface(surfaceView.getHolder().getSurface());
}
});以上代碼示例就是MediaPlayer簡單使用過程。其中prepareAsync()是異步操作需要在回調(diào)setOnPreparedListener方法了解最終播放器準備結果然后再執(zhí)行播放操作。當然播放器也支持同步準備prepare方法,但推薦使用異步操作,因為資源獲取過程可能會涉及到解碼數(shù)據(jù)會是耗時操作,同步操作很有可能造成ANR錯誤。
缺陷
MediaPlayer雖然有內(nèi)部狀態(tài),某些操作只有在特定狀態(tài)下正確操作才能生效。若在非指定狀態(tài)下操作或許會導致播放器發(fā)生異常更有可能發(fā)生崩潰的情況。但播放器的內(nèi)部狀態(tài)機并沒有暴露接口給開發(fā)者,無法隨時能夠獲取到目前播放器當前狀態(tài)。
AndroidMediaPlayer播放器封裝
因為缺陷原因直接使用MediaPlayer就不能很好的去管理狀態(tài)。因此可以自行對MediaPlayer進行封裝使用,可以將功能進行整理并且增加狀態(tài)管理和方便錯誤統(tǒng)一處理等邏輯。
狀態(tài)機編寫
根據(jù)MediaPlayer狀態(tài)圖預設幾種狀態(tài)類型以暫存播放器內(nèi)部狀態(tài)。
private static final int IDLE = 0; // 空閑狀態(tài) private static final int INIT = 3;// 初始化狀態(tài) private static final int PREPARING = 4;// 準備狀態(tài) private static final int PREPARED = 5;// 準備狀態(tài) private static final int STARTED = 6;// 開始狀態(tài) private static final int PAUSED = 7;// 暫停狀態(tài) private static final int STOPPED = 8;// 停止狀態(tài) private static final int END = 9; // 結束狀態(tài) private static final int ERROR = 10;// 錯誤狀態(tài)
內(nèi)部類
使用mPlayerStatus暫存播放器狀態(tài)
@IntDef({IDLE,
END,
ERROR,
INIT,
PREPARED,
STARTED,
PAUSED,
STOPPED,
})
public @interface STATUS {
}
MediaPlayer mMediaPlayer;
Context mContext;
@STATUS
int mPlayerStatus = IDLE;初始化函數(shù)
初始化函數(shù)實例化播放器并注冊基本播放所需要的回調(diào)函數(shù)
public AndroidMediaPlayer(Context context) {
mContext = context;
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setOnErrorListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnPreparedListener(this);
mPlayerStatus = INIT;
}方法和回調(diào)
封裝播放器基礎方法可供播放調(diào)用并且進行狀態(tài)機判斷,若不在可操作范圍內(nèi)則不可執(zhí)行對應操作。同時對于資源設置方法通過原生api可以看到有許多在形式,但這里就只是用URI來做入?yún)⒘恕?/p>

//資源入?yún)?
public void setSource(Uri uri){
try {
mMediaPlayer.setDataSource(mContext,uri);
mMediaPlayer.prepareAsync();
mPlayerStatus = PREPARING;
} catch (IOException e) {
e.printStackTrace();
}
}
// 設置可視化窗口
public void setSurface(Surface surface){
mMediaPlayer.setSurface(surface);
}
//開始播放
public void start(){
mMediaPlayer.start();
mPlayerStatus = STARTED;
}
//暫停
public void pause(){
if(mPlayerStatus > PAUSED) return;
mMediaPlayer.pause();
mPlayerStatus = PAUSED;
}
//停止
public void stop(){
if(mPlayerStatus > STOPPED) return;
mMediaPlayer.stop();
mPlayerStatus = STOPPED;
}
//釋放
public void release(){
if(mPlayerStatus >= INIT){
mMediaPlayer.release();
mMediaPlayer = null;
mPlayerStatus = END;
}
}
// 錯誤回調(diào)
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
mPlayerStatus = ERROR;
return false;
}
// 播放回調(diào)
@Override
public void onCompletion(MediaPlayer mp) {
}
// 準備成功回調(diào)
@Override
public void onPrepared(MediaPlayer mp) {
mPlayerStatus = PREPARED;
}小結
MediaPlayer作為官方提供封裝的播放器在使用上并沒有什么難度,可以說開發(fā)者直接開箱即用。或許對于簡單開發(fā)視頻播放已經(jīng)足夠了,能夠播放本地文件或是網(wǎng)絡文件等都能支持。但對于深入理解MediaPlayer可能還遠遠不夠,后續(xù)去讀讀源碼來了解內(nèi)部實現(xiàn)。之后要自行實現(xiàn)編解碼來播放音視頻等能力去處理和添加其他效果的時候,那時MediaPlayer或許就捉襟見肘了。
到此這篇關于Android音視頻開發(fā)之MediaPlayer使用教程的文章就介紹到這了,更多相關Android MediaPlayer內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解android在mob平臺實現(xiàn)qq登陸和分享
這篇文章主要介紹了詳解android在mob平臺實現(xiàn)qq登陸和分享,對接入第三方平臺SDK感興趣的同學們,可以參考下2021-04-04
Android 中SwipeRefreshLayout與ViewPager滑動事件沖突解決方法
這篇文章主要介紹了Android 中SwipeRefreshLayout與ViewPager滑動事件沖突解決方法的相關資料,需要的朋友可以參考下2017-04-04
webview添加參數(shù)與修改請求頭的user-agent實例
這篇文章主要介紹了webview添加參數(shù)與修改請求頭的user-agent實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Android編程學習之抽象類AbsListView用法實例分析
這篇文章主要介紹了Android編程學習之抽象類AbsListView用法,較為詳細的分析了抽象類AbsListView的功能、結構、定義及使用注意事項等,需要的朋友可以參考下2015-10-10

