目前视频相关或者需要播放视频的 App 比较多,很多都要求能够在普通界面或者列表界面播放视频,并且能够全屏播放,这里选择 JieCaoVideoPlayer ,据我了解,在 github 上面出现简单集成就能集成列表、全屏、小屏播放的,最早的就是 JieCaoVideoPlayer,使用了一年多,还是很不错,虽然后面也出现了类似的控件,也都或多或少借鉴了 JieCaoVideoPlayer 。
github 地址:JieCaoVideoPlayer
注意:有人在 github 上面搜到其他人的 JieCaoVideoPlayer,上面的才是最正宗的。
节操作者:Nathen,现实中不认识,在群里能看见他发言,这个开源项目是以前从事视频相关的工作总结出来的,虽然后来没有从事视频相关的工作,但是还是坚持为大家更新并且解决问题,在此说声谢谢。
使用方法 (先介绍 github 上面写的方法和部分技巧,接着介绍我自己总结)
这里的方法是我在上面的几步中整理出来的,和作者的有点不同,有的是自己添加的。
compile 'fm.jiecao:jiecaovideoplayer:latest version'
这种方式最简单, latest version 需要换成最新版本。.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard
android:id="@+id/videoplayer"
android:layout_width="match_parent"
android:layout_height="200dp"/>
这里的高度是指组合控件的高度,不一定是显示中视频的高度,视频的高度和宽度按照比例 16:9 和 4:3 显示。比如有时候设置为500dp,但是视频只显示了300dp,其余的部分为黑屏,所以要想去掉黑屏,需要提前准确的知道视频的宽高,如果是用户上传的视频,在上传的时候一般需要同时上传视频文件、视频宽高参数、视频封面(封面的宽高与视频宽高一致,封面一般为视频截图,如果是自己添加的封面,尽量设置为视频宽高或者和视频宽高比相同,不同的话在显示封面的时候可能会出现拉伸变形)。
在Activity 、Fragment 中使用,因为在 JCVideoPlayerStandard 中使用了 AppCompatActivity 中的相关代码,所以在使用的 Activity 或者 fragment 依附的 Activity 必须继承 AppCompatActivity,不然在全屏的时候会出现空指针。 如果 Activity 已经继承了其他 Activity 且不是 AppCompatActivity,通过module 的方式修改源码也可以使用。
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。
作用:视频全屏的时候点击返回键退出全屏
@Override
public void onBackPressed() {
if (JCVideoPlayer.backPress()) {
return;
}
super.onBackPressed();
}
着只是其中一种拦截返回键监听方法
@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;
}
});
}
也是其中一种方法
Activity 和 Fragment 中都可以在 onpause 方法中执行,如
@Override
protected void onPause() {
super.onPause();
JCVideoPlayer.releaseAllVideos();
}
<activity
android:name="yourActivityName"
android:configChanges="orientation|screenSize|keyboardHidden"
android:hardwareAccelerated="true"
android:screenOrientation="portrait" />
上面的参数主要说说 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 的相关使用,其实作者也讲的很清楚了。这里感谢各位为开源做出的贡献。