開源地址:https://github.com/xiaoyanger0825/NiceVieoPlayer
Features
用IjkPlayer/MediaPlayer + TextureView封裝渣叛,可切換IjkPlayer及刻、MediaPlayer.
支持本地和網(wǎng)絡(luò)視頻播放.
完美切換小窗口、全屏,可在RecyclerView中無縫全屏.
手勢滑動調(diào)節(jié)播放進度辉词、亮度晶通、聲音.
支持清晰度切換.
可自定義控制界面.
下載niceviewoplayer庫铡俐,在AndroidStudio中作為Mudule添加依賴翅阵。
或者在Gradle中添加依賴:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
compile 'com.github.xiaoyanger0825:NiceVieoPlayer:v2.0'
}
在對應(yīng)視頻界面所在的Activity的Manifest.xml中需要添加如下配置:
android:configChanges="orientation|keyboardHidden|screenSize"
在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.
在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.
如果需要切換清晰度蔚龙,需要在controller中配置清晰度相關(guān)的等級和視頻鏈接地址:
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);? ? // 設(shè)置清晰度以及默認播放的清晰度
Glide.with(this)
.load(mImageUrl)
.placeholder(R.drawable.img_default)
.crossFade()
.into(controller.imageView());
mNiceVideoPlayer.setController(controller);
}
public List getClarites() {
List 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
在ReclerView列表中使用時需要監(jiān)聽itemView回收,以此釋放掉對應(yīng)的播放器
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.
按照上面的做法映胁,在onStop直接釋放掉播放器木羹,那么在播放時按下Home鍵播放器也會被釋放掉,如果在此回到播放界面,播放器回到最初始的狀態(tài)坑填。如果需要在播放的時候按下Home鍵只是暫停播放器抛人,重新回到播放界面時又繼續(xù)播放,那么可以參考demo中的CompatHomeKeyActiivty脐瑰,或者對應(yīng)的Activity集成自CompatHomeKeyActiivty妖枚,詳細參考demo中的ProcessHome1Activity。當(dāng)然苍在,如果是在Fragment中绝页,參考CompatKeyFragment,或者繼承自CompatKeyFragment(外層的Activity還是繼承自AppCompat寂恬,并處理onBackPress)续誉,詳細參考demo中的ProcessHome2Activity.
public class CustomController extends NiceVideoPlayerController {
// 實現(xiàn)自己的控制界面
...
}
-keep class tv.danmaku.ijk.media.player.**{*;}