Android 播放器(RN也可使用)實現 實現方案講解

拆解需求 1. RN使用 2. 播放器

最終實現的播放器功能:可以提供給RN使用,不帶邊緩存邊播放功能的播放器。

1. RN使用實現

以組件的形式提供給RN使用,至於組件和native如何交互,主要通過重寫RN的ViewGroupManager<T>實現。泛型傳入的就是RN組件包裝的native內部實現的播放器的view(player view)。

RN組件向native通信:

重寫receiveCommand方法,此方法帶有參數palyer view,commandId(RN到native的映射關係通過重寫getCommandsMap建立)args(攜帶數據)。

拿到player view實例,我們就可以根據具體的命令,調用實例裏面的方法。如此就實現的RN調用native。

Native向RN通信:

主要是native的view與用戶發生交互,需要通知到RN。通知的實現是EventDispatcher,如何拿到player view並監聽player view裏面的事件呢?在createViewInstance方法裏面可以拿到player view,在view裏面設置監聽,回調方法中利用EventDispatcher通信RN。

RN如何向Native傳入初始化信息呢?比如控件的寬高。通過@ReactProp 註解的方式。

2. 簡單播放器的實現

使用源生MediaPlyaer實現的視頻播放,不帶有邊下邊播功能(如果是網絡視頻,會出現緩衝很久的情況)。

推薦封裝一個自己的MediaPlyaer,比如起名SelfMediaPlayer。以View的形式對外提供使用(內部聚合了SelfMediaPlayer)。

實現時,我們有些需要注意的地方有: 1. MediaPlayer狀態的管理 2. 注意收集mediaplayer上報信息並進行處理。3. 無論選擇SurfaceView還是TextureView,最好用一個FrameLayout包裹它。

MediaPlayer狀態的管理:

以實現對外提供的api start功能實現來說明。

@Override
public void start() {
    try{
        mediaPlayer.start();
    } catch(IllegalStateException e) {
        // invalid state
        // 這裏可以加入自己的處理邏輯,建議定個listener交給使用者確定ivalid錯誤處理邏輯。
    }
}

收集mediaplayer上報信息並進行處理:

mediaplayer通過一系列listener上報播放時的相關狀態信息。比如OnErrorListener監聽mediaplayer進入Error狀,OnPreparedListener監聽mediaplayer進入Prepared狀態。

MediaPlayer.OnErrorListener errorListener = new MediaPlayer.OnErrorListener() {
    public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {
        // The MediaPlayer has moved to the Error state, must be reset!
        // 代表進入錯誤狀態了,我們可以進行自己錯誤處理邏輯並同時給出interface讓使用者監聽
        // 這裏,我們也可以記錄下狀態,因爲error這個狀態很特殊,在進入到如此狀態後後續很多操作都不可用了,必須reset。
        return true;
    }
}

private MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener
            () {

        @Override
        public void onPrepared(MediaPlayer mp) {
            // 這裏可以記錄下prepared狀態,因爲很多操作的前提就是當前狀態是prepared
       }
    };

無論選擇SurfaceView還是TextureView,最好用一個FrameLayout包裹它

帶來的優點有很多,可以通過控制framelayout的大小實現間接控制SurfaceView大小。有了父容器的包裹之後,我們可以擴展一些定製化的view。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章