Skip to content

Commit c05df0c

Browse files
committed
1.新增清晰度切换功能
2.优化代码 3.修复一些Bug
1 parent 59b60cd commit c05df0c

51 files changed

Lines changed: 1603 additions & 280 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 94 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
* 支持本地和网络视频播放.
66
* 完美切换小窗口、全屏,可在RecyclerView、ListView中无缝全屏.
77
* 手势滑动调节播放进度、亮度、声音.
8-
* 可自定义控制界面
8+
* 支持清晰度切换.
9+
* 可自定义控制界面.
910

1011
### Usage
1112
下载niceviewoplayer库,在AndroidSutio中作为Mudule添加依赖。
@@ -21,56 +22,99 @@ allprojects {
2122
}
2223
2324
dependencies {
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
```
75119
mRecyclerView.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
```
93140
public 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
```

app/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ android {
2020
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
2121
}
2222
}
23-
23+
2424
productFlavors {
2525
}
2626
}
@@ -37,4 +37,5 @@ dependencies {
3737
testCompile rootProject.ext.dependencies.junit
3838
compile rootProject.ext.dependencies.recyclerview
3939
compile rootProject.ext.dependencies.glide
40+
compile 'com.android.support.constraint:constraint-layout:1.0.2'
4041
}

app/src/main/AndroidManifest.xml

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,47 @@
1212
android:roundIcon="@mipmap/ic_launcher_round"
1313
android:supportsRtl="true"
1414
android:theme="@style/AppTheme">
15-
<activity
16-
android:name=".example.MainActivity"
17-
android:configChanges="orientation|keyboardHidden|screenSize"
18-
android:screenOrientation="portrait">
15+
<activity android:name=".example.MainActivity">
1916
<intent-filter>
2017
<action android:name="android.intent.action.MAIN"/>
18+
2119
<category android:name="android.intent.category.LAUNCHER"/>
2220
</intent-filter>
2321
</activity>
22+
<activity
23+
android:name=".example.TinyWindowPlayActivity"
24+
android:configChanges="orientation|keyboardHidden|screenSize"
25+
android:label="可使用小窗口模式播放"
26+
android:screenOrientation="portrait">
27+
</activity>
2428
<activity
2529
android:name=".example.RecyclerViewActivity"
2630
android:configChanges="orientation|keyboardHidden|screenSize"
31+
android:label="在RecylerView视频列表中"
32+
android:screenOrientation="portrait">
33+
</activity>
34+
<activity
35+
android:name=".example.ChangeClarityActivity"
36+
android:configChanges="orientation|keyboardHidden|screenSize"
37+
android:label="在全屏时可以切换清晰度"
38+
android:screenOrientation="portrait">
39+
</activity>
40+
<activity
41+
android:name=".example.UseInFragActivity"
42+
android:configChanges="orientation|keyboardHidden|screenSize"
43+
android:label="在fragment中使用"
44+
android:screenOrientation="portrait">
45+
</activity>
46+
<activity
47+
android:label="Activity中时处理播放时按下Home键"
48+
android:name=".example.ProcessHome1Activity"
49+
android:configChanges="orientation|keyboardHidden|screenSize"
50+
android:screenOrientation="portrait">
51+
</activity>
52+
<activity
53+
android:label="Fragment中时处理播放时按下Home键"
54+
android:name=".example.ProcessHome2Activity"
55+
android:configChanges="orientation|keyboardHidden|screenSize"
2756
android:screenOrientation="portrait">
2857
</activity>
2958
</application>
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.xiao.nicevieoplayer.example;
2+
3+
import android.os.Bundle;
4+
import android.support.v7.app.AppCompatActivity;
5+
6+
import com.bumptech.glide.Glide;
7+
import com.xiao.nicevideoplayer.Clarity;
8+
import com.xiao.nicevideoplayer.NiceVideoPlayer;
9+
import com.xiao.nicevideoplayer.NiceVideoPlayerManager;
10+
import com.xiao.nicevideoplayer.TxVideoPlayerController;
11+
import com.xiao.nicevieoplayer.R;
12+
13+
import java.util.ArrayList;
14+
import java.util.List;
15+
16+
public class ChangeClarityActivity extends AppCompatActivity {
17+
18+
private NiceVideoPlayer mNiceVideoPlayer;
19+
20+
@Override
21+
protected void onCreate(Bundle savedInstanceState) {
22+
super.onCreate(savedInstanceState);
23+
setContentView(R.layout.activity_change_clarity);
24+
init();
25+
}
26+
27+
private void init() {
28+
mNiceVideoPlayer = (NiceVideoPlayer) findViewById(R.id.nice_video_player);
29+
mNiceVideoPlayer.setPlayerType(NiceVideoPlayer.TYPE_IJK); // IjkPlayer or MediaPlayer
30+
TxVideoPlayerController controller = new TxVideoPlayerController(this);
31+
controller.setTitle("Beautiful China...");
32+
controller.setLenght(117000);
33+
controller.setClarity(getClarites(), 0);
34+
Glide.with(this)
35+
.load("http://imgsrc.baidu.com/image/c0%3Dshijue%2C0%2C0%2C245%2C40/sign=304dee3ab299a9012f38537575fc600e/91529822720e0cf3f8b77cd50046f21fbe09aa5f.jpg")
36+
.placeholder(R.drawable.img_default)
37+
.crossFade()
38+
.into(controller.imageView());
39+
mNiceVideoPlayer.setController(controller);
40+
}
41+
42+
public List<Clarity> getClarites() {
43+
List<Clarity> clarities = new ArrayList<>();
44+
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"));
45+
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"));
46+
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"));
47+
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"));
48+
return clarities;
49+
}
50+
51+
@Override
52+
protected void onStop() {
53+
super.onStop();
54+
NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();
55+
}
56+
57+
@Override
58+
public void onBackPressed() {
59+
if (NiceVideoPlayerManager.instance().onBackPressd()) return;
60+
super.onBackPressed();
61+
}
62+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.xiao.nicevieoplayer.example;
2+
3+
import android.os.Bundle;
4+
import android.support.annotation.Nullable;
5+
import android.support.v4.app.Fragment;
6+
import android.support.v7.widget.LinearLayoutManager;
7+
import android.support.v7.widget.RecyclerView;
8+
import android.view.LayoutInflater;
9+
import android.view.View;
10+
import android.view.ViewGroup;
11+
12+
import com.xiao.nicevideoplayer.NiceVideoPlayer;
13+
import com.xiao.nicevideoplayer.NiceVideoPlayerManager;
14+
import com.xiao.nicevieoplayer.R;
15+
import com.xiao.nicevieoplayer.example.adapter.VideoAdapter;
16+
import com.xiao.nicevieoplayer.example.util.DataUtil;
17+
18+
/**
19+
* Created by XiaoJianjun on 2017/7/7.
20+
* 如果你需要在播放的时候按下Home键能暂停,回调此Fragment又继续的话,需要继承自CompatHomeKeyFragment
21+
*/
22+
public class DemoFragenment extends Fragment {
23+
24+
private RecyclerView mRecyclerView;
25+
26+
@Override
27+
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
28+
return inflater.inflate(R.layout.layout_fragment_demo, container, false);
29+
}
30+
31+
@Override
32+
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
33+
super.onViewCreated(view, savedInstanceState);
34+
init();
35+
}
36+
37+
private void init() {
38+
mRecyclerView = (RecyclerView) getView().findViewById(R.id.recycler_view);
39+
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
40+
mRecyclerView.setHasFixedSize(true);
41+
VideoAdapter adapter = new VideoAdapter(getActivity(), DataUtil.getVideoListData());
42+
mRecyclerView.setAdapter(adapter);
43+
mRecyclerView.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {
44+
@Override
45+
public void onChildViewAttachedToWindow(View view) {
46+
47+
}
48+
49+
@Override
50+
public void onChildViewDetachedFromWindow(View view) {
51+
NiceVideoPlayer niceVideoPlayer = (NiceVideoPlayer) view.findViewById(R.id.nice_video_player);
52+
if (niceVideoPlayer == NiceVideoPlayerManager.instance().getCurrentNiceVideoPlayer()) {
53+
NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();
54+
}
55+
}
56+
});
57+
}
58+
59+
@Override
60+
public void onStop() {
61+
super.onStop();
62+
NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();
63+
}
64+
}

0 commit comments

Comments
 (0)