Android之视频播放器<JiaoZiVideoPlayer>的使用及解决的问题

前言

根据项目要求 做一个淘宝今日头条的功能 要求实现图文视频的混排
在之前的博客中我已经写了头条滚动demo———今日头条的demo地址
这里写图片描述

就是这样的一个效果 点击这个控件后 进入↓↓↓头条的页面

这里写图片描述

这篇博客主要是记录视频的使用 关于文本的加载 请看我另一篇博客 Android 富文本

下面进入正题

第一步 导入依赖

github官方给出的地址是:

compile 'cn.jzvd:jiaozivideoplayer:6.2.12'

需要修改为:

implementation 'cn.jzvd:jiaozivideoplayer:6.2.12'

因为我用的android studio的版本已经超过3.0 compile已过期 如果不修改直接复制到自己的gradle中
会导致编译报错的 !
@至于为什么要修改compile为implementation
我去搜了一下 得到的答案是: 1. 加快编译速度。2. 隐藏对外不必要的接口。具体细节 自行搜索答案

说到这里 我不得不多说一下 自己在添加这个库的时候 还遇到了一个问题 也分享出来!
如果要用到这个视频播放的第三方控件 SDK版本必须大于15 也就是最低为16 下面我贴出自己的配置
其中minSdkVersion 16就是我改过的 如果你也遇到此问题 直接将minSdkVersion改为16即可编译通过

 defaultConfig {
        applicationId "com.jxty.app.garden"
        minSdkVersion 16
        targetSdkVersion TARGET_SDK_VERSION as int
        versionCode VERSION_CODE as int
        versionName VERSION_NAME
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng"]
    }
第二步 添加布局文件

自行根据需求来设置属性的

 <cn.jzvd.JZVideoPlayerStandard
        android:id="@+id/m_video"
        android:layout_width="0dp"
        android:layout_height="200dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
第三步 设置视频地址、缩略图地址、标题
JZVideoPlayerStandard videoPlayer; //视频播放器
TextView mTvExplain, mTvExplainDetails;//视频的标题和简介文本框

private void init() {     
        //初始化组件   
        videoPlayer = findViewById(R.id.m_video);        
        mTvExplain = findViewById(R.id.tv_explain);
        mTvExplainDetails = findViewById(R.id.tv_explain_details);
        for (int i = 0; i < headLineVideoList.size(); i++) {
            Article article = headLineVideoList.get(i);
            String videoUrl = article.getVideoUrl();//从后台返回的集合中 获取播放视频的Url
            //设置视频地址、缩略图地址、标题
            videoPlayer.setUp(videoUrl, JZVideoPlayerStandard.SCREEN_WINDOW_NORMAL, "锦绣田园");
            //设置视频的标题和简介文本框
            mTvExplain.setText(article.getTitle());
            videoDetails = article.getVideoSummary();
            //如果视频简介返回空 就取视频抬头
            mTvExplainDetails.setText(videoDetails.equals("") ? article.getTitle() : videoDetails);
        }
    }
第四步 执行暂停和返回时的调用

在包含播放器的Fragment或Activity的onPause()方法中调用JCVideoPlayer.releaseAllVideos()。相对应的生命周期里面要做相对应的操作:

 @Override
    public void onBackPressed() {
        if (JZVideoPlayer.backPress()) {
            return;
        }
        super.onBackPressed();
    }

    @Override
    protected void onPause() {
        super.onPause();
        JZVideoPlayer.releaseAllVideos();
    }

作为合格的码农一定要有一颗好奇心 看到这里的方法 我禁不起好奇 还是点进去看了一下源码
了解到JZVideoPlayer.backPress()原来是RxJava的背压概念

@何为背压?

  • 被观察者产生事件慢一些,观察者处理事件很快。那么观察者就会等着被观察者发送事件,(好比观察者在等米下锅,程序等待,这没有问题)。
  • 被观察者产生事件的速度很快,而观察者处理很慢。那就出问题了,如果不作处理的话,事件会堆积起来,最终挤爆你的内存,导致程序崩溃。(好比被观察者生产的大米没人吃,堆积最后就会烂掉)。

下面当暂停的时候 执行的方法JZVideoPlayer.releaseAllVideos()
只看字面意思,我们也能想到是释放资源的方法 我也点了进去 下面是源码
意思是如果 当前时间减去点击退出全屏时间的时间大于全屏正常延迟 即执行释放缓冲区的视频

if ((System.currentTimeMillis() - CLICK_QUIT_FULLSCREEN_TIME) > FULL_SCREEN_NORMAL_DELAY) {
            Log.d(TAG, "releaseAllVideos");
            JZVideoPlayerManager.completeAll();
            JZMediaManager.instance().positionInList = -1;
            JZMediaManager.instance().releaseMediaPlayer();
        }
第五步 在AndroidManifest.xml配置
 <activity
            android:name=".main.headline.HeadlineVideoActivity"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:screenOrientation="portrait" />

其中android:configChanges="orientation|screenSize|keyboardHidden"是横竖屏切换时,禁止activity重新创建
android:screenOrientation="portrait"限制此页面数竖屏显示

运行看效果

小屏幕播放

小屏幕

全屏后横屏的效果
横屏

细心的人会发现 进度条的在下面 有一个细条 当手触摸到屏幕 会弹出暂停返回按钮

写一个简单的东西 往往会遇到各种小的问题 在解决这些问题的同时 我们就学会了成长!
希望自己继续努力!!

猜你喜欢

转载自blog.csdn.net/life_s/article/details/80913132