最近在做视频播放的项目,找了一些网上的第三方开源库,找来找去发现还是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横竖比,具体细节下面会提到。 做好了上面的工作就可以在代码中调用了
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" />
|