pull/586/head
FongMi 2 years ago
parent bcab537353
commit fc144b27ec
  1. 12
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java
  2. 10
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  3. 10
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  4. 78
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  5. 8
      app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java
  6. 10
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  7. 10
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java

@ -81,7 +81,7 @@ public class CastActivity extends BaseActivity implements CustomKeyDownCast.List
bindService(new Intent(this, DLNARendererService.class), this, Context.BIND_AUTO_CREATE);
mClock = Clock.create(mBinding.widget.clock);
mKeyDown = CustomKeyDownCast.create(this);
mPlayers = new Players().init(this);
mPlayers = Players.create(this);
mParser = new DIDLParser();
mR1 = this::hideControl;
mR2 = this::setTraffic;
@ -126,16 +126,15 @@ public class CastActivity extends BaseActivity implements CustomKeyDownCast.List
}
private void start() {
mPlayers.setMediaSource(mAction.getCurrentURI());
mPlayers.setMediaItem(mAction.getCurrentURI());
showProgress();
setMetadata();
hideCenter();
}
private void setVideoView() {
mPlayers.set(mBinding.exo);
mPlayers.setup(mBinding.exo);
setScale(scale = Setting.getScale());
mBinding.exo.setVisibility(View.VISIBLE);
findViewById(R.id.timeBar).setNextFocusUpId(R.id.reset);
mBinding.control.speed.setText(mPlayers.getSpeedText());
mBinding.control.decode.setText(mPlayers.getDecodeText());
@ -195,8 +194,7 @@ public class CastActivity extends BaseActivity implements CustomKeyDownCast.List
}
private void onDecode() {
mPlayers.toggleDecode();
mPlayers.set(mBinding.exo);
mPlayers.toggleDecode(mBinding.exo);
setDecode();
onReset();
}
@ -340,7 +338,7 @@ public class CastActivity extends BaseActivity implements CustomKeyDownCast.List
@Subscribe(threadMode = ThreadMode.MAIN)
public void onErrorEvent(ErrorEvent event) {
if (event.getCode() / 1000 == 4 && Players.isHard()) onDecode();
if (event.getCode() / 1000 == 4 && mPlayers.isHard()) onDecode();
else if (mPlayers.error()) onError(event);
else onReset();
}

@ -123,7 +123,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
protected void initView() {
mClock = Clock.create(mBinding.widget.clock);
mKeyDown = CustomKeyDownLive.create(this);
mPlayers = new Players().init(this);
mPlayers = Players.create(this);
mHides = new ArrayList<>();
mR0 = this::setActivated;
mR1 = this::hideControl;
@ -177,9 +177,8 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
}
private void setVideoView() {
mPlayers.set(mBinding.exo);
mPlayers.setup(mBinding.exo);
setScale(Setting.getLiveScale());
mBinding.exo.setVisibility(View.VISIBLE);
findViewById(R.id.timeBar).setNextFocusUpId(R.id.player);
mBinding.control.invert.setActivated(Setting.isInvert());
mBinding.control.across.setActivated(Setting.isAcross());
@ -385,8 +384,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
}
private void onDecode() {
mPlayers.toggleDecode();
mPlayers.set(mBinding.exo);
mPlayers.toggleDecode(mBinding.exo);
setDecode();
fetch();
}
@ -722,7 +720,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
@Subscribe(threadMode = ThreadMode.MAIN)
public void onErrorEvent(ErrorEvent event) {
if (event.getCode() / 1000 == 4 && Players.isHard()) onDecode();
if (event.getCode() / 1000 == 4 && mPlayers.isHard()) onDecode();
else if (mPlayers.error()) onError(event);
else fetch();
}

