diff --git a/app/build.gradle b/app/build.gradle index be5011389..379cf4de0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -112,7 +112,6 @@ dependencies { implementation 'androidx.room:room-runtime:2.6.1' implementation 'androidx.media:media:1.7.0' implementation 'cat.ereza:customactivityoncrash:2.4.0' - implementation('com.github.anilbeesetti.nextlib:nextlib-media3ext:0.7.1') { exclude group: 'androidx.media3', module: 'media3-exoplayer' } implementation 'com.github.bassaer:materialdesigncolors:1.0.0' implementation 'com.github.bumptech.glide:glide:4.16.0' implementation 'com.github.bumptech.glide:annotations:4.16.0' @@ -142,6 +141,7 @@ dependencies { implementation(ext: 'aar', name: 'dlna-core-release', group: 'fongmi', version: 'release') implementation(ext: 'aar', name: 'dlna-dmc-release', group: 'fongmi', version: 'release') implementation(ext: 'aar', name: 'dlna-dmr-release', group: 'fongmi', version: 'release') + implementation(ext: 'aar', name: 'media3ext-release', group: 'fongmi', version: 'release') implementation(ext: 'aar', name: 'lib-common-release', group: 'fongmi', version: 'release') implementation(ext: 'aar', name: 'lib-container-release', group: 'fongmi', version: 'release') implementation(ext: 'aar', name: 'lib-database-release', group: 'fongmi', version: 'release') diff --git a/app/libs/media3ext-release.aar b/app/libs/media3ext-release.aar new file mode 100644 index 000000000..b67325e5e Binary files /dev/null and b/app/libs/media3ext-release.aar differ diff --git a/app/src/main/java/com/fongmi/android/tv/player/exo/NextRenderersFactory.java b/app/src/main/java/com/fongmi/android/tv/player/exo/NextRenderersFactory.java index f0ab74689..c5171c7c3 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/exo/NextRenderersFactory.java +++ b/app/src/main/java/com/fongmi/android/tv/player/exo/NextRenderersFactory.java @@ -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 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 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);