Android基于IJKPlayer視頻播放器簡單封裝設(shè)計
播放器的簡單設(shè)計
播放器基于IJKPlayer來設(shè)計的, 播放器大致分三層
1.播放內(nèi)核(基于ijkMediaplayer)
2.播放器View
3.播放器的MediaController
1、封裝播放內(nèi)核
我們都知道需要播放一個視頻需要三個過程 1.create MediaPlayer 2.MediaPlayer prepare 3.MediaPlayer 與 Surface 綁定
xinvideoplayer中使用了VideoManager來控制ijkmediaplayer 所有的操作
三個過程 我們使用 HandlerThread + Hander 來實現(xiàn) 第一個過程創(chuàng)建大致可能需要100ms左右,嚴(yán)重影響UI線程?。?!
第一個過程: create MediaPlayer
new IjkMediaPlayer() 設(shè)置一些播放器回調(diào)方法
//IJK 的 Mediaplayer api 類似 Android 系統(tǒng)播放器api //IMediaPlayer.class public interface IMediaPlayer{ void setOnPreparedListener(IMediaPlayer.OnPreparedListener var1); //prepareAsync 之后回調(diào)方法 void setOnCompletionListener(IMediaPlayer.OnCompletionListener var1); //播放完成回調(diào)方法 void setOnBufferingUpdateListener(IMediaPlayer.OnBufferingUpdateListener var1);//當(dāng)播放網(wǎng)絡(luò)的數(shù)據(jù)流的buffer發(fā)生變化的時候 void setOnSeekCompleteListener(IMediaPlayer.OnSeekCompleteListener var1);//當(dāng)seek定位操作完成后 void setOnVideoSizeChangedListener(IMediaPlayer.OnVideoSizeChangedListener var1);//當(dāng)視頻的大小第一次被知道或者發(fā)生改變時 void setOnErrorListener(IMediaPlayer.OnErrorListener var1);//當(dāng)有發(fā)生錯誤 void setOnInfoListener(IMediaPlayer.OnInfoListener var1);//當(dāng)有信息或者警告 void setOnTimedTextListener(IMediaPlayer.OnTimedTextListener var1); //當(dāng)媒體的時間數(shù)據(jù)需要被顯示 }
第二個階段 prepare
mediaPlayer.prepareAsync(); 等待回調(diào) IMediaPlayer.OnPreparedListener#onPrepare()
第三個階段 給IJKMediaPlayer 綁定 Surface 呈現(xiàn)畫面
mediaPlayer.setSurface();
2、播放器View
實現(xiàn) 播放器基本方法(IViewPlayer)和 播放內(nèi)核回調(diào)方法(IMediaPlayerListener)
IMediaPlayerListener 是包裝 IMediaPlayer 所有接口并通過 Handle 發(fā)送到主線程中實現(xiàn)
//IVideoPlayer.java interface IVideoPlayer{ void start();//開始播放 void pause();//暫停播放 void seekTo(long time); //seekto time void release();//關(guān)閉播放 void setVideoPath();//設(shè)置視頻路徑 void onStartFullScreen();//全屏播放 void onBackFullScreen(); //退出全屏 void onResumeVideo();//播放器后臺喚起 void onPauseVideo();//切換后臺 int getCurrentState();//視頻的當(dāng)前狀態(tài) int getCurrentScreenState(); //當(dāng)前屏幕的狀態(tài) 例如小屏,大屏,豎屏 long getTcpSpeed();//獲取網(wǎng)速 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(); }
以上接口大致滿足了所有播放器的功能要求?。?/p>
3.MediaController
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()
播放器的簡單接入使用
videoplayer.setVideoPath(url); videoplayer.start();//開始播放 //如果需要后臺暫停喚起繼續(xù)播放 videoplayer.onVideoResume(); videoplayer.onVideoPause(); //如果需要后臺暫停喚起繼續(xù)播放 全屏?xí)r控制返回鍵問題: if (!VideoPlayerUtils.onBackPressed()) { //返回的正常邏輯 } ...
播放器的內(nèi)部實現(xiàn)
預(yù)加載需求 & 復(fù)用播放器
智能后臺&喚起處理
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android4.4下MediaProvider無法向外置SD卡中文件寫數(shù)據(jù)的解決方法
這篇文章主要介紹了Android4.4下MediaProvider無法向外置SD卡中文件寫數(shù)據(jù)的解決方法,實例分析了Android4.4下針對讀寫限制的修改技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10Android利用animation-list實現(xiàn)幀動畫
這篇文章主要為大家詳細介紹了Android利用animation-list實現(xiàn)幀動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12Android自定義Gallery控件實現(xiàn)3D圖片瀏覽器
這篇文章主要介紹了Android自定義Gallery控件實現(xiàn)3D圖片瀏覽器,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04Android 中 requestWindowFeature()的應(yīng)用
本文主要介紹 Android requestWindowFeature()方法,這里對 requestWindowFeature()方法進行詳解,對應(yīng)用程序窗體顯示狀態(tài)的操作有進一步了解,希望能幫助有需要的小伙伴2016-07-07Android開發(fā)ThreadPoolExecutor與自定義線程池詳解
這篇文章主要為大家介紹了Android開發(fā)ThreadPoolExecutor與自定義線程池詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11ubuntu用wifi連接android調(diào)試程序的步驟
這篇文章主要介紹了ubuntu用wifi連接android調(diào)試程序的步驟,需要的朋友可以參考下2014-02-02關(guān)于AndroidStudio新建與編譯項目速度慢解決辦法
這篇文章主要介紹了關(guān)于AndroidStudio新建與編譯項目速度慢的解決辦法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10