美文网首页
二、Android视频框架PlayerBase#BaseVide

二、Android视频框架PlayerBase#BaseVide

作者: YongtaoHuang | 来源:发表于2019-09-21 17:47 被阅读0次

上一篇:https://www.jianshu.com/p/65fcb769f8da

下一篇:https://www.jianshu.com/p/58a5e8b439aa

BaseVideoView概述

BaseVideoView内部主要包含两个部分:(1)播放器内核AVPlayer;(2)视图容器Supercontainer。


VideoView.png
public class BaseVideoView extends FrameLayout implements IVideoView, IStyleSetter {
    final String TAG = "BaseVideoView";
    // 播放器内核
    private AVPlayer mPlayer;
    // 所有播放视图的容器,包含所有覆盖层
    private SuperContainer mSuperContainer;
}

主要类与接口关系图:


PlayerBaseAll.png

BaseVideoView使用方法

xml源码:

    <com.kk.taurus.playerbase.widget.BaseVideoView
        android:id="@+id/baseVideoView"
        android:layout_width="match_parent"
        android:layout_height="250dp"
        android:background="#000000"/>

java源码:

public class MyVideoViewActivity extends AppCompatActivity {

    private BaseVideoView mVideoView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_video_view);
        mVideoView = findViewById(R.id.myBaseVideoView);
        DataSource dataSource = new DataSource(DataUtils.VIDEO_URL_09);
        dataSource.setTitle("音乐和艺术如何改变世界");
        mVideoView.setDataSource(dataSource);
        mVideoView.start();
    }

}

BaseVideoView 类实现接口IVideoView:

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();
    }
}

如何将BasePlayer负载在BaseVideoView的Supercontainer

这就是播放器的渲染过程,将变化剧烈的数据(视频数据)频繁地在界面上刷新,绑定SurfaceView或者TextureView上。接口IPlayer定义了setDiaplay方法,不同的播放器有不同的实现方法。

public class ExoMediaPlayer extends BaseInternalPlayer {
    private SimpleExoPlayer mInternalPlayer;
    @Override
    public void setDisplay(SurfaceHolder surfaceHolder) {
        mInternalPlayer.setVideoSurfaceHolder(surfaceHolder);
        submitPlayerEvent(OnPlayerEventListener.PLAYER_EVENT_ON_SURFACE_HOLDER_UPDATE, null);
    }
}
// =========================================
public class IjkPlayer extends BaseInternalPlayer {
    @Override
    public void setDisplay(SurfaceHolder surfaceHolder) {
        try {
            if(available()){
                mMediaPlayer.setDisplay(surfaceHolder);
                submitPlayerEvent(OnPlayerEventListener.PLAYER_EVENT_ON_SURFACE_HOLDER_UPDATE, null);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
// =========================================
// 上述的类的setDisplay都实现了接口IPlayer的setDisplayer方法
public interface IPlayer {
    void setDisplay(SurfaceHolder surfaceHolder);
}

上述的类的setDisplay都实现了接口IPlayer的setDisplayer方法。

相关文章

网友评论

      本文标题:二、Android视频框架PlayerBase#BaseVide

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