@ -277,7 +277,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List
mFrameParams = mBinding.video.getLayoutParams();
mClock = Clock.create(mBinding.widget.clock);
mKeyDown = CustomKeyDownVod.create(this);
mPlayers = new Players().init(this);
mPlayers = Players.create(this);
mBroken = new ArrayList<>();
mR1 = this::hideControl;
mR2 = this::updateFocus;
@ -373,8 +373,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List
}
private void setVideoView() {
mPlayers.set(mBinding.exo);
mBinding.exo.setVisibility(View.VISIBLE);
mPlayers.setup(mBinding.exo);
mBinding.control.decode.setText(mPlayers.getDecodeText());
mBinding.control.speed.setEnabled(mPlayers.canAdjustSpeed());
mBinding.control.reset.setText(ResUtil.getStringArray(R.array.select_reset)[Setting.getReset()]);
@ -842,8 +841,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List
}
private void onDecode() {
mPlayers.toggleDecode();
mPlayers.set(mBinding.exo);
mPlayers.toggleDecode(mBinding.exo);
setDecode();
onRefresh();
}
@ -1134,7 +1132,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List
@Subscribe(threadMode = ThreadMode.MAIN)
public void onErrorEvent(ErrorEvent event) {
if (isBackground()) return;
if (event.getCode() / 1000 == 4 && Players.isHard()) onDecode();
if (event.getCode() / 1000 == 4 && mPlayers.isHard()) onDecode();
else if (mPlayers.error()) onError(event);
else onRefresh();
}

