美文网首页
三、Android视频框架PlayerBase#AVPlayer

三、Android视频框架PlayerBase#AVPlayer

作者: YongtaoHuang | 来源:发表于2019-09-23 10:15 被阅读0次

上一篇:https://www.jianshu.com/p/029cd006e580

下一篇:https://www.jianshu.com/p/5ea3df94af12

主要类与接口关系图:


PlayerBaseAll.png

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解码

相关文章

网友评论

      本文标题:三、Android视频框架PlayerBase#AVPlayer

      本文链接:https://www.haomeiwen.com/subject/mereuctx.html