|
|
|
|
@ -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<String, String> 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<String, String> 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); |
|
|
|
|
} |
|
|
|
|
|