播放器的簡單設計
播放器基于IJKPlayer來設計的, 播放器大致分三層
1.播放內核(基于ijkMediaplayer)
2.播放器View
3.播放器的MediaController
1、封裝播放內核
我們都知道需要播放一個視頻需要三個過程 1.create MediaPlayer 2.MediaPlayer prepare 3.MediaPlayer 與 Surface 綁定
xinvideoplayer中使用了VideoManager來控制ijkmediaplayer 所有的操作
三個過程 我們使用 HandlerThread + Hander 來實現 第一個過程創建大致可能需要100ms左右,嚴重影響UI線程!!!
第一個過程: create MediaPlayer
new IjkMediaPlayer() 設置一些播放器回調方法
1
2
3
4
5
6
7
8
9
10
11
12
|
//IJK 的 Mediaplayer api 類似 Android 系統播放器api //IMediaPlayer.class public interface IMediaPlayer{ void setOnPreparedListener(IMediaPlayer.OnPreparedListener var1); //prepareAsync 之后回調方法 void setOnCompletionListener(IMediaPlayer.OnCompletionListener var1); //播放完成回調方法 void setOnBufferingUpdateListener(IMediaPlayer.OnBufferingUpdateListener var1); //當播放網絡的數據流的buffer發生變化的時候 void setOnSeekCompleteListener(IMediaPlayer.OnSeekCompleteListener var1); //當seek定位操作完成后 void setOnVideoSizeChangedListener(IMediaPlayer.OnVideoSizeChangedListener var1); //當視頻的大小第一次被知道或者發生改變時 void setOnErrorListener(IMediaPlayer.OnErrorListener var1); //當有發生錯誤 void setOnInfoListener(IMediaPlayer.OnInfoListener var1); //當有信息或者警告 void setOnTimedTextListener(IMediaPlayer.OnTimedTextListener var1); //當媒體的時間數據需要被顯示 } |
第二個階段 prepare
mediaPlayer.prepareAsync(); 等待回調 IMediaPlayer.OnPreparedListener#onPrepare()
第三個階段 給IJKMediaPlayer 綁定 Surface 呈現畫面
mediaPlayer.setSurface();
2、播放器View
實現 播放器基本方法(IViewPlayer)和 播放內核回調方法(IMediaPlayerListener)
IMediaPlayerListener 是包裝 IMediaPlayer 所有接口并通過 Handle 發送到主線程中實現
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
//IVideoPlayer.java interface IVideoPlayer{ void start(); //開始播放 void pause(); //暫停播放 void seekTo( long time); //seekto time void release(); //關閉播放 void setVideoPath(); //設置視頻路徑 void onStartFullScreen(); //全屏播放 void onBackFullScreen(); //退出全屏 void onResumeVideo(); //播放器后臺喚起 void onPauseVideo(); //切換后臺 int getCurrentState(); //視頻的當前狀態 int getCurrentScreenState(); //當前屏幕的狀態 例如小屏,大屏,豎屏 long getTcpSpeed(); //獲取網速 void switchVideoSource(String url, long delay); //切換清晰度 并流暢的切換 } public interface MediaPlayerListenerextends IVideoPlayer{ void onPrepared(); void onAutoCompletion(); void onCompletion(); void onBufferingUpdate( int percent); void onSeekComplete( long currentPosition); void onError( int what, int extra); void onInfo( int what, int extra); void onVideoSizeChanged(); } |
以上接口大致滿足了所有播放器的功能要求!!
3.MediaController
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public interface IVideoController{ //顧名思義 ViewbindPlayer(IVideoPlayer player); void onChangeVideoStatus(IVideoPlayer player, int old_status, int new_status); void onChangeScreenStatus(IVideoPlayer player, int old_status, int new_status); boolean onChangedNetWork( int currentNetState); void onVideoProgress( int percent, long curr_position, long duration); void unbindPlayer(IVideoPlayer player); boolean isLock(); void onVideoDefinitionSwitched(); void show(); void hide(); boolean isShowing(); |
BaseVideoPlayer#setVideoController()
播放器的簡單接入使用
1
2
3
4
5
6
7
8
9
10
11
|
videoplayer.setVideoPath(url); videoplayer.start(); //開始播放 //如果需要后臺暫停喚起繼續播放 videoplayer.onVideoResume(); videoplayer.onVideoPause(); //如果需要后臺暫停喚起繼續播放 全屏時控制返回鍵問題: if (!VideoPlayerUtils.onBackPressed()) { //返回的正常邏輯 } ... |
播放器的內部實現
預加載需求 & 復用播放器
智能后臺&喚起處理
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://www.zdong.top/blog/2018/05/02/視頻播放器設計/