Android 节操播放器 JCVideoPlayer视频播放器

最近在做视频播放的项目,找了一些网上的第三方开源库,找来找去发现还是JCVideoPlayer还算好用些,网上讲解 JCVideoPlayer 的也不少,废话少说,开始上代码
首先要在项目的app的 build.gradle中 引入JCVideoPlayer库

    implementation 'fm.jiecao:jiecaovideoplayer:5.5.2'

在activity的xml文件中加入JCVideoPlayer控件

        <fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard
            android:id="@+id/jcvideoView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerInParent="true" />

如果想要视频框有圆角效果,还可以在外层加cardview

            <android.support.v7.widget.CardView
                android:id="@+id/my_item_cardview_jcvideo"
                app:cardBackgroundColor="@color/color_1D1E24"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="15dp"
                android:layout_marginTop="10dp"
                android:visibility="gone"
                app:cardCornerRadius="8dp"
                app:cardElevation="0dp">

                <fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard
                    android:layout_width="200dp"
                    android:layout_height="200dp"
                    android:visibility="gone"
                    android:id="@+id/itemjcvideoView"/>

            </android.support.v7.widget.CardView>

这里有个坑要先说一下,如果不在代码里设置widthRatio和heightRatio 想放大jcvideoView是不可能的,即使你已经设置了 android:layout_height=“match_parent”, jcvideoView还是会保持默认的16:9横竖比,具体细节下面会提到。
做好了上面的工作就可以在代码中调用了

		/**
		*参数url为网络视频的播放路径
		*第二个参数为播放模式,SCREEN_LAYOUT_NORMAL //普通模式
		*					  SCREEN_LAYOUT_LIST  //与普通模式相同
		*                    SCREEN_WINDOW_FULLSCREEN//全屏模式
		*                   SCREEN_WINDOW_TINY//没有了 播放控制视图
		* 
		*第三个参数为视频标题
		*/
        jcvideoView.setUp(url, JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL, "") 
        jcvideoView.startVideo() //启动播放

播放效果如下
在这里插入图片描述

此时可以看到即使已经设置了 android:layout_height=“match_parent” 高度还是不变 这是因为代码中 默认保持横纵比16:9

下面是JCVideoPlayer.java 源码中代码片段

    public int widthRatio = 16;
    public int heightRatio = 9;

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (currentScreen == SCREEN_WINDOW_FULLSCREEN || currentScreen == SCREEN_WINDOW_TINY) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            return;
        }
        if (widthRatio != 0 && heightRatio != 0) {
            int specWidth = MeasureSpec.getSize(widthMeasureSpec);
            int specHeight = (int) ((specWidth * (float) heightRatio) / widthRatio);
            setMeasuredDimension(specWidth, specHeight);

            int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(specWidth, MeasureSpec.EXACTLY);
            int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(specHeight, MeasureSpec.EXACTLY);
            getChildAt(0).measure(childWidthMeasureSpec, childHeightMeasureSpec);
        } else {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }

    }

所以我们要把widthRatio 和 heightRatio 设置为0才可以设置成自己想要的尺寸

        jcvideoView.widthRatio = 0
        jcvideoView.heightRatio = 0

还有一个需要注意的点,JCVideoPlayer视频播放器会默认保持播放进度,即使activity已经销毁,如果你想要下次进入activity从头开始播放要先清除下进度

        JCUtils.saveProgress(context, url, 0)

还可以为jcvideoView 设置未播放时缩略图 通过设置 jcvideoView.thumbImageView就可以,下面我是通过glide来实现的

        showImg(jcvideoView.thumbImageView,url!!)

    fun showImg(iv: ImageView, url: String) {
        Glide.with(this@PlayActivity)
                .applyDefaultRequestOptions(RequestOptions().placeholder(if (TextUtils.isEmpty(SkinCompatManager.getInstance().curSkinName)) R.drawable.drawable_default_tmpry else R.drawable.drawable_default_tmpry_night)
                        .error(if (TextUtils.isEmpty(SkinCompatManager.getInstance().curSkinName)) R.drawable.drawable_default_tmpry else R.drawable.drawable_default_tmpry_night)
                        .frame(1000)
                        .signature(ObjectKey(url))
                )
                .asBitmap()
                .load(url)
                .error(Glide.with(this@PlayActivity)
                        .applyDefaultRequestOptions(RequestOptions()
                                .signature(ObjectKey(if (url.contains("?")) url.substring(0, url.indexOf("?")) else url)))
                        .asBitmap()
                        .load(if (url.contains("?")) url.substring(0, url.indexOf("?")) else url))
                .into(iv)
    }

JCVideoPlayerStandard默认有全屏模式,但是对横屏视频和竖屏视频的自适应不太好,只会自动全屏,并不会旋转屏幕,除非你旋转手机(全屏模式下默认开启屏幕旋转,即使已经提前关闭屏幕旋转功能),竖屏视频还好会自动全屏,横屏视频就会如下图:

在这里插入图片描述
这里我是通过重写全屏按钮的监听事件来实现的

        jcvideoView.fullscreenButton.setOnClickListener(View.OnClickListener {
            val videoWidth = JCMediaManager.instance().mediaPlayer.videoWidth
            val videoHeight = JCMediaManager.instance().mediaPlayer.videoHeight
            if (videoWidth >= videoHeight) {
                JCUtils.getAppCompActivity(jcvideoView.getContext()).requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
            } else {
                JCUtils.getAppCompActivity(jcvideoView.getContext()).requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
            }
            if (jcvideoView.currentState == JCVideoPlayer.CURRENT_STATE_AUTO_COMPLETE) return@OnClickListener
            if (jcvideoView.currentScreen == JCVideoPlayer.SCREEN_WINDOW_FULLSCREEN) {
                JCVideoPlayer.backPress()
            } else {
                jcvideoView.onEvent(JCUserAction.ON_ENTER_FULLSCREEN)
                jcvideoView.startWindowFullscreen()
            }
        })

首先获取视频分辨率,感谢 JCVideoPlayer 所有关键方法和属性都是public的,让库拓展成为了可能,
得到videoWidth和videoHeight ,判断是横屏视频还是竖屏视频,来提前设置旋转属性。 代码很简单基本一看就懂。

修改完的效果
在这里插入图片描述

本来到这就已经结束了,谁让安卓手机品牌多呢,有些手机在全屏旋转屏幕的时候还会旋转失败
这个属性一定不要忘screenSize,有些品牌手机不加就不行

        <activity
            android:name=".PlayActivity"
            android:launchMode="singleTask"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:screenOrientation="portrait" />

版权声明:本文为yuxuehandong原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。