日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Android音視頻開發之MediaPlayer使用教程_Android

作者:JulyYu ? 更新時間: 2022-06-07 編程語言

MediaPlayer

Android多媒體框架支持播放提供了MediaPlayerAPI,可以通過MediaPlayer來實現媒體文件播放。可以說MediaPlayer是非常方便使用的多媒體播放器,只需要簡單設置就能實現對音頻和視頻播放功能,其內部幫助開發者實現了播放對象獲取解碼以及播放功能。

簡單使用

MediaPlayer支持多種資源形式:本地資源、內部URI、外部網址。

//播放器實例化
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()是異步操作需要在回調setOnPreparedListener方法了解最終播放器準備結果然后再執行播放操作。當然播放器也支持同步準備prepare方法,但推薦使用異步操作,因為資源獲取過程可能會涉及到解碼數據會是耗時操作,同步操作很有可能造成ANR錯誤。

缺陷

MediaPlayer雖然有內部狀態,某些操作只有在特定狀態下正確操作才能生效。若在非指定狀態下操作或許會導致播放器發生異常更有可能發生崩潰的情況。但播放器的內部狀態機并沒有暴露接口給開發者,無法隨時能夠獲取到目前播放器當前狀態。

AndroidMediaPlayer播放器封裝

因為缺陷原因直接使用MediaPlayer就不能很好的去管理狀態。因此可以自行對MediaPlayer進行封裝使用,可以將功能進行整理并且增加狀態管理和方便錯誤統一處理等邏輯。

狀態機編寫

根據MediaPlayer狀態圖預設幾種狀態類型以暫存播放器內部狀態。

private static final int IDLE = 0; // 空閑狀態
private static final int INIT = 3;// 初始化狀態
private static final int PREPARING = 4;// 準備狀態
private static final int PREPARED = 5;// 準備狀態
private static final int STARTED = 6;// 開始狀態
private static final int PAUSED = 7;// 暫停狀態
private static final int STOPPED = 8;// 停止狀態

private static final int END = 9; // 結束狀態
private static final int ERROR = 10;// 錯誤狀態

內部類

使用mPlayerStatus暫存播放器狀態

@IntDef({IDLE,
        END,
        ERROR,
        INIT,
        PREPARED,
        STARTED,
        PAUSED,
        STOPPED,
})
public @interface STATUS {
}

MediaPlayer mMediaPlayer;
Context mContext;
@STATUS
int mPlayerStatus = IDLE;

初始化函數

初始化函數實例化播放器并注冊基本播放所需要的回調函數

public AndroidMediaPlayer(Context context) {
    mContext = context;
    mMediaPlayer = new MediaPlayer();
    mMediaPlayer.setOnErrorListener(this);
    mMediaPlayer.setOnCompletionListener(this);
    mMediaPlayer.setOnPreparedListener(this);
    mPlayerStatus = INIT;
}

方法和回調

封裝播放器基礎方法可供播放調用并且進行狀態機判斷,若不在可操作范圍內則不可執行對應操作。同時對于資源設置方法通過原生api可以看到有許多在形式,但這里就只是用URI來做入參了。

//資源入參
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;
    }
}
// 錯誤回調
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
    mPlayerStatus = ERROR;
    return false;
}
// 播放回調
@Override
public void onCompletion(MediaPlayer mp) {

}
// 準備成功回調
@Override
public void onPrepared(MediaPlayer mp) {
    mPlayerStatus = PREPARED;
}

小結

MediaPlayer作為官方提供封裝的播放器在使用上并沒有什么難度,可以說開發者直接開箱即用。或許對于簡單開發視頻播放已經足夠了,能夠播放本地文件或是網絡文件等都能支持。但對于深入理解MediaPlayer可能還遠遠不夠,后續去讀讀源碼來了解內部實現。之后要自行實現編解碼來播放音視頻等能力去處理和添加其他效果的時候,那時MediaPlayer或許就捉襟見肘了。

原文鏈接:https://juejin.cn/post/7083140590636007460

欄目分類
最近更新