01. 优先介绍一下模拟器中没有声音的问题:
官方Demo中的内容较多,我这边按照自己的需求,做了个小DEMO,便于后期引用学习
-----------------------------------------
02. 依赖配置
1 //视频播放 2 implementation 'com.shuyu:GSYVideoPlayer:7.1.4' 3 //图像加载 4 implementation 'com.github.bumptech.glide:glide:4.12.0' 5 annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
03. 主页,做为不同视频播放效果的导航模块,内置多个Button, 用于演示不同效果 (实际内容查看相应的demo)
04. 常规使用模式
1 private void init() { 2 videoPlayer = (StandardGSYVideoPlayer) findViewById(R.id.video_player); 3 //视频资源配置 4 String source1 = "http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4"; 5 videoPlayer.setUp(source1, true, "测试视频"); 6 //增加封面 7 ImageView imageView = new ImageView(this); 8 imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 9 imageView.setImageResource(R.mipmap.xxx1); 10 videoPlayer.setThumbImageView(imageView); 11 //增加title 12 videoPlayer.getTitleTextView().setVisibility(View.VISIBLE); 13 //设置返回键 14 videoPlayer.getBackButton().setVisibility(View.VISIBLE); 15 //设置旋转 16 orientationUtils = new OrientationUtils(this, videoPlayer); 17 //设置全屏按键功能,这是使用的是选择屏幕,而不是全屏 18 videoPlayer.getFullscreenButton().setOnClickListener(new View.OnClickListener() { 19 @Override 20 public void onClick(View v) { 21 //Toast.makeText(videoPlayer.getContext(),"点击了全屏按钮",Toast.LENGTH_SHORT).show(); 22 orientationUtils.resolveByClick(); 23 } 24 }); 25 //是否可以滑动调整 26 videoPlayer.setIsTouchWiget(true); 27 //设置返回按键功能 28 videoPlayer.getBackButton().setOnClickListener(new View.OnClickListener() { 29 @Override 30 public void onClick(View v) { 31 //Toast.makeText(videoPlayer.getContext(),"点击了返回功能按钮",Toast.LENGTH_SHORT).show(); 32 onBackPressed(); 33 } 34 }); 35 //开始播放 36 videoPlayer.startPlayLogic(); 37 }
在APP不同状态,同步播放器相应的状态
1 @Override 2 protected void onPause() { 3 super.onPause(); 4 videoPlayer.onVideoPause(); 5 } 6 7 @Override 8 protected void onResume() { 9 super.onResume(); 10 videoPlayer.onVideoResume(); 11 } 12 13 @Override 14 protected void onDestroy() { 15 super.onDestroy(); 16 GSYVideoManager.releaseAllVideos(); 17 if (orientationUtils != null) 18 orientationUtils.releaseListener(); 19 } 20 21 @Override 22 public void onBackPressed() { 23 //先返回正常状态 24 if (orientationUtils.getScreenType() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { 25 videoPlayer.getFullscreenButton().performClick(); 26 return; 27 } 28 //释放所有 29 videoPlayer.setVideoAllCallBack(null); 30 super.onBackPressed(); 31 }
关于不同清晰度视频的配置
1 String source1 = "http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4"; 2 String name = "普通"; 3 SwitchVideoModel switchVideoModel = new SwitchVideoModel(name, source1); 4 5 String source2 = "http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f30.mp4"; 6 String name2 = "清晰"; 7 SwitchVideoModel switchVideoModel2 = new SwitchVideoModel(name2, source2); 8 9 String source3 = "https://res.exexm.com/cw_145225549855002"; 10 String name3 = "外史"; 11 SwitchVideoModel switchVideoModel3 = new SwitchVideoModel(name3, source3); 12 13 14 List<SwitchVideoModel> list = new ArrayList<>(); 15 list.add(switchVideoModel); 16 list.add(switchVideoModel2); 17 list.add(switchVideoModel3); 18 19 binding.videoPlayer.setUp(list, true, "测试视频");
关于广告内容项的配置
1 ArrayList<GSYSampleADVideoPlayer.GSYADVideoModel> urls = new ArrayList<>(); 2 //广告1 3 urls.add(new GSYSampleADVideoPlayer.GSYADVideoModel("http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4", 4 "", GSYSampleADVideoPlayer.GSYADVideoModel.TYPE_AD)); 5 //正式内容1 6 urls.add(new GSYSampleADVideoPlayer.GSYADVideoModel("http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4", 7 "正文1标题", GSYSampleADVideoPlayer.GSYADVideoModel.TYPE_NORMAL)); 8 //广告2 9 urls.add(new GSYSampleADVideoPlayer.GSYADVideoModel("http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4", 10 "", GSYSampleADVideoPlayer.GSYADVideoModel.TYPE_AD, true)); 11 //正式内容2 12 urls.add(new GSYSampleADVideoPlayer.GSYADVideoModel("http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f30.mp4", 13 "正文2标题", GSYSampleADVideoPlayer.GSYADVideoModel.TYPE_NORMAL)); 14 15 binding.adPlayer.setAdUp(urls, true, 0);
播放器相关功能配置
1 binding.adPlayer.setIsTouchWiget(true); 2 binding.adPlayer.setRotateViewAuto(false);//关闭自动旋转 3 binding.adPlayer.setLockLand(false); 4 binding.adPlayer.setShowFullAnimation(false); 5 binding.adPlayer.setNeedLockFull(true); 6 binding.adPlayer.setVideoAllCallBack(this); 7 binding.adPlayer.setLockClickListener(new LockClickListener() { 8 @Override 9 public void onClick(View view, boolean lock) { 10 if (orientationUtils != null) { 11 //配合下方的onConfigurationChanged 12 orientationUtils.setEnable(!lock); 13 } 14 } 15 });
04. 对于带广告播放器功能的扩展
在官方DEMO中,有带广告的视频播放,但原DEMO中都是直接可以跳过去的,
结合当前在线视频对广告内容的跳过规则,(非会员,必须看完广告, 或者 至少要看多少秒以后才能跳过广告)
基于这项需求,自行扩展了一个播放器类
1 public class MVideoPlayer extends GSYSampleADVideoPlayer { 2 3 public static final int tmpCanSkip=10; //10秒后可跳出广告 4 5 public MVideoPlayer(Context context, Boolean fullFlag) { 6 super(context, fullFlag); 7 } 8 9 public MVideoPlayer(Context context) { 10 super(context); 11 } 12 13 public MVideoPlayer(Context context, AttributeSet attrs) { 14 super(context, attrs); 15 } 16 17 @Override 18 protected void setProgressAndTime(int progress, int secProgress, int currentTime, int totalTime, boolean forceChange) { 19 super.setProgressAndTime(progress, secProgress, currentTime, totalTime, forceChange); 20 //控制 21 if (currentTime==0){ 22 mJumpAd.setVisibility(GONE); 23 } 24 if ((mJumpAd != null) && isAdModel && (currentTime>0) ) { 25 int passSeconds = currentTime/1000; 26 mJumpAd.setVisibility(passSeconds>=tmpCanSkip?VISIBLE:GONE); 27 } 28 } 29 }
--------------------------------------
没有找着上传附件的地方,后期引用时,可在电脑上搜索 DemoGSYVideoPlayer.zip