release
FongMi 2 years ago
parent 1ceffc95ca
commit b5dae36975
  1. 2
      app/build.gradle
  2. 15
      app/src/main/java/com/fongmi/android/tv/api/Decoder.java
  3. 23
      app/src/main/java/com/fongmi/android/tv/player/exo/NextRenderersFactory.java

@ -137,8 +137,6 @@ dependencies {
implementation(ext: 'aar', name: 'lib-datasource-okhttp-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'lib-datasource-rtmp-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'lib-decoder-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'lib-decoder-av1-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'lib-decoder-ffmpeg-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'lib-exoplayer-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'lib-exoplayer-dash-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'lib-exoplayer-hls-release', group: 'fongmi', version: 'release')

@ -20,6 +20,8 @@ import javax.crypto.spec.SecretKeySpec;
public class Decoder {
private static final Pattern JS_URI = Pattern.compile("\"(\\.|\\.\\.)/(.?|.+?)\\.js\\?(.?|.+?)\"");
public static String getJson(String url) throws Exception {
String key = url.contains(";") ? url.split(";")[2] : "";
url = url.contains(";") ? url.split(";")[0] : url;
@ -33,12 +35,23 @@ public class Decoder {
}
private static String fix(String url, String data) {
if (url.startsWith("file") || url.startsWith("assets")) url = UrlUtil.convert(url);
url = UrlUtil.convert(url);
Matcher matcher = JS_URI.matcher(data);
while (matcher.find()) data = replace(url, data, matcher.group());
if (data.contains("../")) data = data.replace("../", UrlUtil.resolve(url, "../"));
if (data.contains("./")) data = data.replace("./", UrlUtil.resolve(url, "./"));
if (data.contains("__JS1__")) data = data.replace("__JS1__", "./");
if (data.contains("__JS2__")) data = data.replace("__JS2__", "../");
return data;
}
private static String replace(String url, String data, String ext) {
String t = ext.replace("\"./", "\"" + UrlUtil.resolve(url, "./"));
t = t.replace("\"../", "\"" + UrlUtil.resolve(url, "../"));
t = t.replace("./", "__JS1__").replace("../", "__JS2__");
return data.replace(ext, t);
}
public static String getExt(String ext) {
try {
return base64(getData(ext.substring(4)));

@ -7,6 +7,8 @@ import androidx.annotation.NonNull;
import androidx.media3.common.util.Log;
import androidx.media3.exoplayer.DefaultRenderersFactory;
import androidx.media3.exoplayer.Renderer;
import androidx.media3.exoplayer.audio.AudioRendererEventListener;
import androidx.media3.exoplayer.audio.AudioSink;
import androidx.media3.exoplayer.mediacodec.MediaCodecSelector;
import androidx.media3.exoplayer.video.VideoRendererEventListener;
@ -14,24 +16,39 @@ import com.fongmi.android.tv.player.Players;
import java.util.ArrayList;
import io.github.anilbeesetti.nextlib.media3ext.ffdecoder.FfmpegAudioRenderer;
import io.github.anilbeesetti.nextlib.media3ext.ffdecoder.FfmpegVideoRenderer;
public class NextRenderersFactory extends DefaultRenderersFactory {
private static final String TAG = NextRenderersFactory.class.getSimpleName();
private final int decode;
public NextRenderersFactory(@NonNull Context context, int decode) {
super(context);
this.decode = decode;
setEnableDecoderFallback(true);
setExtensionRendererMode(Players.isHard(decode) ? EXTENSION_RENDERER_MODE_ON : EXTENSION_RENDERER_MODE_PREFER);
}
@Override
protected void buildAudioRenderers(@NonNull Context context, int extensionRendererMode, @NonNull MediaCodecSelector mediaCodecSelector, boolean enableDecoderFallback, @NonNull AudioSink audioSink, @NonNull Handler eventHandler, @NonNull AudioRendererEventListener eventListener, @NonNull ArrayList<Renderer> out) {
super.buildAudioRenderers(context, extensionRendererMode, mediaCodecSelector, enableDecoderFallback, audioSink, eventHandler, eventListener, out);
int extensionRendererIndex = out.size();
if (extensionRendererMode == EXTENSION_RENDERER_MODE_PREFER) {
extensionRendererIndex--;
}
try {
Renderer renderer = new FfmpegAudioRenderer(eventHandler, eventListener, audioSink);
out.add(extensionRendererIndex++, renderer);
Log.i(TAG, "Loaded FfmpegAudioRenderer.");
} catch (Exception e) {
throw new RuntimeException("Error instantiating Ffmpeg extension", e);
}
}
@Override
protected void buildVideoRenderers(@NonNull Context context, int extensionRendererMode, @NonNull MediaCodecSelector mediaCodecSelector, boolean enableDecoderFallback, @NonNull Handler eventHandler, @NonNull VideoRendererEventListener eventListener, long allowedVideoJoiningTimeMs, @NonNull ArrayList<Renderer> out) {
super.buildVideoRenderers(context, extensionRendererMode, mediaCodecSelector, enableDecoderFallback, eventHandler, eventListener, allowedVideoJoiningTimeMs, out);
if (Players.isHard(decode)) return;
if (extensionRendererMode == EXTENSION_RENDERER_MODE_ON) return;
int extensionRendererIndex = out.size();
try {
Renderer renderer = new FfmpegVideoRenderer(allowedVideoJoiningTimeMs, eventHandler, eventListener, MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY);

Loading…
Cancel
Save