前言
目前视频相关或者需要播放视频的 App 比较多,很多都要求能够在普通界面或者列表界面播放视频,并且能够全屏播放,这里选择 JieCaoVideoPlayer ,据我了解,在 github 上面出现简单集成就能集成列表、全屏、小屏播放的,最早的就是 JieCaoVideoPlayer,使用了一年多,还是很不错,虽然后面也出现了类似的控件,也都或多或少借鉴了 JieCaoVideoPlayer 。
JieCaoVideoPlayer (节操)
github 地址:JieCaoVideoPlayer
注意:有人在 github 上面搜到其他人的 JieCaoVideoPlayer,上面的才是最正宗的。
节操作者:Nathen,现实中不认识,在群里能看见他发言,这个开源项目是以前从事视频相关的工作总结出来的,虽然后来没有从事视频相关的工作,但是还是坚持为大家更新并且解决问题,在此说声谢谢。
使用方法 (先介绍 github 上面写的方法和部分技巧,接着介绍我自己总结)
- 中文文档 , 按照文档中的5个步骤集成。
- wiki,这个文档看的人比较少,有的比较简单的问题,作者都在 wiki 中写好了的,建议可以看看。不过作者也有段时间没有更新 wiki 了,不过大部分还是实用。
- issues 特殊问题解决方案,除了在群里问,还可以在这里去搜,毕竟在群里问别人遇到别人忙的时候也不可能随时为你解决问题。
- 上面的方法也是我们使用 github 上面三方项目的通用步骤,当然也可以去谷歌。
使用入门
这里的方法是我在上面的几步中整理出来的,和作者的有点不同,有的是自己添加的。
1、 导包
- 依赖:
compile 'fm.jiecao:jiecaovideoplayer:latest version'
这种方式最简单, latest version 需要换成最新版本。 - jar包:各版本下载地址
- module: 在 github 上面下载源代码以module 的方式导入,这种灵活性高,可以随意改成我们想要的效果。
2、 在layout 中使用
<fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard
android:id="@+id/videoplayer"
android:layout_width="match_parent"
android:layout_height="200dp"/>
这里的高度是指组合控件的高度,不一定是显示中视频的高度,视频的高度和宽度按照比例 16:9 和 4:3 显示。比如有时候设置为500dp,但是视频只显示了300dp,其余的部分为黑屏,所以要想去掉黑屏,需要提前准确的知道视频的宽高,如果是用户上传的视频,在上传的时候一般需要同时上传视频文件、视频宽高参数、视频封面(封面的宽高与视频宽高一致,封面一般为视频截图,如果是自己添加的封面,尽量设置为视频宽高或者和视频宽高比相同,不同的话在显示封面的时候可能会出现拉伸变形)。
3、继承 AppCompatActivity
在Activity 、Fragment 中使用,因为在 JCVideoPlayerStandard 中使用了 AppCompatActivity 中的相关代码,所以在使用的 Activity 或者 fragment 依附的 Activity 必须继承 AppCompatActivity,不然在全屏的时候会出现空指针。 如果 Activity 已经继承了其他 Activity 且不是 AppCompatActivity,通过module 的方式修改源码也可以使用。
4、代码使用
JCVideoPlayerStandard videoplayer= (JCVideoPlayerStandard) findViewById(R.id.videoplayer);
videoplayer.setUp(videoUrl , JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL, "视频标题");
ImageLoader.with(context)
.load(pictureUrl)
.into(videoplayer.thumbImageView);
setup 方法 public void setUp(String url, int screen, Object... objects)
,第二个参数为进入视频显示的方式,目前一个有4个选项可选:
public static final int SCREEN_LAYOUT_NORMAL = 0; //正常模式
public static final int SCREEN_LAYOUT_LIST = 1; //列表模式
public static final int SCREEN_WINDOW_FULLSCREEN = 2; //全屏模式
public static final int SCREEN_WINDOW_TINY = 3; //小屏模式
videoplayer.thumbImageView 为封面View ,使用 glide 或者 Picasso 直接使用,如果使用的 fresco ,可以参照作者的 demo JCVideoPlayerStandardFresco ,记得在布局文件需要将 thumbImageView 对应的 ImageView 改成 SimpleDraweeView。
5、 拦截返回键事件(Activity 和 fragment)
作用:视频全屏的时候点击返回键退出全屏
- Activity 中
@Override
public void onBackPressed() {
if (JCVideoPlayer.backPress()) {
return;
}
super.onBackPressed();
}
着只是其中一种拦截返回键监听方法
- Fragment 中
@Override
public void onResume() {
super.onResume();
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
if (JCVideoPlayer.backPress()) {
return true;
}
return false;
}
return false;
}
});
}
也是其中一种方法
6、回收资源 releaseAllVideos
Activity 和 Fragment 中都可以在 onpause 方法中执行,如
@Override
protected void onPause() {
super.onPause();
JCVideoPlayer.releaseAllVideos();
}
7、AndroidManifest 的设置
<activity
android:name="yourActivityName"
android:configChanges="orientation|screenSize|keyboardHidden"
android:hardwareAccelerated="true"
android:screenOrientation="portrait" /> <!-- or android:screenOrientation="landscape"-->
上面的参数主要说说 hardwareAccelerated,其余自行查询,因为在节操视频中使用了 TextureView,在TextureView 源码中有这样一段代码
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (!isHardwareAccelerated()) {
Log.w(LOG_TAG, "A TextureView or a subclass can only be "+ "used with
hardware acceleration enabled.");
}
if (mHadSurface) {
invalidate(true);
mHadSurface = false;
}
}
TextureView 或者它的子类只能在 开启硬件加速中使用,虽然说默认是开启硬件加速,但是有的可能在application 中使用了
android:hardwareAccelerated="false"
加上Android 各个厂商的碎片化,建议加上启动硬件加速,这就是很多人说在使用中出现一直转圈圈的原因之一。
总结
对于简单的播放视频,直接使用上面的几步基本能够解决问题,很是方便,但是出现部分视频黑屏的问题,留在下一篇文章,这篇文章算是视频系列的开篇,后面会有 节操视频源码分析、以及实现类似微博、QQ空间自动播放、播放完一个自动滑动到下一个视频继续播放等等。
还有一个它的兄弟版本 GSYVideoPlayer 的相关使用,其实作者也讲的很清楚了。这里感谢各位为开源做出的贡献。