重点部分大家都懂了,我主要来说说这里面的坑 就是在播放有些视频 出现黑屏或者播放一半左右出现播放错错误问题,
出现的原因就是android本身是不支持解析fmpeg协议 所以你以moudle形式集成到你的项目中,然后再修改其中的依赖库即可,说了那么多不如直接上修改代码
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile(rootProject.ext.dependencies.espresso, {
exclude group: 'com.android.support', module: 'support-annotations'
})
implementation rootProject.ext.dependencies.appcompatV7
implementation rootProject.ext.dependencies.junit
implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
//implementation 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.3'
//implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.4'
//implementation 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.3'
// compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.3'
//implementation 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.3'
implementation 'com.github.Jay-Goo:RangeSeekBar:v1.0.0'
implementation 'com.shuyu:gsyVideoPlayer-ex_so:6.0.3' //其它注释掉,使用这个so即可
// compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.3'
}
如果你还遇到了其它问题,请及时回复我,我来帮你解决,包括so冲突问题!
github项目地址:xiaoyanger0825/NiceVieoPlayer
下载 niceviewoplayer 库,在 AndroidStudio 中作为 Mudule 添加依赖。
或者在 Gradle 中添加依赖:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
compile 'com.github.xiaoyanger0825:NiceVieoPlayer:v2.2'
}
注意:在对应视频界面所在的 Activity 的 Manifest.xml 中需要添加如下配置:
android:configChanges="orientation|keyboardHidden|screenSize"
1.在 Activity 中使用
在 Activity 中使用时,该 Activity 需要继承自AppCompatActivity
,在 onStop 中需要释放播放器,并且要在 onBackPress 中处理按下返回键的逻辑:
private void init() {
mNiceVideoPlayer = (NiceVideoPlayer) findViewById(R.id.nice_video_player);
mNiceVideoPlayer.setPlayerType(NiceVideoPlayer.TYPE_IJK); // or NiceVideoPlayer.TYPE_NATIVE
mNiceVideoPlayer.setUp(mVideoUrl, null);
TxVideoPlayerController controller = new TxVideoPlayerController(this);
controller.setTitle(mTitle);
controller.setImage(mImageUrl);
mNiceVideoPlayer.setController(controller);
}
@Override
protected void onStop() {
super.onStop();
// 在 onStop 时释放掉播放器
NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();
}
@Override
public void onBackPressed() {
// 在全屏或者小窗口时按返回键要先退出全屏或小窗口,
// 所以在 Activity 中 onBackPress 要交给 NiceVideoPlayer 先处理。
if (NiceVideoPlayerManager.instance().onBackPressd()) return;
super.onBackPressed();
}
详细可参考 demo 中的TinyWindowPlayActivity
、ChangeClarityActivity
、RecyclerViewActivity
.
2.在 Fragment 中使用
在 Fragment 中使用时,该 Fragment 外层的 Activity 需要继承自AppCompatActivity
,并且也要处理返回键按下逻辑:
public class XXXActivity extends AppCompatActivity {
...
@Override
public void onBackPressed() {
// 在全屏或者小窗口时按返回键要先退出全屏或小窗口,
// 所以在 Activity 中 onBackPress 要交给 NiceVideoPlayer 先处理。
if (NiceVideoPlayerManager.instance().onBackPressd()) return;
super.onBackPressed();
}
...
}
同时在 Fragment 中的 onStop 方法中释放播放器:
public class XXXFragenment extends Fragment {
...
@Override
public void onStop() {
super.onStop();
NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();
}
...
}
详细可参考 demo 中的UseInFragActivity
和DemoFragment
.
3.切换清晰度
如果需要切换清晰度,需要在controller
中配置清晰度相关的等级和视频链接地址:
private void init() {
mNiceVideoPlayer = (NiceVideoPlayer) findViewById(R.id.nice_video_player);
mNiceVideoPlayer.setPlayerType(NiceVideoPlayer.TYPE_IJK); // IjkPlayer or MediaPlayer
TxVideoPlayerController controller = new TxVideoPlayerController(this);
controller.setTitle(mTitle);
controller.setClarity(getClarites(), 0); // 设置清晰度以及默认播放的清晰度
Glide.with(this)
.load(mImageUrl)
.placeholder(R.drawable.img_default)
.crossFade()
.into(controller.imageView());
mNiceVideoPlayer.setController(controller);
}
public List
List
clarities.add(new Clarity("标清", "270P", "http://play.g3proxy.lecloud.com/vod/v2/MjUxLzE2LzgvbGV0di11dHMvMTQvdmVyXzAwXzIyLTExMDc2NDEzODctYXZjLTE5OTgxOS1hYWMtNDgwMDAtNTI2MTEwLTE3MDg3NjEzLWY1OGY2YzM1NjkwZTA2ZGFmYjg2MTVlYzc5MjEyZjU4LTE0OTg1NTc2ODY4MjMubXA0?b=259&mmsid=65565355&tm=1499247143&key=f0eadb4f30c404d49ff8ebad673d3742&platid=3&splatid=345&playid=0&tss=no&vtype=21&cvid=2026135183914&payff=0&pip=08cc52f8b09acd3eff8bf31688ddeced&format=0&sign=mb&dname=mobile&expect=1&tag=mobile&xformat=super"));
clarities.add(new Clarity("高清", "480P", "http://play.g3proxy.lecloud.com/vod/v2/MjQ5LzM3LzIwL2xldHYtdXRzLzE0L3Zlcl8wMF8yMi0xMTA3NjQxMzkwLWF2Yy00MTk4MTAtYWFjLTQ4MDAwLTUyNjExMC0zMTU1NTY1Mi00ZmJjYzFkNzA1NWMyNDc4MDc5OTYxODg1N2RjNzEwMi0xNDk4NTU3OTYxNzQ4Lm1wNA==?b=479&mmsid=65565355&tm=1499247143&key=98c7e781f1145aba07cb0d6ec06f6c12&platid=3&splatid=345&playid=0&tss=no&vtype=13&cvid=2026135183914&payff=0&pip=08cc52f8b09acd3eff8bf31688ddeced&format=0&sign=mb&dname=mobile&expect=1&tag=mobile&xformat=super"));
clarities.add(new Clarity("超清", "720P", "http://play.g3proxy.lecloud.com/vod/v2/MjQ5LzM3LzIwL2xldHYtdXRzLzE0L3Zlcl8wMF8yMi0xMTA3NjQxMzkwLWF2Yy00MTk4MTAtYWFjLTQ4MDAwLTUyNjExMC0zMTU1NTY1Mi00ZmJjYzFkNzA1NWMyNDc4MDc5OTYxODg1N2RjNzEwMi0xNDk4NTU3OTYxNzQ4Lm1wNA==?b=479&mmsid=65565355&tm=1499247143&key=98c7e781f1145aba07cb0d6ec06f6c12&platid=3&splatid=345&playid=0&tss=no&vtype=13&cvid=2026135183914&payff=0&pip=08cc52f8b09acd3eff8bf31688ddeced&format=0&sign=mb&dname=mobile&expect=1&tag=mobile&xformat=super"));
clarities.add(new Clarity("蓝光", "1080P", "http://play.g3proxy.lecloud.com/vod/v2/MjQ5LzM3LzIwL2xldHYtdXRzLzE0L3Zlcl8wMF8yMi0xMTA3NjQxMzkwLWF2Yy00MTk4MTAtYWFjLTQ4MDAwLTUyNjExMC0zMTU1NTY1Mi00ZmJjYzFkNzA1NWMyNDc4MDc5OTYxODg1N2RjNzEwMi0xNDk4NTU3OTYxNzQ4Lm1wNA==?b=479&mmsid=65565355&tm=1499247143&key=98c7e781f1145aba07cb0d6ec06f6c12&platid=3&splatid=345&playid=0&tss=no&vtype=13&cvid=2026135183914&payff=0&pip=08cc52f8b09acd3eff8bf31688ddeced&format=0&sign=mb&dname=mobile&expect=1&tag=mobile&xformat=super"));
return clarities;
}
详细参考 demo 中的ChangeClarityActivity
4.在 RecyclerView 列表中使用
在 ReclerView 列表中使用时需要监听 itemView 回收,以此释放掉对应的播放器
mRecyclerView.setRecyclerListener(new RecyclerView.RecyclerListener() {
@Override
public void onViewRecycled(RecyclerView.ViewHolder holder) {
NiceVideoPlayer niceVideoPlayer = ((VideoViewHolder) holder).mVideoPlayer;
if (niceVideoPlayer == NiceVideoPlayerManager.instance().getCurrentNiceVideoPlayer()) {
NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();
}
}
});
详细参考 demo 中的RecyclerViewActivity
.
5.播放时 Home 键按下以及回到播放界面的处理
按照上面的做法,在 onStop 直接释放掉播放器,那么在播放时按下 Home 键播放器也会被释放掉,如果在此回到播放界面,播放器回到最初始的状态。如果需要在播放的时候按下 Home 键只是暂停播放器,重新回到播放界面时又继续播放,那么可以参考 demo 中的CompatHomeKeyActiivty
,或者对应的 Activity 集成自CompatHomeKeyActiivty
,详细参考 demo 中的ProcessHome1Activity
。当然,如果是在 Fragment 中,参考CompatKeyFragment
,或者继承自CompatKeyFragment
(外层的 Activity 还是继承自 AppCompat,并处理 onBackPress),详细参考 demo 中的ProcessHome2Activity
.
5.自定义控制界面
public class CustomController extends NiceVideoPlayerController {
// 实现自己的控制界面
...
}
-keep class tv.danmaku.ijk.media.player.**{*;}