重點部分大家都懂了,我主要來說說這裏面的坑 就是在播放有些視頻 出現黑屏或者播放一半左右出現播放錯錯誤問題,
出現的原因就是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 中添加依賴:
-
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<Clarity> getClarites() {
-
List<Clarity> clarities = new ArrayList<>();
-
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 {
-
// 實現自己的控制界面
-
...
-
}
三.Proguard
-keep class tv.danmaku.ijk.media.player.**{*;}