NiceVieoPlayer 完美视频播放器 解决黑屏坑问题

重点部分大家都懂了,我主要来说说这里面的坑    就是在播放有些视频 出现黑屏或者播放一半左右出现播放错错误问题,

出现的原因就是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

一.Features

  • 用 IjkPlayer/MediaPlayer + TextureView 封装,可切换 IjkPlayer、MediaPlayer.
  • 支持本地和网络视频播放.
  • 完美切换小窗口、全屏,可在 RecyclerView 中无缝全屏.
  • 手势滑动调节播放进度、亮度、声音.
  • 支持清晰度切换.
  • 可自定义控制界面.

二.Usage

下载 niceviewoplayer 库,在 AndroidStudio 中作为 Mudule 添加依赖。

或者在 Gradle 中添加依赖:

 
  1. allprojects {

  2. repositories {

  3. ...

  4. maven { url 'https://jitpack.io' }

  5. }

  6. }

  7.  
  8. dependencies {

  9. compile 'com.github.xiaoyanger0825:NiceVieoPlayer:v2.2'

  10. }

注意:在对应视频界面所在的 Activity 的 Manifest.xml 中需要添加如下配置:

android:configChanges="orientation|keyboardHidden|screenSize"

1.在 Activity 中使用

在 Activity 中使用时,该 Activity 需要继承自AppCompatActivity,在 onStop 中需要释放播放器,并且要在 onBackPress 中处理按下返回键的逻辑:

 
  1. private void init() {

  2. mNiceVideoPlayer = (NiceVideoPlayer) findViewById(R.id.nice_video_player);

  3. mNiceVideoPlayer.setPlayerType(NiceVideoPlayer.TYPE_IJK); // or NiceVideoPlayer.TYPE_NATIVE

  4. mNiceVideoPlayer.setUp(mVideoUrl, null);

  5.  
  6. TxVideoPlayerController controller = new TxVideoPlayerController(this);

  7. controller.setTitle(mTitle);

  8. controller.setImage(mImageUrl);

  9. mNiceVideoPlayer.setController(controller);

  10. }

  11.  
  12. @Override

  13. protected void onStop() {

  14. super.onStop();

  15. // 在 onStop 时释放掉播放器

  16. NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();

  17. }

  18. @Override

  19. public void onBackPressed() {

  20. // 在全屏或者小窗口时按返回键要先退出全屏或小窗口,

  21. // 所以在 Activity 中 onBackPress 要交给 NiceVideoPlayer 先处理。

  22. if (NiceVideoPlayerManager.instance().onBackPressd()) return;

  23. super.onBackPressed();

  24. }

详细可参考 demo 中的TinyWindowPlayActivityChangeClarityActivityRecyclerViewActivity.

2.在 Fragment 中使用

在 Fragment 中使用时,该 Fragment 外层的 Activity 需要继承自AppCompatActivity,并且也要处理返回键按下逻辑:

 
  1. public class XXXActivity extends AppCompatActivity {

  2. ...

  3. @Override

  4. public void onBackPressed() {

  5. // 在全屏或者小窗口时按返回键要先退出全屏或小窗口,

  6. // 所以在 Activity 中 onBackPress 要交给 NiceVideoPlayer 先处理。

  7. if (NiceVideoPlayerManager.instance().onBackPressd()) return;

  8. super.onBackPressed();

  9. }

  10. ...

  11. }

同时在 Fragment 中的 onStop 方法中释放播放器:

 
  1. public class XXXFragenment extends Fragment {

  2. ...

  3. @Override

  4. public void onStop() {

  5. super.onStop();

  6. NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();

  7. }

  8. ...

  9. }

详细可参考 demo 中的UseInFragActivityDemoFragment.

3.切换清晰度

如果需要切换清晰度,需要在controller中配置清晰度相关的等级和视频链接地址:

 
  1. private void init() {

  2. mNiceVideoPlayer = (NiceVideoPlayer) findViewById(R.id.nice_video_player);

  3. mNiceVideoPlayer.setPlayerType(NiceVideoPlayer.TYPE_IJK); // IjkPlayer or MediaPlayer

  4. TxVideoPlayerController controller = new TxVideoPlayerController(this);

  5. controller.setTitle(mTitle);

  6. controller.setClarity(getClarites(), 0); // 设置清晰度以及默认播放的清晰度

  7. Glide.with(this)

  8. .load(mImageUrl)

  9. .placeholder(R.drawable.img_default)

  10. .crossFade()

  11. .into(controller.imageView());

  12. mNiceVideoPlayer.setController(controller);

  13. }

  14.  
  15. public List<Clarity> getClarites() {

  16. List<Clarity> clarities = new ArrayList<>();

  17. 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"));

  18. 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"));

  19. 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"));

  20. 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"));

  21. return clarities;

  22. }

详细参考 demo 中的ChangeClarityActivity

4.在 RecyclerView 列表中使用

在 ReclerView 列表中使用时需要监听 itemView 回收,以此释放掉对应的播放器

 
  1. mRecyclerView.setRecyclerListener(new RecyclerView.RecyclerListener() {

  2. @Override

  3. public void onViewRecycled(RecyclerView.ViewHolder holder) {

  4. NiceVideoPlayer niceVideoPlayer = ((VideoViewHolder) holder).mVideoPlayer;

  5. if (niceVideoPlayer == NiceVideoPlayerManager.instance().getCurrentNiceVideoPlayer()) {

  6. NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();

  7. }

  8. }

  9. });

详细参考 demo 中的RecyclerViewActivity.

5.播放时 Home 键按下以及回到播放界面的处理

按照上面的做法,在 onStop 直接释放掉播放器,那么在播放时按下 Home 键播放器也会被释放掉,如果在此回到播放界面,播放器回到最初始的状态。如果需要在播放的时候按下 Home 键只是暂停播放器,重新回到播放界面时又继续播放,那么可以参考 demo 中的CompatHomeKeyActiivty,或者对应的 Activity 集成自CompatHomeKeyActiivty,详细参考 demo 中的ProcessHome1Activity。当然,如果是在 Fragment 中,参考CompatKeyFragment,或者继承自CompatKeyFragment(外层的 Activity 还是继承自 AppCompat,并处理 onBackPress),详细参考 demo 中的ProcessHome2Activity.

5.自定义控制界面

 
  1. public class CustomController extends NiceVideoPlayerController {

  2. // 实现自己的控制界面

  3. ...

  4. }

三.Proguard

-keep class tv.danmaku.ijk.media.player.**{*;}
发布了9 篇原创文章 · 获赞 15 · 访问量 7475

猜你喜欢

转载自blog.csdn.net/jokeYJW/article/details/104776528