@ -57,35 +57,41 @@ public class Players implements Player.Listener, ParseCallback {
public static final int SOFT = 0;
public static final int HARD = 1;
private final StringBuilder builder;
private final Formatter formatter;
private final Runnable runnable;
private Map<String, String> headers;
private MediaSessionCompat session;
private StringBuilder builder;
private Formatter formatter;
private ExoPlayer exoPlayer;
private ParseJob parseJob;
private Runnable runnable;
private String format;
private String url;
private Sub sub;
private long position;
private int decode;
private int error;
private int retry;
public static boolean isHard() {
return Setting.getDecode() == HARD;
public static Players create(Activity activity) {
return new Players(activity);
}
public static boolean isHard(int decode) {
return decode == HARD;
}
public static boolean isSoft() {
return Setting.getDecode() == SOFT;
public static boolean isSoft(int decode) {
return decode == SOFT;
}
public Players init(Activity activity) {
private Players(Activity activity) {
decode = Setting.getDecode();
builder = new StringBuilder();
runnable = ErrorEvent::timeout;
formatter = new Formatter(builder, Locale.getDefault());
createSession(activity);
return this;
}
private void createSession(Activity activity) {
@ -96,24 +102,24 @@ public class Players implements Player.Listener, ParseCallback {
MediaControllerCompat.setMediaController(activity, session.getController());
}
public void set(PlayerView exo) {
public void setup(PlayerView exo) {
releasePlayer();
setupExo(exo);
}
private void setupExo(PlayerView view) {
exoPlayer = new ExoPlayer.Builder(App.get()).setLoadControl(ExoUtil.buildLoadControl()).setTrackSelector(ExoUtil.buildTrackSelector()).setRenderersFactory(ExoUtil.buildRenderersFactory()).setMediaSourceFactory(ExoUtil.buildMediaSourceFactory()).build();
private void setupExo(PlayerView exo) {
exoPlayer = new ExoPlayer.Builder(App.get()).setLoadControl(ExoUtil.buildLoadControl()).setTrackSelector(ExoUtil.buildTrackSelector()).setRenderersFactory(ExoUtil.buildRenderersFactory(decode)).setMediaSourceFactory(ExoUtil.buildMediaSourceFactory()).build();
exoPlayer.setAudioAttributes(AudioAttributes.DEFAULT, true);
exoPlayer.setHandleAudioBecomingNoisy(true);
view.setRender(Setting.getRender());
exo.setRender(Setting.getRender());
exoPlayer.setPlayWhenReady(true);
exoPlayer.addListener(this);
view.setPlayer(exoPlayer);
exo.setPlayer(exoPlayer);
}
public void setSub(Sub sub) {
this.sub = sub;
setMediaSource(headers, url, format);
setMediaItem();
}
public ExoPlayer get() {
@ -209,6 +215,10 @@ public class Players implements Player.Listener, ParseCallback {
return getDuration() > 5 * 60 * 1000 && !exoPlayer.isCurrentMediaItemLive();
}
public boolean isHard() {
return decode == HARD;
}
public boolean isPortrait() {
return getVideoHeight() > getVideoWidth();
}
@ -222,7 +232,7 @@ public class Players implements Player.Listener, ParseCallback {
}
public String getDecodeText() {
return ResUtil.getStringArray(R.array.select_decode)[Setting.getDecode()];
return ResUtil.getStringArray(R.array.select_decode)[decode];
}
public String setSpeed(float speed) {
@ -255,8 +265,10 @@ public class Players implements Player.Listener, ParseCallback {
return setSpeed(speed);
}
public void toggleDecode() {
Setting.putDecode(Setting.getDecode() == HARD ? SOFT : HARD);
public void toggleDecode(PlayerView exo) {
decode = isHard(decode) ? SOFT : HARD;
Setting.putDecode(decode);
setup(exo);
}
public String getPositionTime(long time) {
@ -321,7 +333,7 @@ public class Players implements Player.Listener, ParseCallback {
} else if (isIllegal(channel.getUrl())) {
ErrorEvent.url();
} else {
setMediaSource(channel, timeout);
setMediaItem(channel, timeout);
}
}
@ -333,7 +345,7 @@ public class Players implements Player.Listener, ParseCallback {
} else if (isIllegal(result.getRealUrl())) {
ErrorEvent.url();
} else {
setMediaSource(result, timeout);
setMediaItem(result, timeout);
}
}
@ -360,28 +372,28 @@ public class Players implements Player.Listener, ParseCallback {
return subs;
}
public void setMediaSource(String url) {
setMediaSource(new HashMap<>(), url);
private void setMediaItem() {
setMediaItem(headers, url, format, null, new ArrayList<>(), Constant.TIMEOUT_PLAY);
}
private void setMediaSource(Map<String, String> headers, String url) {
setMediaSource(headers, url, null, null, new ArrayList<>(), Constant.TIMEOUT_PLAY);
public void setMediaItem(String url) {
setMediaItem(new HashMap<>(), url);
}
private void setMediaSource(Map<String, String> headers, String url, String format) {
setMediaSource(headers, url, format, null, new ArrayList<>(), Constant.TIMEOUT_PLAY);
private void setMediaItem(Map<String, String> headers, String url) {
setMediaItem(headers, url, null, null, new ArrayList<>(), Constant.TIMEOUT_PLAY);
}
private void setMediaSource(Channel channel, int timeout) {
setMediaSource(channel.getHeaders(), channel.getUrl(), channel.getFormat(), channel.getDrm(), new ArrayList<>(), timeout);
private void setMediaItem(Channel channel, int timeout) {
setMediaItem(channel.getHeaders(), channel.getUrl(), channel.getFormat(), channel.getDrm(), new ArrayList<>(), timeout);
}
private void setMediaSource(Result result, int timeout) {
setMediaSource(result.getHeaders(), result.getRealUrl(), result.getFormat(), result.getDrm(), result.getSubs(), timeout);
private void setMediaItem(Result result, int timeout) {
setMediaItem(result.getHeaders(), result.getRealUrl(), result.getFormat(), result.getDrm(), result.getSubs(), timeout);
}
private void setMediaSource(Map<String, String> headers, String url, String format, Drm drm, List<Sub> subs, int timeout) {
if (exoPlayer != null) exoPlayer.setMediaItem(ExoUtil.getMediaItem(this.headers = checkUa(headers), UrlUtil.uri(this.url = url), ExoUtil.getMimeType(this.format = format, error), drm, checkSub(subs)), position);
private void setMediaItem(Map<String, String> headers, String url, String format, Drm drm, List<Sub> subs, int timeout) {
if (exoPlayer != null) exoPlayer.setMediaItem(ExoUtil.getMediaItem(this.headers = checkUa(headers), UrlUtil.uri(this.url = url), ExoUtil.getMimeType(this.format = format, error), drm, checkSub(subs), decode), position);
if (exoPlayer != null) exoPlayer.prepare();
Logger.t(TAG).d(error + "," + url);
App.post(runnable, timeout);
@ -493,7 +505,7 @@ public class Players implements Player.Listener, ParseCallback {
@Override
public void onParseSuccess(Map<String, String> headers, String url, String from) {
if (!TextUtils.isEmpty(from)) Notify.show(ResUtil.getString(R.string.parse_from, from));
setMediaSource(headers, url);
setMediaItem(headers, url);
}
@Override

@ -46,8 +46,8 @@ public class ExoUtil {
return trackSelector;
}
public static RenderersFactory buildRenderersFactory() {
return new NextRenderersFactory(App.get()).setEnableDecoderFallback(true).setExtensionRendererMode(Players.isSoft() ? DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER : DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON);
public static RenderersFactory buildRenderersFactory(int decode) {
return new NextRenderersFactory(App.get()).setEnableDecoderFallback(true).setExtensionRendererMode(Players.isSoft(decode) ? DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER : DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON);
}
public static MediaSource.Factory buildMediaSourceFactory() {
@ -95,12 +95,12 @@ public class ExoUtil {
return errorCode >= PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED && errorCode <= PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED ? 2 : errorCode > 999 ? 1 : 0;
}
public static MediaItem getMediaItem(Map<String, String> headers, Uri uri, String mimeType, Drm drm, List<Sub> subs) {
public static MediaItem getMediaItem(Map<String, String> headers, Uri uri, String mimeType, Drm drm, List<Sub> subs, int decode) {
MediaItem.Builder builder = new MediaItem.Builder().setUri(uri);
builder.setAllowChunklessPreparation(Players.isHard(decode));
builder.setRequestMetadata(getRequestMetadata(headers, uri));
builder.setSubtitleConfigurations(getSubtitleConfigs(subs));
if (drm != null) builder.setDrmConfiguration(drm.get());
builder.setAllowChunklessPreparation(Players.isHard());
if (mimeType != null) builder.setMimeType(mimeType);
builder.setForceUseRtpTcp(Setting.getRtsp() == 1);
builder.setAds(Sniffer.getRegex(uri));

@ -145,7 +145,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
setPadding(mBinding.control.getRoot());
setPadding(mBinding.widget.epg, true);
setPadding(mBinding.recycler, true);
mPlayers = new Players().init(this);
mPlayers = Players.create(this);
mObserveEpg = this::setEpg;
mObserveUrl = this::start;
mHides = new ArrayList<>();
@ -200,9 +200,8 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
}
private void setVideoView() {
mPlayers.set(mBinding.exo);
mPlayers.setup(mBinding.exo);
setScale(Setting.getLiveScale());
mBinding.exo.setVisibility(View.VISIBLE);
mBinding.control.action.invert.setActivated(Setting.isInvert());
mBinding.control.action.across.setActivated(Setting.isAcross());
mBinding.control.action.change.setActivated(Setting.isChange());
@ -416,8 +415,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
}
private void onDecode() {
mPlayers.toggleDecode();
mPlayers.set(mBinding.exo);
mPlayers.toggleDecode(mBinding.exo);
setR1Callback();
setDecode();
fetch();
@ -781,7 +779,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
@Subscribe(threadMode = ThreadMode.MAIN)
public void onErrorEvent(ErrorEvent event) {
if (event.getCode() / 1000 == 4 && Players.isHard()) onDecode();
if (event.getCode() / 1000 == 4 && mPlayers.isHard()) onDecode();
else if (mPlayers.error()) onError(event);
else fetch();
}

@ -279,10 +279,10 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
mFrameParams = mBinding.video.getLayoutParams();
mBinding.progressLayout.showProgress();
mBinding.swipeLayout.setEnabled(false);
mPlayers = new Players().init(this);
mObserveDetail = this::setDetail;
mObservePlayer = this::setPlayer;
mObserveSearch = this::setSearch;
mPlayers = Players.create(this);
mDialogs = new ArrayList<>();
mBroken = new ArrayList<>();
mClock = Clock.create();
@ -366,8 +366,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
}
private void setVideoView() {
mPlayers.set(mBinding.exo);
mBinding.exo.setVisibility(View.VISIBLE);
mPlayers.setup(mBinding.exo);
mBinding.control.action.decode.setText(mPlayers.getDecodeText());
mBinding.control.action.speed.setEnabled(mPlayers.canAdjustSpeed());
mBinding.control.action.reset.setText(ResUtil.getStringArray(R.array.select_reset)[Setting.getReset()]);
@ -766,8 +765,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
}
private void onDecode() {
mPlayers.toggleDecode();
mPlayers.set(mBinding.exo);
mPlayers.toggleDecode(mBinding.exo);
setR1Callback();
setDecode();
onRefresh();
@ -1144,7 +1142,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
@Subscribe(threadMode = ThreadMode.MAIN)
public void onErrorEvent(ErrorEvent event) {
if (isRedirect()) return;
if (event.getCode() / 1000 == 4 && Players.isHard()) onDecode();
if (event.getCode() / 1000 == 4 && mPlayers.isHard()) onDecode();
else if (mPlayers.error()) onError(event);
else onRefresh();
}

Loading…
Cancel
Save