diff --git a/app/src/main/java/com/fongmi/android/tv/player/Players.java b/app/src/main/java/com/fongmi/android/tv/player/Players.java index b27c83c1b..ef5330c63 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/Players.java +++ b/app/src/main/java/com/fongmi/android/tv/player/Players.java @@ -81,8 +81,7 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic } private void setupIjk(IjkVideoView view) { - ijkPlayer = view; - ijkPlayer.setDecode(decode); + ijkPlayer = view.setPlayer(decode); ijkPlayer.addListener(this); } @@ -307,7 +306,7 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic } private void stopIjk() { - ijkPlayer.release(); + ijkPlayer.stop(); } private void releaseExo() { diff --git a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java index 425add027..9fbd4524a 100644 --- a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java +++ b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java @@ -57,11 +57,11 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl private long mCurrentBufferPosition; private float mCurrentSpeed; - private IRenderView.ISurfaceHolder mSurfaceHolder; private IMediaPlayer.Listener mListener; private IRenderView mRenderView; private final SubtitleView mSubtitleView; + private final AudioManager mAudioManager; private final FrameLayout mContentFrame; private IjkMediaPlayer mPlayer; @@ -76,6 +76,7 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl public IjkVideoView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); LayoutInflater.from(context).inflate(R.layout.ijk_player_view, this); + mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); mContentFrame = findViewById(R.id.ijk_content_frame); mSubtitleView = findViewById(R.id.ijk_subtitle); mCurrentState = STATE_IDLE; @@ -83,6 +84,13 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl mCurrentSpeed = 1; } + public IjkVideoView setPlayer(int decode) { + mPlayer = new IjkMediaPlayer(); + mPlayer.setListener(this); + mCurrentDecode = decode; + return this; + } + public void addListener(IMediaPlayer.Listener listener) { mListener = listener; } @@ -132,18 +140,16 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl } private void openVideo(Uri uri, Map headers) { - release(false); - AudioManager am = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); - am.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); try { - createPlayer(uri); + stop(); + setOption(uri); fixUserAgent(headers); setSpeed(mCurrentSpeed); setRender(mCurrentRender); mCurrentBufferPosition = 0; mCurrentBufferPercentage = 0; + mAudioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); mPlayer.setDataSource(getContext(), uri, headers); - bindSurfaceHolder(mPlayer, mSurfaceHolder); mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mPlayer.setScreenOnWhilePlaying(true); mPlayer.prepareAsync(); @@ -180,31 +186,33 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl @Override public void onSurfaceCreated(@NonNull IRenderView.ISurfaceHolder holder, int width, int height) { if (mPlayer != null) bindSurfaceHolder(mPlayer, holder); - mSurfaceHolder = holder; } @Override public void onSurfaceDestroyed(@NonNull IRenderView.ISurfaceHolder holder) { if (mPlayer != null) mPlayer.setDisplay(null); - mSurfaceHolder = null; } }; - public void release() { - release(true); + public void stop() { + if (mPlayer == null) return; + mPlayer.stop(); + mPlayer.reset(); + mTargetState = STATE_IDLE; + mCurrentState = STATE_IDLE; + mAudioManager.abandonAudioFocus(null); } - public void release(boolean clearState) { + public void release() { if (mPlayer == null) return; mSubtitleView.setText(""); removeRenderView(); mPlayer.reset(); mPlayer.release(); mPlayer = null; + mTargetState = STATE_IDLE; mCurrentState = STATE_IDLE; - if (clearState) mTargetState = STATE_IDLE; - AudioManager am = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); - am.abandonAudioFocus(null); + mAudioManager.abandonAudioFocus(null); } @Override @@ -218,11 +226,9 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl @Override public void pause() { - if (isInPlaybackState()) { - if (mPlayer.isPlaying()) { - mPlayer.pause(); - mCurrentState = STATE_PAUSED; - } + if (isInPlaybackState() && mPlayer.isPlaying()) { + mPlayer.pause(); + mCurrentState = STATE_PAUSED; } mTargetState = STATE_PAUSED; } @@ -262,10 +268,6 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl return mCurrentSpeed; } - public void setDecode(int decode) { - this.mCurrentDecode = decode; - } - public int getVideoWidth() { return mVideoWidth; } @@ -376,10 +378,8 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl } } - private void createPlayer(Uri uri) { + private void setOption(Uri uri) { String url = uri.toString(); - mPlayer = new IjkMediaPlayer(); - mPlayer.setListener(this); mPlayer.setOption(codec, "skip_loop_filter", 48); mPlayer.setOption(format, "dns_cache_clear", 1); mPlayer.setOption(format, "dns_cache_timeout", -1);