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.**{*;}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章