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 0126fe3cf..b27c83c1b 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 @@ -33,7 +33,7 @@ import java.util.Map; import tv.danmaku.ijk.media.player.IMediaPlayer; import tv.danmaku.ijk.media.player.ui.IjkVideoView; -public class Players implements Player.Listener, IMediaPlayer.OnInfoListener, IMediaPlayer.OnErrorListener, IMediaPlayer.OnPreparedListener, IMediaPlayer.OnCompletionListener, AnalyticsListener, ParseCallback { +public class Players implements Player.Listener, IMediaPlayer.Listener, AnalyticsListener, ParseCallback { private IjkVideoView ijkPlayer; private StringBuilder builder; @@ -83,10 +83,7 @@ public class Players implements Player.Listener, IMediaPlayer.OnInfoListener, IM private void setupIjk(IjkVideoView view) { ijkPlayer = view; ijkPlayer.setDecode(decode); - ijkPlayer.setOnInfoListener(this); - ijkPlayer.setOnErrorListener(this); - ijkPlayer.setOnPreparedListener(this); - ijkPlayer.setOnCompletionListener(this); + ijkPlayer.addListener(this); } public ExoPlayer exo() { @@ -408,18 +405,16 @@ public class Players implements Player.Listener, IMediaPlayer.OnInfoListener, IM } @Override - public boolean onInfo(IMediaPlayer mp, int what, int extra) { + public void onInfo(IMediaPlayer mp, int what, int extra) { switch (what) { case IMediaPlayer.MEDIA_INFO_BUFFERING_START: PlayerEvent.state(Player.STATE_BUFFERING); - return true; + break; case IMediaPlayer.MEDIA_INFO_BUFFERING_END: case IMediaPlayer.MEDIA_INFO_VIDEO_SEEK_RENDERING_START: case IMediaPlayer.MEDIA_INFO_AUDIO_SEEK_RENDERING_START: PlayerEvent.ready(); - return true; - default: - return true; + break; } } diff --git a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/AbstractMediaPlayer.java b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/AbstractMediaPlayer.java index 666158258..d394e684d 100644 --- a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/AbstractMediaPlayer.java +++ b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/AbstractMediaPlayer.java @@ -1,113 +1,53 @@ -/* - * Copyright (C) 2013-2014 Bilibili - * Copyright (C) 2013-2014 Zhang Rui - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package tv.danmaku.ijk.media.player; import tv.danmaku.ijk.media.player.misc.IMediaDataSource; -@SuppressWarnings("WeakerAccess") public abstract class AbstractMediaPlayer implements IMediaPlayer { - private OnPreparedListener mOnPreparedListener; - private OnCompletionListener mOnCompletionListener; - private OnBufferingUpdateListener mOnBufferingUpdateListener; - private OnSeekCompleteListener mOnSeekCompleteListener; - private OnVideoSizeChangedListener mOnVideoSizeChangedListener; - private OnErrorListener mOnErrorListener; - private OnInfoListener mOnInfoListener; - private OnTimedTextListener mOnTimedTextListener; - - public final void setOnPreparedListener(OnPreparedListener listener) { - mOnPreparedListener = listener; - } - - public final void setOnCompletionListener(OnCompletionListener listener) { - mOnCompletionListener = listener; - } - - public final void setOnBufferingUpdateListener(OnBufferingUpdateListener listener) { - mOnBufferingUpdateListener = listener; - } - - public final void setOnSeekCompleteListener(OnSeekCompleteListener listener) { - mOnSeekCompleteListener = listener; - } - - public final void setOnVideoSizeChangedListener(OnVideoSizeChangedListener listener) { - mOnVideoSizeChangedListener = listener; - } - - public final void setOnErrorListener(OnErrorListener listener) { - mOnErrorListener = listener; - } - - public final void setOnInfoListener(OnInfoListener listener) { - mOnInfoListener = listener; - } + private Listener mListener; - public final void setOnTimedTextListener(OnTimedTextListener listener) { - mOnTimedTextListener = listener; + public final void setListener(Listener listener) { + mListener = listener; } public void resetListeners() { - mOnPreparedListener = null; - mOnBufferingUpdateListener = null; - mOnCompletionListener = null; - mOnSeekCompleteListener = null; - mOnVideoSizeChangedListener = null; - mOnErrorListener = null; - mOnInfoListener = null; - mOnTimedTextListener = null; + mListener = null; } protected final void notifyOnPrepared() { - if (mOnPreparedListener != null) mOnPreparedListener.onPrepared(this); + if (mListener != null) mListener.onPrepared(this); } protected final void notifyOnCompletion() { - if (mOnCompletionListener != null) mOnCompletionListener.onCompletion(this); + if (mListener != null) mListener.onCompletion(this); } protected final void notifyOnBufferingUpdate(long position) { - if (mOnBufferingUpdateListener != null) mOnBufferingUpdateListener.onBufferingUpdate(this, position); + if (mListener != null) mListener.onBufferingUpdate(this, position); } protected final void notifyOnBufferingUpdate(int percent) { - if (mOnBufferingUpdateListener != null) mOnBufferingUpdateListener.onBufferingUpdate(this, percent); + if (mListener != null) mListener.onBufferingUpdate(this, percent); } protected final void notifyOnSeekComplete() { - if (mOnSeekCompleteListener != null) mOnSeekCompleteListener.onSeekComplete(this); + if (mListener != null) mListener.onSeekComplete(this); } protected final void notifyOnVideoSizeChanged(int width, int height, int sarNum, int sarDen) { - if (mOnVideoSizeChangedListener != null) mOnVideoSizeChangedListener.onVideoSizeChanged(this, width, height, sarNum, sarDen); + if (mListener != null) mListener.onVideoSizeChanged(this, width, height, sarNum, sarDen); } protected final boolean notifyOnError(int what, int extra) { - return mOnErrorListener != null && mOnErrorListener.onError(this, what, extra); + return mListener != null && mListener.onError(this, what, extra); } protected final void notifyOnInfo(int what, int extra) { - if (mOnInfoListener != null) mOnInfoListener.onInfo(this, what, extra); + if (mListener != null) mListener.onInfo(this, what, extra); } protected final void notifyOnTimedText(IjkTimedText text) { - if (mOnTimedTextListener != null) mOnTimedTextListener.onTimedText(this, text); + if (mListener != null) mListener.onTimedText(this, text); } public void setDataSource(IMediaDataSource mediaDataSource) { diff --git a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IMediaPlayer.java b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IMediaPlayer.java index f69cf6788..c85d4bc38 100644 --- a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IMediaPlayer.java +++ b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IMediaPlayer.java @@ -126,62 +126,21 @@ public interface IMediaPlayer { @Deprecated boolean isPlayable(); - void setOnPreparedListener(OnPreparedListener listener); - - void setOnCompletionListener(OnCompletionListener listener); - - void setOnBufferingUpdateListener( - OnBufferingUpdateListener listener); - - void setOnSeekCompleteListener( - OnSeekCompleteListener listener); - - void setOnVideoSizeChangedListener( - OnVideoSizeChangedListener listener); - - void setOnErrorListener(OnErrorListener listener); - - void setOnInfoListener(OnInfoListener listener); - - void setOnTimedTextListener(OnTimedTextListener listener); + void setListener(Listener listener); /*-------------------- * Listeners */ - interface OnPreparedListener { + interface Listener { void onPrepared(IMediaPlayer mp); - } - - interface OnCompletionListener { void onCompletion(IMediaPlayer mp); - } - - interface OnBufferingUpdateListener { - - void onBufferingUpdate(IMediaPlayer mp, long position); - - void onBufferingUpdate(IMediaPlayer mp, int percent); - } - - interface OnSeekCompleteListener { - void onSeekComplete(IMediaPlayer mp); - } - - interface OnVideoSizeChangedListener { - void onVideoSizeChanged(IMediaPlayer mp, int width, int height, - int sar_num, int sar_den); - } - - interface OnErrorListener { + void onInfo(IMediaPlayer mp, int what, int extra); boolean onError(IMediaPlayer mp, int what, int extra); - } - - interface OnInfoListener { - boolean onInfo(IMediaPlayer mp, int what, int extra); - } - - interface OnTimedTextListener { - void onTimedText(IMediaPlayer mp, IjkTimedText text); + default void onSeekComplete(IMediaPlayer mp) {} + default void onTimedText(IMediaPlayer mp, IjkTimedText text) {} + default void onBufferingUpdate(IMediaPlayer mp, int percent) {} + default void onBufferingUpdate(IMediaPlayer mp, long position) {} + default void onVideoSizeChanged(IMediaPlayer mp, int width, int height, int sar_num, int sar_den) {} } /*-------------------- 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 7a6e8aaf2..d8b166df0 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 @@ -23,7 +23,7 @@ import tv.danmaku.ijk.media.player.R; import tv.danmaku.ijk.media.player.misc.ITrackInfo; import tv.danmaku.ijk.media.player.misc.IjkTrackInfo; -public class IjkVideoView extends FrameLayout implements MediaController.MediaPlayerControl { +public class IjkVideoView extends FrameLayout implements MediaController.MediaPlayerControl, IMediaPlayer.Listener { private final String TAG = IjkVideoView.class.getSimpleName(); @@ -61,17 +61,12 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl private long mCurrentBufferPosition; private float mCurrentSpeed; - private IMediaPlayer.OnCompletionListener mOnCompletionListener; - private IMediaPlayer.OnPreparedListener mOnPreparedListener; - private IMediaPlayer.OnErrorListener mOnErrorListener; - private IMediaPlayer.OnInfoListener mOnInfoListener; - private IRenderView.ISurfaceHolder mSurfaceHolder; + private IMediaPlayer.Listener mListener; private IRenderView mRenderView; private final SubtitleView mSubtitleView; private final FrameLayout mContentFrame; - private final Context mContext; private IjkMediaPlayer mPlayer; public IjkVideoView(Context context) { @@ -84,7 +79,6 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl public IjkVideoView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); - mContext = context.getApplicationContext(); LayoutInflater.from(context).inflate(R.layout.ijk_player_view, this); mContentFrame = findViewById(R.id.ijk_content_frame); mSubtitleView = findViewById(R.id.ijk_subtitle); @@ -93,6 +87,10 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl mCurrentSpeed = 1; } + public void addListener(IMediaPlayer.Listener listener) { + mListener = listener; + } + public void setRender(int render) { mCurrentRender = render; if (mPlayer == null) return; @@ -139,7 +137,7 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl private void openVideo(Uri uri, Map headers) { release(false); - AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); + AudioManager am = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); am.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); try { createPlayer(uri); @@ -148,7 +146,7 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl setRender(mCurrentRender); mCurrentBufferPosition = 0; mCurrentBufferPercentage = 0; - mPlayer.setDataSource(mContext, uri, headers); + mPlayer.setDataSource(getContext(), uri, headers); bindSurfaceHolder(mPlayer, mSurfaceHolder); mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mPlayer.setScreenOnWhilePlaying(true); @@ -156,7 +154,7 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl mCurrentState = STATE_PREPARING; } catch (Throwable e) { Log.e(TAG, "Unable to open content: " + uri, e); - mErrorListener.onError(mPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0); + onError(mPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0); mCurrentState = STATE_ERROR; mTargetState = STATE_ERROR; } @@ -168,123 +166,6 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl headers.remove(Utils.USER_AGENT); } - IMediaPlayer.OnVideoSizeChangedListener mSizeChangedListener = new IMediaPlayer.OnVideoSizeChangedListener() { - @Override - public void onVideoSizeChanged(IMediaPlayer mp, int width, int height, int sarNum, int sarDen) { - mVideoWidth = mp.getVideoWidth(); - mVideoHeight = mp.getVideoHeight(); - mVideoSarNum = mp.getVideoSarNum(); - mVideoSarDen = mp.getVideoSarDen(); - if (mVideoWidth != 0 && mVideoHeight != 0) { - if (mRenderView != null) { - mRenderView.setVideoSize(mVideoWidth, mVideoHeight); - mRenderView.setVideoSampleAspectRatio(mVideoSarNum, mVideoSarDen); - } - requestLayout(); - } - } - }; - - IMediaPlayer.OnPreparedListener mPreparedListener = new IMediaPlayer.OnPreparedListener() { - @Override - public void onPrepared(IMediaPlayer mp) { - setPreferredTextLanguage(); - mCurrentState = STATE_PREPARED; - if (mStartPosition > 0) seekTo(mStartPosition); - if (mOnPreparedListener != null) mOnPreparedListener.onPrepared(mPlayer); - mVideoWidth = mp.getVideoWidth(); - mVideoHeight = mp.getVideoHeight(); - if (mVideoWidth != 0 && mVideoHeight != 0) { - if (mRenderView != null) { - mRenderView.setVideoSize(mVideoWidth, mVideoHeight); - mRenderView.setVideoSampleAspectRatio(mVideoSarNum, mVideoSarDen); - if (!mRenderView.shouldWaitForResize() || mSurfaceWidth == mVideoWidth && mSurfaceHeight == mVideoHeight) { - if (mTargetState == STATE_PLAYING) start(); - } - } - } else { - if (mTargetState == STATE_PLAYING) { - start(); - } - } - } - }; - - private final IMediaPlayer.OnCompletionListener mCompletionListener = new IMediaPlayer.OnCompletionListener() { - @Override - public void onCompletion(IMediaPlayer mp) { - mCurrentState = STATE_PLAYBACK_COMPLETED; - mTargetState = STATE_PLAYBACK_COMPLETED; - if (mOnCompletionListener != null) { - mOnCompletionListener.onCompletion(mPlayer); - } - } - }; - - private final IMediaPlayer.OnInfoListener mInfoListener = new IMediaPlayer.OnInfoListener() { - @Override - public boolean onInfo(IMediaPlayer mp, int what, int extra) { - if (mOnInfoListener != null) { - mOnInfoListener.onInfo(mp, what, extra); - } - if (what == IMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED) { - mVideoRotationDegree = extra; - if (mRenderView != null) mRenderView.setVideoRotation(extra); - } - return true; - } - }; - - private final IMediaPlayer.OnErrorListener mErrorListener = new IMediaPlayer.OnErrorListener() { - @Override - public boolean onError(IMediaPlayer mp, int framework_err, int impl_err) { - Log.d(TAG, "Error: " + framework_err + "," + impl_err); - mCurrentState = STATE_ERROR; - mTargetState = STATE_ERROR; - if (mOnErrorListener != null) { - if (mOnErrorListener.onError(mPlayer, framework_err, impl_err)) { - return true; - } - } - return true; - } - }; - - private final IMediaPlayer.OnBufferingUpdateListener mBufferingUpdateListener = new IMediaPlayer.OnBufferingUpdateListener() { - @Override - public void onBufferingUpdate(IMediaPlayer mp, long position) { - mCurrentBufferPosition = position; - } - - @Override - public void onBufferingUpdate(IMediaPlayer mp, int percent) { - mCurrentBufferPercentage = percent; - } - }; - - private final IMediaPlayer.OnTimedTextListener mOnTimedTextListener = new IMediaPlayer.OnTimedTextListener() { - @Override - public void onTimedText(IMediaPlayer mp, IjkTimedText text) { - mSubtitleView.onSubtitleChanged(text.getText()); - } - }; - - public void setOnPreparedListener(IMediaPlayer.OnPreparedListener l) { - mOnPreparedListener = l; - } - - public void setOnCompletionListener(IMediaPlayer.OnCompletionListener l) { - mOnCompletionListener = l; - } - - public void setOnErrorListener(IMediaPlayer.OnErrorListener l) { - mOnErrorListener = l; - } - - public void setOnInfoListener(IMediaPlayer.OnInfoListener l) { - mOnInfoListener = l; - } - private void bindSurfaceHolder(IMediaPlayer mp, IRenderView.ISurfaceHolder holder) { if (mp == null || holder == null) return; holder.bindToMediaPlayer(mp); @@ -328,7 +209,7 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl mPlayer = null; mCurrentState = STATE_IDLE; if (clearState) mTargetState = STATE_IDLE; - AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); + AudioManager am = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); am.abandonAudioFocus(null); } @@ -367,7 +248,7 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl @Override public void seekTo(int positionMs) { if (!isInPlaybackState()) return; - mInfoListener.onInfo(mPlayer, IMediaPlayer.MEDIA_INFO_BUFFERING_START, 0); + onInfo(mPlayer, IMediaPlayer.MEDIA_INFO_BUFFERING_START, 0); mPlayer.seekTo(positionMs); mStartPosition = 0; } @@ -504,13 +385,7 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl private void createPlayer(Uri uri) { String url = uri.toString(); mPlayer = new IjkMediaPlayer(); - mPlayer.setOnPreparedListener(mPreparedListener); - mPlayer.setOnVideoSizeChangedListener(mSizeChangedListener); - mPlayer.setOnCompletionListener(mCompletionListener); - mPlayer.setOnErrorListener(mErrorListener); - mPlayer.setOnInfoListener(mInfoListener); - mPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener); - mPlayer.setOnTimedTextListener(mOnTimedTextListener); + mPlayer.setListener(this); mPlayer.setOption(codec, "skip_loop_filter", 48); mPlayer.setOption(format, "dns_cache_clear", 1); mPlayer.setOption(format, "dns_cache_timeout", -1); @@ -539,4 +414,76 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl mPlayer.setOption(format, "analyzeduration", 2 * 1000 * 1000); } } + + @Override + public void onPrepared(IMediaPlayer mp) { + setPreferredTextLanguage(); + mCurrentState = STATE_PREPARED; + if (mStartPosition > 0) seekTo(mStartPosition); + mListener.onPrepared(mPlayer); + mVideoWidth = mp.getVideoWidth(); + mVideoHeight = mp.getVideoHeight(); + if (mVideoWidth != 0 && mVideoHeight != 0) { + if (mRenderView != null) { + mRenderView.setVideoSize(mVideoWidth, mVideoHeight); + mRenderView.setVideoSampleAspectRatio(mVideoSarNum, mVideoSarDen); + if (!mRenderView.shouldWaitForResize() || mSurfaceWidth == mVideoWidth && mSurfaceHeight == mVideoHeight) { + if (mTargetState == STATE_PLAYING) start(); + } + } + } else if (mTargetState == STATE_PLAYING) { + start(); + } + } + + @Override + public void onCompletion(IMediaPlayer mp) { + mCurrentState = STATE_PLAYBACK_COMPLETED; + mTargetState = STATE_PLAYBACK_COMPLETED; + mListener.onCompletion(mPlayer); + } + + @Override + public void onInfo(IMediaPlayer mp, int what, int extra) { + mListener.onInfo(mp, what, extra); + if (what == IMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED) { + mVideoRotationDegree = extra; + if (mRenderView != null) mRenderView.setVideoRotation(extra); + } + } + + @Override + public boolean onError(IMediaPlayer mp, int what, int extra) { + mCurrentState = STATE_ERROR; + mTargetState = STATE_ERROR; + return mListener.onError(mPlayer, what, extra); + } + + @Override + public void onTimedText(IMediaPlayer mp, IjkTimedText text) { + mSubtitleView.onSubtitleChanged(text.getText()); + } + + @Override + public void onBufferingUpdate(IMediaPlayer mp, int percent) { + mCurrentBufferPercentage = percent; + } + + @Override + public void onBufferingUpdate(IMediaPlayer mp, long position) { + mCurrentBufferPosition = position; + } + + @Override + public void onVideoSizeChanged(IMediaPlayer mp, int width, int height, int sar_num, int sar_den) { + mVideoWidth = mp.getVideoWidth(); + mVideoHeight = mp.getVideoHeight(); + mVideoSarNum = mp.getVideoSarNum(); + mVideoSarDen = mp.getVideoSarDen(); + if (mVideoWidth != 0 && mVideoHeight != 0 && mRenderView != null) { + mRenderView.setVideoSize(mVideoWidth, mVideoHeight); + mRenderView.setVideoSampleAspectRatio(mVideoSarNum, mVideoSarDen); + requestLayout(); + } + } } \ No newline at end of file