Skip to content

Commit 88cc4cc

Browse files
committed
优化AndroidMediaPlayer
1 parent 4235593 commit 88cc4cc

3 files changed

Lines changed: 52 additions & 34 deletions

File tree

dkplayer-java/src/main/java/com/dueeeke/videoplayer/player/AndroidMediaPlayer.java

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import android.media.AudioManager;
66
import android.media.MediaPlayer;
77
import android.net.Uri;
8+
import android.os.Build;
89
import android.view.Surface;
910
import android.view.SurfaceHolder;
1011

@@ -15,6 +16,7 @@ public class AndroidMediaPlayer extends AbstractPlayer {
1516
protected MediaPlayer mMediaPlayer;
1617
private int mBufferedPercent;
1718
private Context mAppContext;
19+
private boolean mIsPreparing;
1820

1921
public AndroidMediaPlayer(Context context) {
2022
mAppContext = context.getApplicationContext();
@@ -81,6 +83,7 @@ public void stop() {
8183
@Override
8284
public void prepareAsync() {
8385
try {
86+
mIsPreparing = true;
8487
mMediaPlayer.prepareAsync();
8588
} catch (IllegalStateException e) {
8689
mPlayerEventListener.onError();
@@ -89,8 +92,9 @@ public void prepareAsync() {
8992

9093
@Override
9194
public void reset() {
92-
mMediaPlayer.release();
93-
initPlayer();
95+
mMediaPlayer.reset();
96+
mMediaPlayer.setSurface(null);
97+
mMediaPlayer.setDisplay(null);
9498
mMediaPlayer.setVolume(1, 1);
9599
}
96100

@@ -165,12 +169,14 @@ public void setLooping(boolean isLooping) {
165169

166170
@Override
167171
public void setOptions() {
168-
// no support
169172
}
170173

171174
@Override
172175
public void setSpeed(float speed) {
173-
// no support
176+
// only support above Android M
177+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
178+
mMediaPlayer.setPlaybackParams(mMediaPlayer.getPlaybackParams().setSpeed(speed));
179+
}
174180
}
175181

176182
@Override
@@ -197,7 +203,15 @@ public void onCompletion(MediaPlayer mp) {
197203
private MediaPlayer.OnInfoListener onInfoListener = new MediaPlayer.OnInfoListener() {
198204
@Override
199205
public boolean onInfo(MediaPlayer mp, int what, int extra) {
200-
mPlayerEventListener.onInfo(what, extra);
206+
//解决MEDIA_INFO_VIDEO_RENDERING_START多次回调问题
207+
if (what == AbstractPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
208+
if (mIsPreparing) {
209+
mPlayerEventListener.onInfo(what, extra);
210+
mIsPreparing = false;
211+
}
212+
} else {
213+
mPlayerEventListener.onInfo(what, extra);
214+
}
201215
return true;
202216
}
203217
};

dkplayer-java/src/main/java/com/dueeeke/videoplayer/player/AudioFocusHelper.java

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -40,40 +40,44 @@ public void onAudioFocusChange(final int focusChange) {
4040
mHandler.post(new Runnable() {
4141
@Override
4242
public void run() {
43-
final VideoView videoView = mWeakVideoView.get();
44-
if (videoView == null) {
45-
return;
46-
}
47-
switch (focusChange) {
48-
case AudioManager.AUDIOFOCUS_GAIN://获得焦点
49-
case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT://暂时获得焦点
50-
if (mStartRequested || mPausedForLoss) {
51-
videoView.start();
52-
mStartRequested = false;
53-
mPausedForLoss = false;
54-
}
55-
if (!videoView.isMute())//恢复音量
56-
videoView.setVolume(1.0f, 1.0f);
57-
break;
58-
case AudioManager.AUDIOFOCUS_LOSS://焦点丢失
59-
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT://焦点暂时丢失
60-
if (videoView.isPlaying()) {
61-
mPausedForLoss = true;
62-
videoView.pause();
63-
}
64-
break;
65-
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK://此时需降低音量
66-
if (videoView.isPlaying() && !videoView.isMute()) {
67-
videoView.setVolume(0.1f, 0.1f);
68-
}
69-
break;
70-
}
43+
handleAudioFocusChange(focusChange);
7144
}
7245
});
7346

7447
mCurrentFocus = focusChange;
7548
}
7649

50+
private void handleAudioFocusChange(int focusChange) {
51+
final VideoView videoView = mWeakVideoView.get();
52+
if (videoView == null) {
53+
return;
54+
}
55+
switch (focusChange) {
56+
case AudioManager.AUDIOFOCUS_GAIN://获得焦点
57+
case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT://暂时获得焦点
58+
if (mStartRequested || mPausedForLoss) {
59+
videoView.start();
60+
mStartRequested = false;
61+
mPausedForLoss = false;
62+
}
63+
if (!videoView.isMute())//恢复音量
64+
videoView.setVolume(1.0f, 1.0f);
65+
break;
66+
case AudioManager.AUDIOFOCUS_LOSS://焦点丢失
67+
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT://焦点暂时丢失
68+
if (videoView.isPlaying()) {
69+
mPausedForLoss = true;
70+
videoView.pause();
71+
}
72+
break;
73+
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK://此时需降低音量
74+
if (videoView.isPlaying() && !videoView.isMute()) {
75+
videoView.setVolume(0.1f, 0.1f);
76+
}
77+
break;
78+
}
79+
}
80+
7781
/**
7882
* Requests to obtain the audio focus
7983
*/

dkplayer-java/src/main/java/com/dueeeke/videoplayer/player/VideoView.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ public class VideoView<P extends AbstractPlayer> extends FrameLayout
7878

7979
//--------- data sources ---------//
8080
protected String mUrl;//当前播放视频的地址
81-
protected AssetFileDescriptor mAssetFileDescriptor;//assets文件
8281
protected Map<String, String> mHeaders;//当前视频地址的请求头
82+
protected AssetFileDescriptor mAssetFileDescriptor;//assets文件
8383

8484
protected long mCurrentPosition;//当前正在播放视频的位置
8585

0 commit comments

Comments
 (0)