Android基于IJKPlayer視頻播放器簡單封裝設(shè)計(jì)
播放器的簡單設(shè)計(jì)
播放器基于IJKPlayer來設(shè)計(jì)的, 播放器大致分三層
1.播放內(nèi)核(基于ijkMediaplayer)
2.播放器View
3.播放器的MediaController
1、封裝播放內(nèi)核
我們都知道需要播放一個(gè)視頻需要三個(gè)過程 1.create MediaPlayer 2.MediaPlayer prepare 3.MediaPlayer 與 Surface 綁定
xinvideoplayer中使用了VideoManager來控制ijkmediaplayer 所有的操作
三個(gè)過程 我們使用 HandlerThread + Hander 來實(shí)現(xiàn) 第一個(gè)過程創(chuàng)建大致可能需要100ms左右,嚴(yán)重影響UI線程!??!
第一個(gè)過程: 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ā)生變化的時(shí)候
void setOnSeekCompleteListener(IMediaPlayer.OnSeekCompleteListener var1);//當(dāng)seek定位操作完成后
void setOnVideoSizeChangedListener(IMediaPlayer.OnVideoSizeChangedListener var1);//當(dāng)視頻的大小第一次被知道或者發(fā)生改變時(shí)
void setOnErrorListener(IMediaPlayer.OnErrorListener var1);//當(dāng)有發(fā)生錯(cuò)誤
void setOnInfoListener(IMediaPlayer.OnInfoListener var1);//當(dāng)有信息或者警告
void setOnTimedTextListener(IMediaPlayer.OnTimedTextListener var1); //當(dāng)媒體的時(shí)間數(shù)據(jù)需要被顯示
}
第二個(gè)階段 prepare
mediaPlayer.prepareAsync(); 等待回調(diào) IMediaPlayer.OnPreparedListener#onPrepare()
第三個(gè)階段 給IJKMediaPlayer 綁定 Surface 呈現(xiàn)畫面
mediaPlayer.setSurface();
2、播放器View
實(shí)現(xiàn) 播放器基本方法(IViewPlayer)和 播放內(nèi)核回調(diào)方法(IMediaPlayerListener)
IMediaPlayerListener 是包裝 IMediaPlayer 所有接口并通過 Handle 發(fā)送到主線程中實(shí)現(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();//播放器后臺(tái)喚起
void onPauseVideo();//切換后臺(tái)
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();
}
以上接口大致滿足了所有播放器的功能要求??!
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();//開始播放
//如果需要后臺(tái)暫停喚起繼續(xù)播放
videoplayer.onVideoResume();
videoplayer.onVideoPause();
//如果需要后臺(tái)暫停喚起繼續(xù)播放
全屏?xí)r控制返回鍵問題:
if (!VideoPlayerUtils.onBackPressed()) {
//返回的正常邏輯
}
...
播放器的內(nèi)部實(shí)現(xiàn)

預(yù)加載需求 & 復(fù)用播放器

智能后臺(tái)&喚起處理

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于android中的各種顏色在drawable.xml中的值詳解
本篇文章是對(duì)在android中的各種顏色在drawable.xml中的值進(jìn)行了詳細(xì)的介紹。需要的朋友參考下2013-05-05
android表格效果之ListView隔行變色實(shí)現(xiàn)代碼
首先繼承SimpleAdapter再使用重載的Adapter來達(dá)到效果,其實(shí)主要是需要重載SimpleAdapter,感興趣的朋友可以研究下,希望本文可以幫助到你2013-02-02
Android編程實(shí)現(xiàn)基于局域網(wǎng)udp廣播自動(dòng)建立socket連接的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)基于局域網(wǎng)udp廣播自動(dòng)建立socket連接的方法,涉及Android使用udp廣播實(shí)現(xiàn)socket通訊的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
Android Handler內(nèi)存泄漏詳解及其解決方案
在android開發(fā)過程中,我們可能會(huì)遇到過令人奔潰的OOM異常,這篇文章主要介紹了Android Handler內(nèi)存泄漏詳解及其解決方案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
Android解析json數(shù)據(jù)示例代碼(三種方式)
本篇文章主要介紹了Android解析json數(shù)據(jù)示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03
Kotlin Channel處理多個(gè)數(shù)據(jù)組合的流
最近項(xiàng)目中對(duì) kotlin 的使用比較多。不得不說 kotlin 確實(shí)可以極大的提高 android 的開發(fā)效率,channel用于協(xié)程之間的通訊,使用send和receive往通道里寫入或者讀取數(shù)據(jù),2個(gè)方法為非阻塞掛起函數(shù),channel是熱流,不管有沒有訂閱者都會(huì)發(fā)送2022-11-11
Android 官推 kotlin-first 的圖片加載庫——Coil的使用入門
這篇文章主要介紹了Android 官推 kotlin-first 的圖片加載庫——Coil的使用入門,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-04-04

