From a7c2c923de08edc3c65a10744930e3a6ba4449e6 Mon Sep 17 00:00:00 2001 From: tunbmoon Date: Thu, 9 Apr 2026 13:41:07 +0800 Subject: [PATCH] refactor: replace Jellyfin FFmpeg with NextLib --- README-zh_Hans.md | 2 +- README-zh_Hant.md | 2 +- README.md | 2 +- app/build.gradle.kts | 4 ++++ .../astronia/player/PlayerFactory.kt | 18 ++++++++++++------ .../ui/page/settings/about/LicensePage.kt | 2 +- gradle/libs.versions.toml | 5 +++-- 7 files changed, 23 insertions(+), 12 deletions(-) diff --git a/README-zh_Hans.md b/README-zh_Hans.md index fe23d1c..8894a01 100644 --- a/README-zh_Hans.md +++ b/README-zh_Hans.md @@ -55,7 +55,7 @@ UI 设计和实现深受 [Seal](https://github.com/JunkFood02/Seal) 启发,许 - [Music You](https://github.com/Kyant0/MusicYou) 使用的库和工具: -- [Jellyfin Media3 FFmpeg Decoder](https://github.com/jellyfin/jellyfin-androidx-media) +- [NextLib Media3 Extension](https://github.com/anilbeesetti/nextlib) - [Material color utilities](https://github.com/material-foundation/material-color-utilities) - [Monet](https://github.com/Kyant0/Monet) - [Compose Markdown](https://github.com/jeziellago/compose-markdown) diff --git a/README-zh_Hant.md b/README-zh_Hant.md index fa7781b..c11e195 100644 --- a/README-zh_Hant.md +++ b/README-zh_Hant.md @@ -55,7 +55,7 @@ UI 設計和實作深受 [Seal](https://github.com/JunkFood02/Seal) 啟發,許 - [Music You](https://github.com/Kyant0/MusicYou) 使用的函式庫和工具: -- [Jellyfin Media3 FFmpeg Decoder](https://github.com/jellyfin/jellyfin-androidx-media) +- [NextLib Media3 Extension](https://github.com/anilbeesetti/nextlib) - [Material color utilities](https://github.com/material-foundation/material-color-utilities) - [Monet](https://github.com/Kyant0/Monet) - [Compose Markdown](https://github.com/jeziellago/compose-markdown) diff --git a/README.md b/README.md index 2833625..b2d0438 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ Additional UI elements and design concepts are borrowed from: - [Music You](https://github.com/Kyant0/MusicYou) Libraries and tools: -- [Jellyfin Media3 FFmpeg Decoder](https://github.com/jellyfin/jellyfin-androidx-media) +- [NextLib Media3 Extension](https://github.com/anilbeesetti/nextlib) - [Material color utilities](https://github.com/material-foundation/material-color-utilities) - [Monet](https://github.com/Kyant0/Monet) - [Compose Markdown](https://github.com/jeziellago/compose-markdown) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b3c2e6b..6e494ca 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -183,6 +183,10 @@ dependencies { implementation(libs.reorderable) implementation(libs.bundles.media3) + + // NextLib FFmpeg decoder + implementation(libs.nextlib.media3ext) + implementation(libs.nextlib.mediainfo) // Testing diff --git a/app/src/main/java/com/antoniegil/astronia/player/PlayerFactory.kt b/app/src/main/java/com/antoniegil/astronia/player/PlayerFactory.kt index 0989116..b457a74 100644 --- a/app/src/main/java/com/antoniegil/astronia/player/PlayerFactory.kt +++ b/app/src/main/java/com/antoniegil/astronia/player/PlayerFactory.kt @@ -10,9 +10,11 @@ import androidx.media3.datasource.rtmp.RtmpDataSource import androidx.media3.exoplayer.DefaultLoadControl import androidx.media3.exoplayer.DefaultRenderersFactory import androidx.media3.exoplayer.ExoPlayer +import androidx.media3.exoplayer.RenderersFactory import androidx.media3.exoplayer.analytics.AnalyticsListener import androidx.media3.exoplayer.source.DefaultMediaSourceFactory import androidx.media3.exoplayer.trackselection.DefaultTrackSelector +import io.github.anilbeesetti.nextlib.media3ext.ffdecoder.NextRenderersFactory @androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class) internal object PlayerFactory { @@ -41,12 +43,16 @@ internal object PlayerFactory { ) } - val renderersFactory = DefaultRenderersFactory(context).apply { - setEnableDecoderFallback(true) - setExtensionRendererMode( - if (hardwareAcceleration) DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON - else DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON - ) + val renderersFactory: RenderersFactory = if (hardwareAcceleration) { + DefaultRenderersFactory(context).apply { + setEnableDecoderFallback(true) + setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER) + } + } else { + NextRenderersFactory(context).apply { + setEnableDecoderFallback(true) + setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON) + } } val dataSourceFactory = DefaultHttpDataSource.Factory() diff --git a/app/src/main/java/com/antoniegil/astronia/ui/page/settings/about/LicensePage.kt b/app/src/main/java/com/antoniegil/astronia/ui/page/settings/about/LicensePage.kt index b541e72..68cf3e4 100644 --- a/app/src/main/java/com/antoniegil/astronia/ui/page/settings/about/LicensePage.kt +++ b/app/src/main/java/com/antoniegil/astronia/ui/page/settings/about/LicensePage.kt @@ -50,7 +50,7 @@ fun LicensePage(onNavigateBack: () -> Unit) { Credit("Android Jetpack", APACHE_V2, "https://github.com/androidx/androidx"), Credit("Kotlin", APACHE_V2, "https://kotlinlang.org/"), Credit("AndroidX Media3", APACHE_V2, "https://github.com/androidx/media"), - Credit("Jellyfin Media3 FFmpeg Decoder", LGPL_V2_1, "https://github.com/jellyfin/jellyfin-androidx-media"), + Credit("NextLib Media3 Extension", APACHE_V2, "https://github.com/anilbeesetti/nextlib"), Credit("FFmpeg", LGPL_V2_1, "https://ffmpeg.org/"), Credit("Material Design 3", APACHE_V2, "https://m3.material.io/"), Credit("Material Icons", APACHE_V2, "https://fonts.google.com/icons"), diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c281daf..028d3da 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -23,6 +23,7 @@ mmkv = "1.3.16" koin = "4.1.1" ktfmt = "0.25.0" media3 = "1.9.1" +nextLib = "0.8.5" leakcanary = "2.14" markdown = "0.5.8" reorderable = "3.0.0" @@ -92,7 +93,8 @@ androidx-media3-exoplayer-rtsp = { group = "androidx.media3", name = "media3-exo androidx-media3-datasource-rtmp = { group = "androidx.media3", name = "media3-datasource-rtmp", version.ref = "media3" } androidx-media3-ui = { group = "androidx.media3", name = "media3-ui", version.ref = "media3" } androidx-media3-session = { group = "androidx.media3", name = "media3-session", version.ref = "media3" } -androidx-media3-exoplayer-ffmpeg = { group = "org.jellyfin.media3", name = "media3-ffmpeg-decoder", version = "1.9.0+1" } +nextlib-media3ext = { group = "com.github.sintrs.nextlib", name = "nextlib-media3ext", version.ref = "nextLib" } +nextlib-mediainfo = { group = "com.github.sintrs.nextlib", name = "nextlib-mediainfo", version.ref = "nextLib" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } @@ -134,7 +136,6 @@ media3 = [ "androidx-media3-exoplayer-dash", "androidx-media3-exoplayer-rtsp", "androidx-media3-datasource-rtmp", - "androidx-media3-exoplayer-ffmpeg", "androidx-media3-ui", "androidx-media3-session" ]