package com.shuyu.gsyvideoplayer.video.base; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.RectF; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Handler; import android.os.Looper; import androidx.annotation.AttrRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import android.util.AttributeSet; import android.view.InflateException; import android.view.Surface; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import com.shuyu.gsyvideoplayer.R; import com.shuyu.gsyvideoplayer.listener.GSYMediaPlayerListener; import com.shuyu.gsyvideoplayer.listener.VideoAllCallBack; import com.shuyu.gsyvideoplayer.utils.CommonUtil; import com.shuyu.gsyvideoplayer.utils.Debuger; import com.shuyu.gsyvideoplayer.utils.NetInfoModule; import java.io.File; import java.util.HashMap; import java.util.Map; import static com.shuyu.gsyvideoplayer.utils.CommonUtil.getTextSpeed; /** * 视频回调与状态处理等相关层 * Created by guoshuyu on 2017/8/2. */ public abstract class GSYVideoView extends GSYTextureRenderView implements GSYMediaPlayerListener { //正常 public static final int CURRENT_STATE_NORMAL = 0; //准备中 public static final int CURRENT_STATE_PREPAREING = 1; //播放中 public static final int CURRENT_STATE_PLAYING = 2; //开始缓冲 public static final int CURRENT_STATE_PLAYING_BUFFERING_START = 3; //暂停 public static final int CURRENT_STATE_PAUSE = 5; //自动播放结束 public static final int CURRENT_STATE_AUTO_COMPLETE = 6; //错误状态 public static final int CURRENT_STATE_ERROR = 7; //避免切换时频繁setup public static final int CHANGE_DELAY_TIME = 2000; //当前的播放状态 protected int mCurrentState = -1; //播放的tag,防止错误,因为普通的url也可能重复 protected int mPlayPosition = -22; //屏幕宽度 protected int mScreenWidth; //屏幕高度 protected int mScreenHeight; //缓存进度 protected int mBufferPoint; //备份缓存前的播放状态 protected int mBackUpPlayingBufferState = -1; //从哪个开始播放 protected long mSeekOnStart = -1; //当前的播放位置 protected long mCurrentPosition; //保存切换时的时间,避免频繁契合 protected long mSaveChangeViewTIme = 0; //播放速度 protected float mSpeed = 1; //是否播边边缓冲 protected boolean mCache = false; //当前是否全屏 protected boolean mIfCurrentIsFullscreen = false; //循环 protected boolean mLooping = false; //是否播放过 protected boolean mHadPlay = false; //是否发送了网络改变 protected boolean mNetChanged = false; //是否不变调 protected boolean mSoundTouch = false; //是否需要显示暂停锁定效果 protected boolean mShowPauseCover = false; //是否准备完成前调用了暂停 protected boolean mPauseBeforePrepared = false; //Prepared之后是否自动开始播放 protected boolean mStartAfterPrepared = true; //Prepared protected boolean mHadPrepared = false; //是否播放器当失去音频焦点 protected boolean mReleaseWhenLossAudio = true; //音频焦点的监听 protected AudioManager mAudioManager; //播放的tag,防止错误,因为普通的url也可能重复 protected String mPlayTag = ""; //上下文 protected Context mContext; //原来的url protected String mOriginUrl; //转化后的URL protected String mUrl; //标题 protected String mTitle; //网络状态 protected String mNetSate = "NORMAL"; // 是否需要覆盖拓展类型 protected String mOverrideExtension; //缓存路径,可不设置 protected File mCachePath; //视频回调 protected VideoAllCallBack mVideoAllCallBack; //http request header protected Map mMapHeadData = new HashMap<>(); //网络监听 protected NetInfoModule mNetInfoModule; public GSYVideoView(@NonNull Context context) { super(context); init(context); } public GSYVideoView(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(context); } public GSYVideoView(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } public GSYVideoView(Context context, Boolean fullFlag) { super(context); mIfCurrentIsFullscreen = fullFlag; init(context); } @Override protected void showPauseCover() { if (mCurrentState == CURRENT_STATE_PAUSE && mFullPauseBitmap != null && !mFullPauseBitmap.isRecycled() && mShowPauseCover && mSurface != null && mSurface.isValid()) { if (getGSYVideoManager().isSurfaceSupportLockCanvas()) { try { RectF rectF = new RectF(0, 0, mTextureView.getWidth(), mTextureView.getHeight()); Canvas canvas = mSurface.lockCanvas(new Rect(0, 0, mTextureView.getWidth(), mTextureView.getHeight())); if (canvas != null) { canvas.drawBitmap(mFullPauseBitmap, null, rectF, null); mSurface.unlockCanvasAndPost(canvas); } } catch (Exception e) { e.printStackTrace(); } } } } @Override protected void releasePauseCover() { try { if (mCurrentState != CURRENT_STATE_PAUSE && mFullPauseBitmap != null && !mFullPauseBitmap.isRecycled() && mShowPauseCover) { mFullPauseBitmap.recycle(); mFullPauseBitmap = null; } } catch (Exception e) { e.printStackTrace(); } } @Override public int getCurrentVideoWidth() { if (getGSYVideoManager() != null) { return getGSYVideoManager().getVideoWidth(); } return 0; } @Override public int getCurrentVideoHeight() { if (getGSYVideoManager() != null) { return getGSYVideoManager().getVideoHeight(); } return 0; } @Override public int getVideoSarNum() { if (getGSYVideoManager() != null) { return getGSYVideoManager().getVideoSarNum(); } return 0; } @Override public int getVideoSarDen() { if (getGSYVideoManager() != null) { return getGSYVideoManager().getVideoSarDen(); } return 0; } protected void updatePauseCover() { if ((mFullPauseBitmap == null || mFullPauseBitmap.isRecycled()) && mShowPauseCover) { try { initCover(); } catch (Exception e) { e.printStackTrace(); mFullPauseBitmap = null; } } } protected Context getActivityContext() { return CommonUtil.getActivityContext(getContext()); } protected void init(Context context) { if (getActivityContext() != null) { this.mContext = getActivityContext(); } else { this.mContext = context; } initInflate(mContext); mTextureViewContainer = (ViewGroup) findViewById(R.id.surface_container); if (isInEditMode()) return; mScreenWidth = mContext.getResources().getDisplayMetrics().widthPixels; mScreenHeight = mContext.getResources().getDisplayMetrics().heightPixels; mAudioManager = (AudioManager) mContext.getApplicationContext().getSystemService(Context.AUDIO_SERVICE); } protected void initInflate(Context context) { try { View.inflate(context, getLayoutId(), this); } catch (InflateException e) { if (e.toString().contains("GSYImageCover")) { Debuger.printfError("********************\n" + "***** 注意 *****" + "********************\n" + "*该版本需要清除布局文件中的GSYImageCover\n" + "**** Attention ***\n" + "*Please remove GSYImageCover from Layout in this Version\n" + "********************\n"); e.printStackTrace(); throw new InflateException("该版本需要清除布局文件中的GSYImageCover,please remove GSYImageCover from your layout"); } else { e.printStackTrace(); } } } /** * 开始播放逻辑 */ protected void startButtonLogic() { if (mVideoAllCallBack != null && (mCurrentState == CURRENT_STATE_NORMAL || mCurrentState == CURRENT_STATE_AUTO_COMPLETE)) { Debuger.printfLog("onClickStartIcon"); mVideoAllCallBack.onClickStartIcon(mOriginUrl, mTitle, this); } else if (mVideoAllCallBack != null) { Debuger.printfLog("onClickStartError"); mVideoAllCallBack.onClickStartError(mOriginUrl, mTitle, this); } prepareVideo(); } /** * 开始状态视频播放 */ protected void prepareVideo() { startPrepare(); } protected void startPrepare() { if (getGSYVideoManager().listener() != null) { getGSYVideoManager().listener().onCompletion(); } if (mVideoAllCallBack != null) { Debuger.printfLog("onStartPrepared"); mVideoAllCallBack.onStartPrepared(mOriginUrl, mTitle, this); } getGSYVideoManager().setListener(this); getGSYVideoManager().setPlayTag(mPlayTag); getGSYVideoManager().setPlayPosition(mPlayPosition); mAudioManager.requestAudioFocus(onAudioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); try { if (mContext instanceof Activity) { ((Activity) mContext).getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } } catch (Exception e) { e.printStackTrace(); } mBackUpPlayingBufferState = -1; getGSYVideoManager().prepare(mUrl, (mMapHeadData == null) ? new HashMap() : mMapHeadData, mLooping, mSpeed, mCache, mCachePath, mOverrideExtension); setStateAndUi(CURRENT_STATE_PREPAREING); } /** * 监听是否有外部其他多媒体开始播放 */ protected AudioManager.OnAudioFocusChangeListener onAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() { @Override public void onAudioFocusChange(int focusChange) { switch (focusChange) { case AudioManager.AUDIOFOCUS_GAIN: onGankAudio(); break; case AudioManager.AUDIOFOCUS_LOSS: onLossAudio(); break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: onLossTransientAudio(); break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: onLossTransientCanDuck(); break; } } }; /** * 获得了Audio Focus */ protected void onGankAudio() { } /** * 失去了Audio Focus,并将会持续很长的时间 */ protected void onLossAudio() { new Handler(Looper.getMainLooper()).post(new Runnable() { public void run() { if (GSYVideoView.this.mReleaseWhenLossAudio) { GSYVideoView.this.releaseVideos(); } else { GSYVideoView.this.onVideoPause(); } } }); } /** * 暂时失去Audio Focus,并会很快再次获得 */ protected void onLossTransientAudio() { try { this.onVideoPause(); } catch (Exception var2) { var2.printStackTrace(); } } /** * 暂时失去AudioFocus,但是可以继续播放,不过要在降低音量 */ protected void onLossTransientCanDuck() { } /** * 设置播放URL * * @param url 播放url * @param cacheWithPlay 是否边播边缓存 * @param title title * @return */ public boolean setUp(String url, boolean cacheWithPlay, String title) { return setUp(url, cacheWithPlay, ((File) null), title); } /** * 设置播放URL * * @param url 播放url * @param cacheWithPlay 是否边播边缓存 * @param cachePath 缓存路径,如果是M3U8或者HLS,请设置为false * @param mapHeadData 头部信息 * @param title title * @return */ public boolean setUp(String url, boolean cacheWithPlay, File cachePath, Map mapHeadData, String title) { if (setUp(url, cacheWithPlay, cachePath, title)) { if (this.mMapHeadData != null) { this.mMapHeadData.clear(); } else { this.mMapHeadData = new HashMap<>(); } if (mapHeadData != null) { this.mMapHeadData.putAll(mapHeadData); } return true; } return false; } /** * 设置播放URL * * @param url 播放url * @param cacheWithPlay 是否边播边缓存 * @param cachePath 缓存路径,如果是M3U8或者HLS,请设置为false * @param title title * @return */ public boolean setUp(String url, boolean cacheWithPlay, File cachePath, String title) { return setUp(url, cacheWithPlay, cachePath, title, true); } /** * 设置播放URL * * @param url 播放url * @param cacheWithPlay 是否边播边缓存 * @param cachePath 缓存路径,如果是M3U8或者HLS,请设置为false * @param title title * @param changeState 是否修改状态 * @return */ protected boolean setUp(String url, boolean cacheWithPlay, File cachePath, String title, boolean changeState) { mCache = cacheWithPlay; mCachePath = cachePath; mOriginUrl = url; if (isCurrentMediaListener() && (System.currentTimeMillis() - mSaveChangeViewTIme) < CHANGE_DELAY_TIME) return false; mCurrentState = CURRENT_STATE_NORMAL; this.mUrl = url; this.mTitle = title; if (changeState) setStateAndUi(CURRENT_STATE_NORMAL); return true; } /** * 重置 */ public void onVideoReset() { setStateAndUi(CURRENT_STATE_NORMAL); } /** * 暂停状态 */ @Override public void onVideoPause() { if (mCurrentState == CURRENT_STATE_PREPAREING) { mPauseBeforePrepared = true; } try { if (getGSYVideoManager() != null && getGSYVideoManager().isPlaying()) { setStateAndUi(CURRENT_STATE_PAUSE); mCurrentPosition = getGSYVideoManager().getCurrentPosition(); if (getGSYVideoManager() != null) getGSYVideoManager().pause(); } } catch (Exception e) { e.printStackTrace(); } } /** * 恢复暂停状态 */ @Override public void onVideoResume() { onVideoResume(true); } /** * 恢复暂停状态 * * @param seek 是否产生seek动作 */ @Override public void onVideoResume(boolean seek) { mPauseBeforePrepared = false; if (mCurrentState == CURRENT_STATE_PAUSE) { try { if (mCurrentPosition >= 0 && getGSYVideoManager() != null) { if (seek) { getGSYVideoManager().seekTo(mCurrentPosition); } getGSYVideoManager().start(); setStateAndUi(CURRENT_STATE_PLAYING); if (mAudioManager != null && !mReleaseWhenLossAudio) { mAudioManager.requestAudioFocus(onAudioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); } mCurrentPosition = 0; } } catch (Exception e) { e.printStackTrace(); } } } /** * 处理因切换网络而导致的问题 */ protected void netWorkErrorLogic() { final long currentPosition = getCurrentPositionWhenPlaying(); Debuger.printfError("******* Net State Changed. renew player to connect *******" + currentPosition); getGSYVideoManager().releaseMediaPlayer(); postDelayed(new Runnable() { @Override public void run() { setSeekOnStart(currentPosition); startPlayLogic(); } }, 500); } /** * 播放错误的时候,删除缓存文件 */ protected void deleteCacheFileWhenError() { clearCurrentCache(); Debuger.printfError("Link Or mCache Error, Please Try Again " + mOriginUrl); if (mCache) { Debuger.printfError("mCache Link " + mUrl); } mUrl = mOriginUrl; } @Override public void onPrepared() { if (mCurrentState != CURRENT_STATE_PREPAREING) return; mHadPrepared = true; if (mVideoAllCallBack != null && isCurrentMediaListener()) { Debuger.printfLog("onPrepared"); mVideoAllCallBack.onPrepared(mOriginUrl, mTitle, this); } if (!mStartAfterPrepared) { setStateAndUi(CURRENT_STATE_PAUSE); onVideoPause();//todo 加上这个 return; } startAfterPrepared(); } @Override public void onAutoCompletion() { setStateAndUi(CURRENT_STATE_AUTO_COMPLETE); mSaveChangeViewTIme = 0; mCurrentPosition = 0; if (mTextureViewContainer.getChildCount() > 0) { mTextureViewContainer.removeAllViews(); } if (!mIfCurrentIsFullscreen) getGSYVideoManager().setLastListener(null); mAudioManager.abandonAudioFocus(onAudioFocusChangeListener); if (mContext instanceof Activity) { try { ((Activity) mContext).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } catch (Exception e) { e.printStackTrace(); } } releaseNetWorkState(); if (mVideoAllCallBack != null && isCurrentMediaListener()) { Debuger.printfLog("onAutoComplete"); mVideoAllCallBack.onAutoComplete(mOriginUrl, mTitle, this); } mHadPlay = false; } @Override public void onCompletion() { //make me normal first setStateAndUi(CURRENT_STATE_NORMAL); mSaveChangeViewTIme = 0; mCurrentPosition = 0; if (mTextureViewContainer.getChildCount() > 0) { mTextureViewContainer.removeAllViews(); } if (!mIfCurrentIsFullscreen) { getGSYVideoManager().setListener(null); getGSYVideoManager().setLastListener(null); } getGSYVideoManager().setCurrentVideoHeight(0); getGSYVideoManager().setCurrentVideoWidth(0); mAudioManager.abandonAudioFocus(onAudioFocusChangeListener); if (mContext instanceof Activity) { try { ((Activity) mContext).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } catch (Exception e) { e.printStackTrace(); } } releaseNetWorkState(); if (mVideoAllCallBack != null) { Debuger.printfLog("onComplete"); mVideoAllCallBack.onComplete(mOriginUrl, mTitle, this); } mHadPlay = false; } @Override public void onSeekComplete() { Debuger.printfLog("onSeekComplete"); } @Override public void onError(int what, int extra) { if (mNetChanged) { mNetChanged = false; netWorkErrorLogic(); if (mVideoAllCallBack != null) { mVideoAllCallBack.onPlayError(mOriginUrl, mTitle, this); } return; } if (what != 38 && what != -38) { setStateAndUi(CURRENT_STATE_ERROR); deleteCacheFileWhenError(); if (mVideoAllCallBack != null) { mVideoAllCallBack.onPlayError(mOriginUrl, mTitle, this); } } } @Override public void onInfo(int what, int extra) { if (what == MediaPlayer.MEDIA_INFO_BUFFERING_START) { mBackUpPlayingBufferState = mCurrentState; //避免在onPrepared之前就进入了buffering,导致一只loading if (mHadPlay && mCurrentState != CURRENT_STATE_PREPAREING && mCurrentState > 0) setStateAndUi(CURRENT_STATE_PLAYING_BUFFERING_START); } else if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END) { if (mBackUpPlayingBufferState != -1) { if (mBackUpPlayingBufferState == CURRENT_STATE_PLAYING_BUFFERING_START) { mBackUpPlayingBufferState = CURRENT_STATE_PLAYING; } if (mHadPlay && mCurrentState != CURRENT_STATE_PREPAREING && mCurrentState > 0) setStateAndUi(mBackUpPlayingBufferState); mBackUpPlayingBufferState = -1; } } else if (what == getGSYVideoManager().getRotateInfoFlag()) { mRotate = extra; Debuger.printfLog("Video Rotate Info " + extra); if (mTextureView != null) mTextureView.setRotation(mRotate); } } @Override public void onVideoSizeChanged() { int mVideoWidth = getGSYVideoManager().getCurrentVideoWidth(); int mVideoHeight = getGSYVideoManager().getCurrentVideoHeight(); if (mVideoWidth != 0 && mVideoHeight != 0 && mTextureView != null) { mTextureView.requestLayout(); } } @Override protected void setDisplay(Surface surface) { getGSYVideoManager().setDisplay(surface); } @Override protected void releaseSurface(Surface surface) { getGSYVideoManager().releaseSurface(surface); } /** * 清除当前缓存 */ public void clearCurrentCache() { if (getGSYVideoManager().isCacheFile() && mCache) { //是否为缓存文件 Debuger.printfError("Play Error " + mUrl); mUrl = mOriginUrl; getGSYVideoManager().clearCache(mContext, mCachePath, mOriginUrl); } else if (mUrl.contains("127.0.0.1")) { getGSYVideoManager().clearCache(getContext(), mCachePath, mOriginUrl); } } /** * 获取当前播放进度 */ public int getCurrentPositionWhenPlaying() { int position = 0; if (mCurrentState == CURRENT_STATE_PLAYING || mCurrentState == CURRENT_STATE_PAUSE) { try { position = (int) getGSYVideoManager().getCurrentPosition(); } catch (Exception e) { e.printStackTrace(); return position; } } if (position == 0 && mCurrentPosition > 0) { return (int) mCurrentPosition; } return position; } /** * 获取当前总时长 */ public int getDuration() { int duration = 0; try { duration = (int) getGSYVideoManager().getDuration(); } catch (Exception e) { e.printStackTrace(); return duration; } return duration; } /** * 释放吧 */ public void release() { mSaveChangeViewTIme = 0; if (isCurrentMediaListener() && (System.currentTimeMillis() - mSaveChangeViewTIme) > CHANGE_DELAY_TIME) { releaseVideos(); } } /** * prepared成功之后会开始播放 */ public void startAfterPrepared() { if (!mHadPrepared) { prepareVideo(); } try { if (getGSYVideoManager() != null) { getGSYVideoManager().start(); } setStateAndUi(CURRENT_STATE_PLAYING); if (getGSYVideoManager() != null && mSeekOnStart > 0) { getGSYVideoManager().seekTo(mSeekOnStart); mSeekOnStart = 0; } } catch (Exception e) { e.printStackTrace(); } addTextureView(); createNetWorkState(); listenerNetWorkState(); mHadPlay = true; if (mTextureView != null) { mTextureView.onResume(); } if (mPauseBeforePrepared) { onVideoPause(); mPauseBeforePrepared = false; } } protected boolean isCurrentMediaListener() { return getGSYVideoManager().listener() != null && getGSYVideoManager().listener() == this; } /** * 创建网络监听 */ protected void createNetWorkState() { if (mNetInfoModule == null) { mNetInfoModule = new NetInfoModule(mContext.getApplicationContext(), new NetInfoModule.NetChangeListener() { @Override public void changed(String state) { if (!mNetSate.equals(state)) { Debuger.printfError("******* change network state ******* " + state); mNetChanged = true; } mNetSate = state; } }); mNetSate = mNetInfoModule.getCurrentConnectionType(); } } /** * 监听网络状态 */ protected void listenerNetWorkState() { if (mNetInfoModule != null) { mNetInfoModule.onHostResume(); } } /** * 取消网络监听 */ protected void unListenerNetWorkState() { if (mNetInfoModule != null) { mNetInfoModule.onHostPause(); } } /** * 释放网络监听 */ protected void releaseNetWorkState() { if (mNetInfoModule != null) { mNetInfoModule.onHostPause(); mNetInfoModule = null; } } /************************* 需要继承处理部分 *************************/ /** * 退出全屏 * * @return 是否在全屏界面 */ protected abstract boolean backFromFull(Context context); /** * 释放播放器 */ protected abstract void releaseVideos(); /** * 设置播放显示状态 * * @param state */ protected abstract void setStateAndUi(int state); /** * 获取管理器桥接的实现 */ public abstract GSYVideoViewBridge getGSYVideoManager(); /** * 当前UI */ public abstract int getLayoutId(); /** * 开始播放 */ public abstract void startPlayLogic(); /************************* 公开接口 *************************/ /** * 获取当前播放状态 */ public int getCurrentState() { return mCurrentState; } /** * 根据状态判断是否播放中 */ public boolean isInPlayingState() { return (mCurrentState >= 0 && mCurrentState != CURRENT_STATE_NORMAL && mCurrentState != CURRENT_STATE_AUTO_COMPLETE && mCurrentState != CURRENT_STATE_ERROR); } /** * 播放tag防止错误,因为普通的url也可能重复 */ public String getPlayTag() { return mPlayTag; } /** * 播放tag防止错误,因为普通的url也可能重复 * * @param playTag 保证不重复就好 */ public void setPlayTag(String playTag) { this.mPlayTag = playTag; } public int getPlayPosition() { return mPlayPosition; } /** * 设置播放位置防止错位 */ public void setPlayPosition(int playPosition) { this.mPlayPosition = playPosition; } /** * 网络速度 * 注意,这里如果是开启了缓存,因为读取本地代理,缓存成功后还是存在速度的 * 再打开已经缓存的本地文件,网络速度才会回0.因为是播放本地文件了 */ public long getNetSpeed() { return getGSYVideoManager().getNetSpeed(); } /** * 网络速度 * 注意,这里如果是开启了缓存,因为读取本地代理,缓存成功后还是存在速度的 * 再打开已经缓存的本地文件,网络速度才会回0.因为是播放本地文件了 */ public String getNetSpeedText() { long speed = getNetSpeed(); return getTextSpeed(speed); } public long getSeekOnStart() { return mSeekOnStart; } /** * 从哪里开始播放 * 目前有时候前几秒有跳动问题,毫秒 * 需要在startPlayLogic之前,即播放开始之前 */ public void setSeekOnStart(long seekOnStart) { this.mSeekOnStart = seekOnStart; } /** * 缓冲进度/缓存进度 */ public int getBuffterPoint() { return mBufferPoint; } /** * 是否全屏 */ public boolean isIfCurrentIsFullscreen() { return mIfCurrentIsFullscreen; } public void setIfCurrentIsFullscreen(boolean ifCurrentIsFullscreen) { this.mIfCurrentIsFullscreen = ifCurrentIsFullscreen; } public boolean isLooping() { return mLooping; } /** * 设置循环 */ public void setLooping(boolean looping) { this.mLooping = looping; } /** * 设置播放过程中的回调 * * @param mVideoAllCallBack */ public void setVideoAllCallBack(VideoAllCallBack mVideoAllCallBack) { this.mVideoAllCallBack = mVideoAllCallBack; } public float getSpeed() { return mSpeed; } /** * 播放速度 */ public void setSpeed(float speed) { setSpeed(speed, false); } /** * 播放速度 * * @param speed 速度 * @param soundTouch 是否对6.0下开启变速不变调 */ public void setSpeed(float speed, boolean soundTouch) { this.mSpeed = speed; this.mSoundTouch = soundTouch; if (getGSYVideoManager() != null) { getGSYVideoManager().setSpeed(speed, soundTouch); } } /** * 播放中生效的播放数据 * * @param speed * @param soundTouch */ public void setSpeedPlaying(float speed, boolean soundTouch) { setSpeed(speed, soundTouch); getGSYVideoManager().setSpeedPlaying(speed, soundTouch); } public boolean isShowPauseCover() { return mShowPauseCover; } /** * 是否需要加载显示暂停的cover图片 * 打开状态下,暂停退到后台,再回到前台不会显示黑屏,但可以对某些机型有概率出现OOM * 关闭情况下,暂停退到后台,再回到前台显示黑屏 * 目前某些特定情况可能会出现切换视频时黑屏: * https://github.com/CarGuo/GSYVideoPlayer/issues/1757#issuecomment-751981100 * * @param showPauseCover 默认true */ public void setShowPauseCover(boolean showPauseCover) { this.mShowPauseCover = showPauseCover; } /** * seekto what you want */ public void seekTo(long position) { try { if (getGSYVideoManager() != null && position > 0) { getGSYVideoManager().seekTo(position); } } catch (Exception e) { e.printStackTrace(); } } public boolean isStartAfterPrepared() { return mStartAfterPrepared; } /** * 准备成功之后立即播放 * * @param startAfterPrepared 默认true,false的时候需要在prepared后调用startAfterPrepared() */ public void setStartAfterPrepared(boolean startAfterPrepared) { this.mStartAfterPrepared = startAfterPrepared; } public boolean isReleaseWhenLossAudio() { return mReleaseWhenLossAudio; } /** * 长时间失去音频焦点,暂停播放器 * * @param releaseWhenLossAudio 默认true,false的时候只会暂停 */ public void setReleaseWhenLossAudio(boolean releaseWhenLossAudio) { this.mReleaseWhenLossAudio = releaseWhenLossAudio; } public Map getMapHeadData() { return mMapHeadData; } /** * 单独设置mapHeader * * @param headData */ public void setMapHeadData(Map headData) { if (headData != null) { this.mMapHeadData = headData; } } public String getOverrideExtension() { return mOverrideExtension; } /** * 是否需要覆盖拓展类型,目前只针对exoPlayer内核模式有效 * * @param overrideExtension 比如传入 m3u8,mp4,avi 等类型 */ public void setOverrideExtension(String overrideExtension) { this.mOverrideExtension = overrideExtension; } }