exoplayer MediaItem setClippingConfiguration 如果使用 CacheDataSource 则不起作用

问题描述 投票:0回答:1

我的代码是:

val mediaItem: MediaItem = MediaItem.Builder()
        .setUri(recitationUri)
        .setMediaId("$surah:${ayah}")
        .setClippingConfiguration(
            ClippingConfiguration.Builder()
                .setStartPositionMs(ayahTiming.start)
                .setEndPositionMs(ayahTiming.end)
                .build()
        ).build()


    val mediaSourceFactory = ProgressiveMediaSource.Factory(MediaCache.getInstance(this@PlaybackService).cacheFactory)
    val source = mediaSourceFactory.createMediaSource(mediaItem)

MediaCache 类是:

const val CACHE_DIR_NAME = "cached_audio"
const val MAX_CACHE_SIZE = 256 * 1024 * 1024L//256MB

class MediaCache private constructor(context: Context) {

val cacheFactory: CacheDataSource.Factory

init {
    cacheFactory = setupExoPlayerCache(context)
}

companion object {
    @Volatile
    private lateinit var instance: MediaCache

    fun getInstance(context: Context): MediaCache {
        synchronized(this) {
            if (!::instance.isInitialized) {
                instance = MediaCache(context)
            }
            return instance
        }
    }
}

@SuppressLint("UnsafeOptInUsageError")
private fun setupExoPlayerCache(context: Context): CacheDataSource.Factory {
    val cacheEvictor = LeastRecentlyUsedCacheEvictor(MAX_CACHE_SIZE)
    val databaseProvider = StandaloneDatabaseProvider(context)
    val cache = SimpleCache(
        File(context.cacheDir, CACHE_DIR_NAME),
        cacheEvictor, databaseProvider
    )
    val upstreamFactory = DefaultDataSource.Factory(context)
    return CacheDataSource.Factory().apply {
        setCache(cache)
        setUpstreamDataSourceFactory(upstreamFactory)
        setFlags(CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR)
    }
}

}

我不知道为什么使用此代码

ClippingConfiguration
不起作用:

val mediaSourceFactory = ProgressiveMediaSource.Factory(MediaCache.getInstance(this@PlaybackService).cacheFactory)
val source = mediaSourceFactory.createMediaSource(mediaItem)

但是如果使用简单的媒体源就可以工作:

val source = DefaultMediaSourceFactory(this).createMediaSource(mediaItem)
android exoplayer2.x android-media3 exoplayer-media-item
1个回答
0
投票

使用

DefaultMediaSourceFactory
而不是
ProgressiveMediaSource
解决了我的问题。

val mediaSourceFactory = DefaultMediaSourceFactory(MediaCache.getInstance(this@PlaybackService).cacheFactory)
val source = mediaSourceFactory.createMediaSource(mediaItem)
© www.soinside.com 2019 - 2024. All rights reserved.