项目中使用阿里云sdk点播 基础版播放视频,找了一遍竟然没找到官方的具体使用文档,好在有先前资料加本身思考,实现了阿里云+surfaceview 来进行窗口和全屏播放。
我的实现思路是窗口是一个surfaceview,全屏时隐藏一个充满屏幕的surfaceview 并充满屏幕。
下面是代码:
private SurfaceHolder.Callback mCallback;
private SurfaceView surface_view;
private SurfaceHolder mHolder;
首先在成员变量中声明surfaceview 相关组件,当然这里两个surfaceview的都需要
public void init() {
initView();
initCallBack();
mHolder.addCallback(mCallback);
FullmHolder.addCallback(mCallback);
initData();
}
``
两个surfaceview 使用一个 mCallback 就可以。
``
private void initCallBack() {
mCallback = new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
Glide.with(WarIntroduceActivity.this).load(R.drawable.gif_video_loading).into(new GlideDrawableImageViewTarget(iv_warload, 50));
if (mPlayer == null) {
if (ISFULLSCREEN) {
LogUtils.e("AliVcMediaPlayer进入了方法surfaceCreated :+" + ISFULLSCREEN);
mPlayer = new AliVcMediaPlayer(WarIntroduceActivity.this, sv_full_view);
} else {
LogUtils.e("AliVcMediaPlayer进入了方法surfaceCreated :+" + ISFULLSCREEN);
mPlayer = new AliVcMediaPlayer(WarIntroduceActivity.this, surface_view);
}
mPlayer.setMediaType(MediaPlayer.MediaType.Vod);//设置视频类型:点播
mPlayer.setCirclePlay(false);//视频循环播放
//设置渲染模式 全屏播放
mPlayer.setVideoScalingMode(MediaPlayer.VideoScalingMode.VIDEO_SCALING_MODE_SCALE_TO_FIT);
mPlayer.setPlayingCache(true, sdDir, 60, 300);
if (!TextUtils.isEmpty(videoUrl)) {
mPlayer.prepareToPlay(videoUrl);
}
} else {
if (ISFULLSCREEN) {
LogUtils.e("进入了方法surfaceCreated :+" + ISFULLSCREEN);
mPlayer.setVideoSurface(FullmHolder.getSurface());
if (ISBACKGROUD) {
mHandler.sendEmptyMessageDelayed(BACKGROUDPAUSE, 100);
}
} else {
LogUtils.e("进入了方法surfaceCreated :+" + ISFULLSCREEN);
mPlayer.setVideoSurface(mHolder.getSurface());
if (ISBACKGROUD) {
mHandler.sendEmptyMessageDelayed(BACKGROUDPAUSE, 100);
}
}
}
//设置最大缓存单个最大时长一分钟,缓存目录总大小300M
mPlayer.setPreparedListener(new MediaPlayer.MediaPlayerPreparedListener() {//准备完成
@Override
public void onPrepared() {
mPlayer.play();
iv_play_big.setVisibility(View.VISIBLE);
iv_warload.setVisibility(View.GONE);
isLoadready = true;
LogUtils.e("setPreparedListener");
mHandler.sendEmptyMessageDelayed(PAUSEPLAY, 150);
}
});
mPlayer.setVideoSizeChangeListener(new MediaPlayer.MediaPlayerVideoSizeChangeListener() {
@Override
public void onVideoSizeChange(int i, int i1) {
}
});
mPlayer.setErrorListener(new MediaPlayer.MediaPlayerErrorListener() {
@Override
public void onError(int i, String s) {
runOnUiThread(new Runnable() {
@Override
public void run() {
switch (i) {
case 4003:
ToastUtil.showShortToast(s);
break;
case 4018:
ToastUtil.showShortToast(s);
break;
case 4019:
ToastUtil.showShortToast(s);
break;
case 4004:
ToastUtil.showShortToast(s);
break;
case 4005:
ToastUtil.showShortToast(s);
break;
case 4008:
ToastUtil.showShortToast(s);
break;
}
}
});
}
});
mPlayer.setStoppedListener(new MediaPlayer.MediaPlayerStoppedListener() {//停止播放监听
@Override
public void onStopped() {
}
});
mPlayer.setCompletedListener(new MediaPlayer.MediaPlayerCompletedListener() {//播放完成
@Override
public void onCompleted() {
if (NetUtil.isNetConnected(WarIntroduceActivity.this)) {
mPlayer.prepareToPlay(videoUrl);
playpause();
} else {//网络不可用
ToastUtil.showLongToast(getResources().getString(R.string.tv_nothing_net));
}
LogUtils.e("setCompletedListener");
}
});
mPlayer.setInfoListener(new MediaPlayer.MediaPlayerInfoListener() {
@Override
public void onInfo(int i, int i1) {
}
});
mPlayer.setFrameInfoListener(new MediaPlayer.MediaPlayerFrameInfoListener() {//首帧显示
@Override
public void onFrameInfoListener() {
LogUtils.e("mPlayersetFrameInfoListener");
mHandler.sendEmptyMessageDelayed(UPDATE_PROGRESS, 300);
}
});
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mPlayer != null) {
LogUtils.e("销毁了surfaceDestroyed :+" + ISFULLSCREEN);
}
}
};
}
在callback中初始化AliVcMediaPlayer,具体为什么我也不太清楚。
需要监听横屏和竖屏改变时 做一些操作
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
if (mPlayer.isPlaying()) {
iv_play_big_full.setVisibility(View.GONE);
iv_player_simle_full.setImageResource(R.drawable.war_pause_smile);
} else {
iv_play_big_full.setVisibility(View.VISIBLE);
iv_play_big_full.setImageResource(R.drawable.war_player);
iv_player_simle_full.setImageResource(R.drawable.war_palyer_simle);
mPlayer.setVideoSurface(FullmHolder.getSurface());
mPlayer.play();
mHandler.sendEmptyMessageDelayed(PAUSEPLAY, 150);
}
ISFULLSCREEN = true;
rl_full.setVisibility(View.VISIBLE);
sv_full_view.setVisibility(View.VISIBLE);
surface_view.setVisibility(View.GONE);
rl_head.setVisibility(View.GONE);
sL_content.setVisibility(View.GONE);
hideActionBar();
mHandler.sendEmptyMessageDelayed(FULLSEEKGONE, 3000);
LogUtils.e("onConfigurationChanged进入了方法surfaceCreated :+" + ISFULLSCREEN);
} else {
if (mPlayer.isPlaying()) {
iv_play_big.setVisibility(View.GONE);
iv_player_simle.setImageResource(R.drawable.war_pause_smile);
} else {
iv_play_big.setVisibility(View.VISIBLE);
iv_play_big.setImageResource(R.drawable.war_player);
mPlayer.setVideoSurface(mHolder.getSurface());
mPlayer.play();
mHandler.sendEmptyMessageDelayed(PAUSEPLAY, 100);
}
iv_play_big_full.setVisibility(View.GONE);
ISFULLSCREEN = false;
rl_head.setVisibility(View.VISIBLE);
sL_content.setVisibility(View.VISIBLE);
rl_full.setVisibility(View.GONE);
sv_full_view.setVisibility(View.GONE);
surface_view.setVisibility(View.VISIBLE);
showActionBar();
LogUtils.e("onConfigurationChanged进入了方法surfaceCreated :+" + ISFULLSCREEN);
}
}
这里写的比较乱,主要是需求一直变 就没有改,大概就是一些横屏竖屏一些显示隐藏的操作。
特别注意mPlayer.setVideoSurface(FullmHolder.getSurface());每次切换时要重新绑定你要使用的surfaceview,还有surfaceview的显示隐藏得单独来处理,隐藏父类布局是没有用得。
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // 手动竖屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // 手动横屏
最后附上手动横竖屏方法 ,记得在mainfest.xml文件中配置activity
android:configChanges="orientation|keyboardHidden|screenSize"
当然我这种方法可能只是适应单个页面单个视频,如果你的视频列表recyclerView 来滚动切换全屏得可能需要别的办法,我还没有试。据说会有显示错位的问题。
了解还有使用fragment来实现切换全屏的操作,听起来更靠谱些,不知道哪位有没有相关实践过。
网友评论