上一篇: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方法。
网友评论