55 * 支持本地和网络视频播放.
66 * 完美切换小窗口、全屏,可在RecyclerView、ListView中无缝全屏.
77 * 手势滑动调节播放进度、亮度、声音.
8- * 可自定义控制界面
8+ * 支持清晰度切换.
9+ * 可自定义控制界面.
910
1011### Usage
1112下载niceviewoplayer库,在AndroidSutio中作为Mudule添加依赖。
@@ -21,56 +22,99 @@ allprojects {
2122}
2223
2324dependencies {
24- compile 'com.github.xiaoyanger0825:NiceVieoPlayer:v1.6 '
25+ compile 'com.github.xiaoyanger0825:NiceVieoPlayer:v1.7 '
2526}
2627```
2728
28- ** 在Activity中使用时,该Activity需要继承自AppCompatActivity。在Fragment中使用时,外层的Activity也同样需要继承自AppCompatActivity**
29+ #### 1.在Activity中使用
30+ 在Activity中使用时,该Activity需要继承自` AppCompatActivity ` ,在onStop中需要释放播放器,并且要在onBackPress中处理按下返回键的逻辑:
2931
30- 1.在Activity中使用:
31- ```
32- private void init() {
33- mNiceVideoPlayer = (NiceVideoPlayer) findViewById(R.id.nice_video_player);
34- mNiceVideoPlayer.setPlayerType(NiceVideoPlayer.PLAYER_TYPE_IJK); // or NiceVideoPlayer.PLAYER_NATIVE
35- mNiceVideoPlayer.setUp(mVideoUrl, null);
36- // 默认的控制器,如需自定义,可继承NiceVideoPlayer自己实现
37- TxVideoPlayerController controller = new TxVideoPlayerController(this);
38- controller.setTitle(mTitle);
39- controller.setImage(mImageUrl);
40- mNiceVideoPlayer.setController(controller);
41- }
42-
43- // 按下Home键暂停播放,回到界面继续播放。
44- @Override
45- protected void onStop() {
46- NiceVideoPlayerManager.instance().pauseNiceVideoPlayer();
47- super.onStop();
48- }
49-
50- @Override
51- protected void onRestart() {
52- NiceVideoPlayerManager.instance().restartNiceVideoPlayer();
53- super.onRestart();
54- }
55-
56- // 按返回键
57- // 当前是全屏或小窗口,需要先退出全屏或小窗口。
58- @Override
59- public void onBackPressed() {
60- if (NiceVideoPlayerManager.instance().onBackPressd()) {
61- return;
62- }
63- super.onBackPressed();
64- }
32+ ```
33+ private void init() {
34+ mNiceVideoPlayer = (NiceVideoPlayer) findViewById(R.id.nice_video_player);
35+ mNiceVideoPlayer.setPlayerType(NiceVideoPlayer.TYPE_IJK); // or NiceVideoPlayer.TYPE_NATIVE
36+ mNiceVideoPlayer.setUp(mVideoUrl, null);
6537
66- @Override
67- protected void onDestroy() {
68- // 很重要,在Activity和Fragment的onStop方法中一定要调用,释放的播放器。
69- NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();
70- super.onDestroy();
71- }
72- ```
73- 2.在RecyclerView列表中使用需要监听itemView detach:
38+ TxVideoPlayerController controller = new TxVideoPlayerController(this);
39+ controller.setTitle(mTitle);
40+ controller.setImage(mImageUrl);
41+ mNiceVideoPlayer.setController(controller);
42+ }
43+
44+ @Override
45+ protected void onStop() {
46+ super.onStop();
47+ // 在onStop时释放掉播放器
48+ NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();
49+ }
50+ @Override
51+ public void onBackPressed() {
52+ // 在全屏或者小窗口时按返回键要先退出全屏或小窗口,
53+ // 所以在Activity中onBackPress要交给NiceVideoPlayer先处理。
54+ if (NiceVideoPlayerManager.instance().onBackPressd()) return;
55+ super.onBackPressed();
56+ }
57+ ```
58+ 详细可参考demo中的` TinyWindowPlayActivity ` 、` ChangeClarityActivity ` 、` RecyclerViewActivity ` .
59+ #### 2.在Fragment中使用
60+ 在Fragment中使用时,该Fragment外层的Activity需要继承自` AppCompatActivity ` ,并且也要处理返回键按下逻辑:
61+ ```
62+ public class XXXActivity extends AppCompatActivity {
63+ ...
64+ @Override
65+ public void onBackPressed() {
66+ // 在全屏或者小窗口时按返回键要先退出全屏或小窗口,
67+ // 所以在Activity中onBackPress要交给NiceVideoPlayer先处理。
68+ if (NiceVideoPlayerManager.instance().onBackPressd()) return;
69+ super.onBackPressed();
70+ }
71+ ...
72+ }
73+ ```
74+ 同时在Fragment中的onStop方法中释放播放器:
75+ ```
76+ public class XXXFragenment extends Fragment {
77+ ...
78+ @Override
79+ public void onStop() {
80+ super.onStop();
81+ NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();
82+ }
83+ ...
84+ }
85+ ```
86+ 详细可参考demo中的` UseInFragActivity ` 和` DemoFragment ` .
87+
88+ #### 3.切换清晰度
89+ 如果需要切换清晰度,需要在` controller ` 中配置清晰度相关的等级和视频链接地址:
90+ ```
91+ private void init() {
92+ mNiceVideoPlayer = (NiceVideoPlayer) findViewById(R.id.nice_video_player);
93+ mNiceVideoPlayer.setPlayerType(NiceVideoPlayer.TYPE_IJK); // IjkPlayer or MediaPlayer
94+ TxVideoPlayerController controller = new TxVideoPlayerController(this);
95+ controller.setTitle(mTitle);
96+ controller.setClarity(getClarites(), 0); // 设置清晰度以及默认播放的清晰度
97+ Glide.with(this)
98+ .load(mImageUrl)
99+ .placeholder(R.drawable.img_default)
100+ .crossFade()
101+ .into(controller.imageView());
102+ mNiceVideoPlayer.setController(controller);
103+ }
104+
105+ public List<Clarity> getClarites() {
106+ List<Clarity> clarities = new ArrayList<>();
107+ 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"));
108+ 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"));
109+ 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"));
110+ 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"));
111+ return clarities;
112+ }
113+ ```
114+ 详细参考demo中的` ChangeClarityActivity `
115+
116+ #### 4.在RecyclerView列表中使用
117+ 在ReclerView列表中使用时需要监听itemView的detach,以此释放掉对应的播放器
74118```
75119mRecyclerView.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {
76120 @Override
@@ -87,32 +131,16 @@ mRecyclerView.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttach
87131 }
88132});
89133```
90- 3.自定义控制界面
134+ 详细参考demo中的` RecyclerViewActivity ` .
135+ #### 5.播放时Home键按下以及回到播放界面的处理
136+ 按照上面的做法,在onStop直接释放掉播放器,那么在播放时按下Home键播放器也会被释放掉,如果在此回到播放界面,播放器回到最初始的状态。如果需要在播放的时候按下Home键只是暂停播放器,重新回到播放界面时又继续播放,那么可以参考demo中的` CompatHomeKeyActiivty ` ,或者对应的Activity集成自` CompatHomeKeyActiivty ` ,详细参考demo中的` ProcessHome1Activity ` 。当然,如果是在Fragment中,参考` CompatKeyFragment ` ,或者继承自` CompatKeyFragment ` (外层的Activity还是继承自AppCompat,并处理onBackPress),详细参考demo中的` ProcessHome2Activity ` .
91137
138+ #### 5.自定义控制界面
92139```
93140public class CustomController extends NiceVideoPlayerController {
94141 // 实现自己的控制界面
95142 ...
96143}
97-
98- ...
99-
100- public class MainActivity extends AppCompatActivity {
101-
102- private NiceVideoPlayer mNiceVideoPlayer;
103-
104- @Override
105- protected void onCreate(Bundle savedInstanceState) {
106- super.onCreate(savedInstanceState);
107- setContentView(R.layout.activity_main);
108- // 使用自定义的CustomContorller
109- mNiceVideoPlayer = (NiceVideoPlayer) findViewById(R.id.nice_video_player);
110- CustomContorller controller = new CostomController(this);
111- ...// mNiceVideoPlayerh和controller的其他设置
112- mNiceVideoPlayer.setController(controller);
113- }
114- }
115-
116144```
117145### Proguard
118146```
0 commit comments