mirror of
https://github.com/zoriya/react-native-omni.git
synced 2026-08-05 05:36:17 +00:00
feat(android): allow both exoplayer and vlc
This commit is contained in:
@@ -15,7 +15,12 @@ import androidx.media3.common.C
|
||||
import androidx.media3.common.MediaItem
|
||||
import androidx.media3.common.MediaMetadata
|
||||
import androidx.media3.common.Player
|
||||
import androidx.media3.datasource.DefaultDataSource
|
||||
import androidx.media3.datasource.DefaultHttpDataSource
|
||||
import androidx.media3.exoplayer.ExoPlayer
|
||||
import androidx.media3.exoplayer.source.DefaultMediaSourceFactory
|
||||
import com.margelo.nitro.NitroModules
|
||||
import com.margelo.nitro.omni.AndroidBackend
|
||||
import com.margelo.nitro.omni.CastStatus
|
||||
import com.margelo.nitro.omni.HybridOmniPlayerSpec
|
||||
import com.margelo.nitro.omni.MixAudioMode
|
||||
@@ -35,17 +40,26 @@ import dev.zoriya.omni.utils.ThreadHelper.runOnMainThread
|
||||
import dev.zoriya.omni.utils.ThreadHelper.runOnMainThreadSync
|
||||
|
||||
@SuppressLint("UnsafeOptInUsageError")
|
||||
class OmniPlayer : HybridOmniPlayerSpec() {
|
||||
class OmniPlayer(private val backend: AndroidBackend = AndroidBackend.VLC) : HybridOmniPlayerSpec() {
|
||||
private val ctx = NitroModules.applicationContext ?: throw Error("No Context available!")
|
||||
|
||||
// exoplayer only, used to specify request headers.
|
||||
private var httpDataSourceFactory: DefaultHttpDataSource.Factory? = null
|
||||
|
||||
val player: Player = runOnMainThreadSync {
|
||||
// To use ExoPlayer, build it with an http data source and refresh its
|
||||
// request headers from the source on each change:
|
||||
// val http = DefaultHttpDataSource.Factory().setAllowCrossProtocolRedirects(true)
|
||||
// ExoPlayer.Builder(ctx)
|
||||
// .setMediaSourceFactory(DefaultMediaSourceFactory(DefaultDataSource.Factory(ctx, http)))
|
||||
// .build()
|
||||
// // in the source setter: http.setDefaultRequestProperties(firstSrc.headers)
|
||||
VlcPlayer(ctx)
|
||||
when (backend) {
|
||||
AndroidBackend.EXOPLAYER -> {
|
||||
val http = DefaultHttpDataSource.Factory().setAllowCrossProtocolRedirects(true)
|
||||
httpDataSourceFactory = http
|
||||
ExoPlayer.Builder(ctx)
|
||||
.setMediaSourceFactory(
|
||||
DefaultMediaSourceFactory(DefaultDataSource.Factory(ctx, http))
|
||||
)
|
||||
.build()
|
||||
}
|
||||
|
||||
AndroidBackend.VLC -> VlcPlayer(ctx)
|
||||
}
|
||||
}
|
||||
override val eventMap = EventMap(player)
|
||||
|
||||
@@ -207,6 +221,8 @@ class OmniPlayer : HybridOmniPlayerSpec() {
|
||||
return
|
||||
}
|
||||
|
||||
httpDataSourceFactory?.setDefaultRequestProperties(firstSrc.headers)
|
||||
|
||||
val currentItem = buildMediaItem(firstSrc, value.metadata, value.subtitles)
|
||||
val mediaItems = mutableListOf<MediaItem>()
|
||||
|
||||
|
||||
@@ -2,13 +2,15 @@ package dev.zoriya.omni
|
||||
|
||||
import android.util.Log
|
||||
import com.facebook.react.uimanager.ThemedReactContext
|
||||
import com.margelo.nitro.omni.AndroidBackend
|
||||
import com.margelo.nitro.omni.HybridOmniPlayerFactorySpec
|
||||
import com.margelo.nitro.omni.HybridOmniPlayerSpec
|
||||
import com.margelo.nitro.omni.PlayerBackend
|
||||
import com.margelo.nitro.omni.Source
|
||||
|
||||
class OmniPlayerFactory(val context: ThemedReactContext) : HybridOmniPlayerFactorySpec() {
|
||||
override fun createPlayer(props: Source?): HybridOmniPlayerSpec {
|
||||
return OmniPlayer().apply {
|
||||
override fun createPlayer(props: Source?, backend: PlayerBackend?): HybridOmniPlayerSpec {
|
||||
return OmniPlayer(backend?.android ?: AndroidBackend.VLC).apply {
|
||||
source = props
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user