diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java index f7e5b696b..ef9beb45c 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java @@ -92,7 +92,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; diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index 1f93aecd7..ef32391cd 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -140,7 +140,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, GroupP protected void initView() { mClock = Clock.create(Arrays.asList(mBinding.widget.clock, mBinding.display.clock)); mKeyDown = CustomKeyDownLive.create(this); - mPlayers = new Players().init(this); + mPlayers = Players.create(this); mHides = new ArrayList<>(); mR0 = this::setActivated; mR1 = this::hideControl; diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index d5b7aff4f..53cb5caf9 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -321,7 +321,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List mFrameParams = mBinding.video.getLayoutParams(); mClock = Clock.create(mBinding.display.clock); mDanmakuContext = DanmakuContext.create(); - mPlayers = new Players().init(this); + mPlayers = Players.create(this); mBroken = new ArrayList<>(); mR1 = this::hideControl; mR2 = this::updateFocus; 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 375836b92..4acf0274b 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 @@ -16,6 +16,7 @@ import androidx.media3.common.AudioAttributes; import androidx.media3.common.PlaybackException; import androidx.media3.common.Player; import androidx.media3.exoplayer.ExoPlayer; +import androidx.media3.exoplayer.util.EventLogger; import androidx.media3.ui.PlayerView; import com.fongmi.android.tv.App; @@ -68,15 +69,16 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal 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 headers; private MediaSessionCompat session; private IjkVideoView ijkPlayer; private DanmakuView danmuView; - private StringBuilder builder; - private Formatter formatter; private ExoPlayer exoPlayer; private ParseJob parseJob; - private Runnable runnable; private String format; private String url; private Sub sub; @@ -87,6 +89,10 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal private int error; private int retry; + public static Players create(Activity activity) { + return new Players(activity); + } + public static boolean isExo(int type) { return type == EXO; } @@ -107,14 +113,13 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal return player == SYS || player == IJK; } - public Players init(Activity activity) { + private Players(Activity activity) { player = Setting.getPlayer(); decode = Setting.getDecode(player); builder = new StringBuilder(); runnable = ErrorEvent::timeout; formatter = new Formatter(builder, Locale.getDefault()); createSession(activity); - return this; } private void createSession(Activity activity) { @@ -135,6 +140,7 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal private void setupExo(PlayerView view) { 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.addAnalyticsListener(new EventLogger()); exoPlayer.setHandleAudioBecomingNoisy(true); view.setRender(Setting.getRender()); exoPlayer.setPlayWhenReady(true); @@ -156,7 +162,7 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal public void setSub(Sub sub) { this.sub = sub; if (isIjk()) return; - setMediaSource(headers, url); + setMediaSource(); } public ExoPlayer exo() { @@ -188,6 +194,7 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal } public void setPlayer(int player) { + if (this.player != player) reset(); if (this.player != player) stop(); this.player = player; this.decode = getDecode(player); @@ -207,14 +214,15 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal public void reset() { removeTimeoutCheck(); - this.error = 0; - this.retry = 0; stopParse(); + error = 0; + retry = 0; } public void clear() { - this.headers = null; - this.url = null; + headers = null; + format = null; + url = null; } public int addRetry() { @@ -497,6 +505,10 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal parseJob = null; } + private void setMediaSource() { + setMediaSource(headers, url, format, null, new ArrayList<>(), Constant.TIMEOUT_PLAY); + } + public void setMediaSource(String url) { setMediaSource(new HashMap<>(), url); } @@ -505,10 +517,6 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal setMediaSource(headers, url, null, null, new ArrayList<>(), Constant.TIMEOUT_PLAY); } - private void setMediaSource(Map headers, String url, String format) { - setMediaSource(headers, url, format, 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); } diff --git a/app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java b/app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java index b32cb5985..24a599b2f 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java @@ -102,10 +102,10 @@ public class ExoUtil { boolean m3u8Ad = uri.toString().contains(".m3u8") && (Setting.isRemoveAd() || Sniffer.getRegex(uri).size() > 0); if (m3u8Ad) uri = Uri.parse(Server.get().getAddress(true).concat("/m3u8?url=").concat(URLEncoder.encode(uri.toString()))); MediaItem.Builder builder = new MediaItem.Builder().setUri(uri); + builder.setAllowChunklessPreparation(decode == Players.HARD); builder.setRequestMetadata(getRequestMetadata(headers, uri)); builder.setSubtitleConfigurations(getSubtitleConfigs(subs)); if (drm != null) builder.setDrmConfiguration(drm.get()); - builder.setAllowChunklessPreparation(decode == Players.HARD); if (mimeType != null) builder.setMimeType(mimeType); builder.setForceUseRtpTcp(Setting.getRtsp() == 1); builder.setAds(Arrays.asList("9999")); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index bbc434219..defc55d0c 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -162,7 +162,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, Custom 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<>(); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index f71ebf31e..6a7991633 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -304,10 +304,10 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo mDanmakuContext = DanmakuContext.create(); 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(Arrays.asList(mBinding.display.clock, mBinding.control.time));