Clean ijk code

pull/123/head
FongMi 3 years ago
parent 6436db582f
commit ee9115f37e
  1. 15
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  2. 86
      ijkplayer/src/main/java/tv/danmaku/ijk/media/player/AbstractMediaPlayer.java
  3. 57
      ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IMediaPlayer.java
  4. 221
      ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.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;
}
}

@ -1,113 +1,53 @@
/*
* Copyright (C) 2013-2014 Bilibili
* Copyright (C) 2013-2014 Zhang Rui <bbcallen@gmail.com>
*
* 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) {

@ -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) {}
}
/*--------------------

@ -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<String, String> 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();
}
}
}
Loading…
Cancel
Save