上一篇:https://www.jianshu.com/p/029cd006e580
下一篇:https://www.jianshu.com/p/5ea3df94af12
主要类与接口关系图:

BaseVideoView类
BaseVideoView 类内含有一个播放器内核类,即AVPlayer。
public class BaseVideoView extends FrameLayout implements IVideoView, IStyleSetter {
private AVPlayer mPlayer;
private void init(Context context, AttributeSet attrs, int defStyleAttr) {
mPlayer = createPlayer();
//......
}
//create player instance.
private AVPlayer createPlayer(){
return new AVPlayer();
}
}
AVPlayer类
AVPlayer 类实现接口IPlayer,内含类BaseInternalPlayer。
public final class AVPlayer implements IPlayer{
private BaseInternalPlayer mInternalPlayer;
private int mDecoderPlanId; // 解码方式:0:MedioPlayer解码;1:IJK解码;2:EXO解码
// 构造函数,唯一输入就是解码方式
public AVPlayer(){
//default load config plan id.
this(PlayerConfig.getDefaultPlanId());
}
public AVPlayer(int decoderPlanId){
handleRecordProxy();
//init timer counter proxy.
mTimerCounterProxy = new TimerCounterProxy(1000);
//init internal player instance.
loadInternalPlayer(decoderPlanId);
}
// 从配置文件加载解码方式
private void loadInternalPlayer(int decoderPlanId) {
mDecoderPlanId = decoderPlanId;
//if internal player not null, destroy it.
destroy();
//loader decoder instance from config.
mInternalPlayer = PlayerLoader.loadInternalPlayer(decoderPlanId);
if(mInternalPlayer==null)
throw new RuntimeException(
"init decoder instance failure, please check your configuration" +
", maybe your config classpath not found.");
DecoderPlan plan = PlayerConfig.getPlan(mDecoderPlanId);
if(plan!=null){
PLog.d(TAG,"=============================");
}
}
}
BaseInternalPlayer抽象类
抽象类BaseInternalPlayer实现接口IPlayer,被IjkPlayer、ExoMediaPlayer和SysMediaPlayer继承。
public abstract class BaseInternalPlayer implements IPlayer {
-> public class IjkPlayer extends BaseInternalPlayer {
-> public class ExoMediaPlayer extends BaseInternalPlayer {
-> public class SysMediaPlayer extends BaseInternalPlayer {
IPlayer 接口
public interface IPlayer {
int STATE_END = -2;
int STATE_ERROR = -1;
int STATE_IDLE = 0;
int STATE_INITIALIZED = 1;
int STATE_PREPARED = 2;
int STATE_STARTED = 3;
int STATE_PAUSED = 4;
int STATE_STOPPED = 5;
int STATE_PLAYBACK_COMPLETE = 6;
void option(int code, Bundle bundle);
void setDataSource(DataSource dataSource);
void setDisplay(SurfaceHolder surfaceHolder);
void setSurface(Surface surface);
void setVolume(float left, float right);
void setSpeed(float speed);
void setOnPlayerEventListener(OnPlayerEventListener onPlayerEventListener);
void setOnErrorEventListener(OnErrorEventListener onErrorEventListener);
void setOnBufferingListener(OnBufferingListener onBufferingListener);
int getBufferPercentage();
boolean isPlaying();
int getCurrentPosition();
int getDuration();
int getAudioSessionId();
int getVideoWidth();
int getVideoHeight();
int getState();
void start();
void start(int msc);
void pause();
void resume();
void seekTo(int msc);
void stop();
void reset();
void destroy();
}
选择解码器:
public static final int DEFAULT_PLAN_ID = 0; // 0:MedioPlayer解码
public static final int PLAN_ID_IJK = 1; // 1:IJK解码
public static final int PLAN_ID_EXO = 2; // 2:EXO解码
和配置解码器有关的类:PlayerLoader、PlayerConfig和DecoderPlan。
PlayerConfig.setDefaultPlanId(App.PLAN_ID_IJK); // 选择了IJK解码
网友评论