Skip to content

Commit 073081c

Browse files
author
Ttt
committed
1.增加视频播放控制器类
2.增加几个进度、播放时间等方法获取 Former-commit-id: 5833328
1 parent 2bd3c9a commit 073081c

File tree

4 files changed

+380
-2
lines changed

4 files changed

+380
-2
lines changed

DevLibUtils/src/main/java/dev/utils/app/player/DevMediaManager.java

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ public boolean isLooping() {
254254
}
255255
});
256256
} catch (Exception e) {
257-
LogPrintUtils.eTag(TAG, e, "playPrepare - " + playUri);
257+
LogPrintUtils.eTag(TAG, e, "playPrepare - playUri : " + playUri);
258258
// 销毁资源
259259
destroyMedia();
260260
}
@@ -448,7 +448,7 @@ public void setMeidaListener(MediaListener mMeidaListener) {
448448
* detail: 播放 设置
449449
* Created by Ttt
450450
*/
451-
public abstract class MediaSet {
451+
public static abstract class MediaSet {
452452

453453
/**
454454
* 是否循环播放 - 默认不循环
@@ -475,6 +475,22 @@ public float getVolume(){
475475

476476
// =============== get/set方法 =================
477477

478+
/**
479+
* 判断 MediaPlayer 是否为null
480+
* @return
481+
*/
482+
public boolean isNullMediaPlayer(){
483+
return mMediaPlayer == null;
484+
}
485+
486+
/**
487+
* 判断 MediaPlayer 是否不为null
488+
* @return
489+
*/
490+
public boolean isNotNullMediaPlayer(){
491+
return mMediaPlayer != null;
492+
}
493+
478494
/**
479495
* 获取 MediaPlayer 对象
480496
* @return
@@ -567,4 +583,39 @@ public int getVideoWidth() {
567583
public int getVideoHeight() {
568584
return mVideoHeight;
569585
}
586+
587+
/**
588+
* 获取当前播放时间
589+
* @return
590+
*/
591+
public int getCurrentPosition(){
592+
if (mMediaPlayer != null){
593+
return mMediaPlayer.getCurrentPosition();
594+
}
595+
return 0;
596+
}
597+
598+
/**
599+
* 获取资源总时间
600+
* @return
601+
*/
602+
public int getDuration(){
603+
if (mMediaPlayer != null){
604+
return mMediaPlayer.getDuration();
605+
}
606+
return 0;
607+
}
608+
609+
/**
610+
* 获取播放进度百分比
611+
* @return
612+
*/
613+
public int getPlayPercent(){
614+
try {
615+
return (getCurrentPosition() * 100) / getDuration();
616+
} catch (Exception e){
617+
LogPrintUtils.eTag(TAG, e, "getPlayPercent");
618+
}
619+
return 0;
620+
}
570621
}
Lines changed: 316 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,316 @@
1+
package dev.utils.app.player;
2+
3+
import android.media.MediaPlayer;
4+
import android.text.TextUtils;
5+
import android.view.SurfaceHolder;
6+
import android.view.SurfaceView;
7+
8+
import dev.utils.LogPrintUtils;
9+
10+
/**
11+
* detail: 视频播放控制器
12+
* Created by Ttt
13+
*/
14+
public class DevVideoPlayerControl implements SurfaceHolder.Callback,
15+
DevMediaManager.MediaListener {
16+
17+
// ========= 外部回调 =========
18+
/** 日志Tag */
19+
private final String TAG = DevVideoPlayerControl.class.getSimpleName();
20+
// 播放设置
21+
private DevMediaManager.MediaSet mMediaSet;
22+
// ========= View ===========
23+
/** 播放载体SurfaceView */
24+
private SurfaceView mSurfaceview;
25+
/** 画面预览回调 */
26+
private SurfaceHolder mSurfaceHolder;
27+
28+
/**
29+
* 初始化构造函数
30+
* @param surfaceview
31+
*/
32+
public DevVideoPlayerControl(SurfaceView surfaceview) {
33+
this.mSurfaceview = surfaceview;
34+
35+
// = 初始化操作 =
36+
37+
// 初始化 DevMediaManager 回调事件类
38+
DevMediaManager.getInstance().setMeidaListener(this);
39+
}
40+
41+
// == 内部快捷控制 ==
42+
43+
/**
44+
* 重置操作
45+
*/
46+
private void resetOperate(){
47+
// 移除旧的回调
48+
if(mSurfaceHolder != null){
49+
mSurfaceHolder.removeCallback(this);
50+
}
51+
// 设置Holder
52+
mSurfaceHolder = mSurfaceview.getHolder();
53+
// 移除旧的回调
54+
if(mSurfaceHolder != null){
55+
mSurfaceHolder.removeCallback(this);
56+
}
57+
// 添加回调
58+
mSurfaceHolder.addCallback(this);
59+
}
60+
61+
// == Surface回调事件 ==
62+
63+
@Override
64+
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
65+
LogPrintUtils.dTag(TAG, "surfaceChanged -> format: " + format + ", width: " + width + ", height: " + height);
66+
}
67+
68+
@Override
69+
public void surfaceCreated(SurfaceHolder holder) {
70+
LogPrintUtils.dTag(TAG, "surfaceCreated");
71+
try {
72+
// 开始播放
73+
DevMediaManager.getInstance().playPrepare(mMediaSet);
74+
// --
75+
LogPrintUtils.dTag(TAG, "setDisplay(surfaceHolder) - Success");
76+
} catch (Exception e) {
77+
LogPrintUtils.eTag(TAG, e, "setDisplay(surfaceHolder) - Error");
78+
}
79+
}
80+
81+
@Override
82+
public void surfaceDestroyed(SurfaceHolder holder) {
83+
LogPrintUtils.dTag(TAG, "surfaceDestroyed");
84+
}
85+
86+
// == MediaPlayer回调事件 ==
87+
88+
@Override
89+
public void onPrepared() {
90+
LogPrintUtils.dTag(TAG, "onPrepared");
91+
// --
92+
if (mSurfaceview != null) {
93+
// 如果等于null,或者不在显示中,则跳过
94+
if (mSurfaceHolder.getSurface() == null || !mSurfaceHolder.getSurface().isValid())
95+
return;
96+
97+
try {
98+
MediaPlayer mPlayer = DevMediaManager.getInstance().getMediaPlayer();
99+
mPlayer.setDisplay(mSurfaceHolder);
100+
} catch (Exception e) {
101+
LogPrintUtils.eTag(TAG, e, "onPrepared");
102+
}
103+
104+
// 触发回调
105+
if (mMediaListener != null){
106+
mMediaListener.onPrepared();
107+
} else {
108+
try { // 如果没有设置则直接播放
109+
DevMediaManager.getInstance().getMediaPlayer().start();
110+
} catch (Exception e){
111+
LogPrintUtils.eTag(TAG, e, "onPrepared - start");
112+
}
113+
}
114+
}
115+
}
116+
117+
@Override
118+
public void onCompletion() {
119+
LogPrintUtils.dTag(TAG, "onCompletion");
120+
// 触发回调
121+
if (mMediaListener != null){
122+
mMediaListener.onCompletion();
123+
}
124+
}
125+
126+
@Override
127+
public void onBufferingUpdate(int percent) {
128+
LogPrintUtils.dTag(TAG, "onBufferingUpdate: " + percent);
129+
// 触发回调
130+
if (mMediaListener != null){
131+
mMediaListener.onBufferingUpdate(percent);
132+
}
133+
}
134+
135+
@Override
136+
public void onSeekComplete() {
137+
LogPrintUtils.dTag(TAG, "onSeekComplete");
138+
// 触发回调
139+
if (mMediaListener != null){
140+
mMediaListener.onSeekComplete();
141+
}
142+
}
143+
144+
@Override
145+
public void onError(int what, int extra) {
146+
LogPrintUtils.dTag(TAG, "onError -> what: " + what + ", extra: " + extra);
147+
// 触发回调
148+
if (mMediaListener != null){
149+
mMediaListener.onError(what, extra);
150+
}
151+
}
152+
153+
@Override
154+
public void onVideoSizeChanged(int width, int height) {
155+
LogPrintUtils.dTag(TAG, "onVideoSizeChanged -> width: " + width + ", height: " + height);
156+
// 触发回调
157+
if (mMediaListener != null){
158+
mMediaListener.onVideoSizeChanged(width, height);
159+
}
160+
}
161+
162+
// ==
163+
164+
// 播放事件监听
165+
private DevMediaManager.MediaListener mMediaListener;
166+
167+
/**
168+
* 设置播放监听事件
169+
* @param mediaListener
170+
*/
171+
public void setMediaListener(DevMediaManager.MediaListener mediaListener) {
172+
this.mMediaListener = mediaListener;
173+
}
174+
175+
// ================== 播放快捷操作 ======================
176+
177+
/** 暂停播放 */
178+
public void pausePlayer(){
179+
DevMediaManager.getInstance().pause();
180+
}
181+
182+
/** 停止播放 */
183+
public void stopPlayer(){
184+
DevMediaManager.getInstance().stop();
185+
}
186+
187+
/**
188+
* 开始播放
189+
* @param playUri 播放地址
190+
* @return
191+
*/
192+
public void startPlayer(String playUri){
193+
startPlayer(playUri, false);
194+
}
195+
196+
/**
197+
* 开始播放
198+
* @param playUri 播放地址
199+
* @param isLooping 是否循环播放
200+
*/
201+
public void startPlayer(final String playUri, final boolean isLooping){
202+
// 设置播放信息
203+
this.mMediaSet = new DevMediaManager.MediaSet(){
204+
@Override
205+
public boolean isLooping() {
206+
return isLooping;
207+
}
208+
209+
@Override
210+
void setMediaConfig(MediaPlayer mediaPlayer) throws Exception {
211+
mediaPlayer.setDataSource(playUri);
212+
}
213+
};
214+
// 重置操作
215+
resetOperate();
216+
}
217+
218+
/**
219+
* 开始播放
220+
* @param mediaSet 播放设置
221+
*/
222+
public void startPlayer(DevMediaManager.MediaSet mediaSet){
223+
// 设置播放信息
224+
this.mMediaSet = mediaSet;
225+
// 重置操作
226+
resetOperate();
227+
}
228+
229+
/**
230+
* 获取显示的SurfaceView
231+
* @return
232+
*/
233+
public SurfaceView getSurfaceview() {
234+
return mSurfaceview;
235+
}
236+
237+
// ==
238+
239+
/**
240+
* 是否播放中
241+
* @return
242+
*/
243+
public boolean isPlaying(){
244+
return DevMediaManager.getInstance().isPlaying();
245+
}
246+
247+
/**
248+
* 是否播放中
249+
* @param uri 播放地址
250+
* @return
251+
*/
252+
public boolean isPlaying(String uri){
253+
if(!TextUtils.isEmpty(uri)){ // 需要播放的地址,必须不等于null
254+
// 获取之前播放路径
255+
String playUri = DevMediaManager.getInstance().getPlayUri();
256+
// 如果不等于null,并且播放地址相同
257+
if(playUri != null && playUri.equals(uri)){
258+
try {
259+
return DevMediaManager.getInstance().isPlaying();
260+
} catch (Exception e) {
261+
LogPrintUtils.eTag(TAG, e, "isPlaying - uri : " + uri);
262+
}
263+
}
264+
}
265+
return isPlaying();
266+
}
267+
268+
/**
269+
* 获取当前播放的地址
270+
* @return
271+
*/
272+
public String getPlayUri(){
273+
return DevMediaManager.getInstance().getPlayUri();
274+
}
275+
276+
277+
/**
278+
* 获取视频宽度
279+
* @return
280+
*/
281+
public int getVideoWidth() {
282+
return DevMediaManager.getInstance().getVideoWidth();
283+
}
284+
285+
/**
286+
* 获取视频高度
287+
* @return
288+
*/
289+
public int getVideoHeight() {
290+
return DevMediaManager.getInstance().getVideoHeight();
291+
}
292+
293+
/**
294+
* 获取当前播放时间
295+
* @return
296+
*/
297+
public int getCurrentPosition(){
298+
return DevMediaManager.getInstance().getCurrentPosition();
299+
}
300+
301+
/**
302+
* 获取资源总时间
303+
* @return
304+
*/
305+
public int getDuration(){
306+
return DevMediaManager.getInstance().getDuration();
307+
}
308+
309+
/**
310+
* 获取播放进度百分比
311+
* @return
312+
*/
313+
public int getPlayPercent(){
314+
return DevMediaManager.getInstance().getPlayPercent();
315+
}
316+
}

0 commit comments

Comments
 (0)