如何在ExoPlayer2中显示VTT字幕?

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

如何在 Android 中使用 ExoPlayer2 设置并显示 url 中的字幕?目前,我用 Kotlin 编写,使用以下代码来设置带字幕的 ExoPlayer:

exoPlayer = SimpleExoPlayer.Builder(this).build()
    val subtitle = MediaItem.Subtitle(Uri.parse(SUBTITLES_URL), MimeTypes.TEXT_VTT, "en")
    val subtitles = arrayListOf(subtitle)
    val mediaItem = MediaItem.Builder()
        .setUri(movieSrc)
        .setSubtitles(subtitles)
        .build()
    exoPlayer.setMediaItem(mediaItem)
    exoPlayer.addListener(this)
    exoPlayer.prepare()

并使用以下代码在 ExoPlayer SubtitleView 中显示它们:

exoPlayer.addTextOutput {
        binding.exoSubtitles.onCues(it)
    }

我没有遇到任何异常,它只是没有显示任何idk...... 没有什么真正有效...真的需要一些帮助,提前谢谢你!

android kotlin exoplayer2.x subtitle
2个回答
5
投票

这是我使用的代码(我从互联网上得到的,我忘记了)

// create the simple cache
val leastRecentlyUsedCacheEvictor = LeastRecentlyUsedCacheEvictor(MAX_CACHE_SIZE)
val databaseProvider: DatabaseProvider = ExoDatabaseProvider(this)
val simpleCache = SimpleCache(cacheDir, leastRecentlyUsedCacheEvictor, databaseProvider)


// create http datasource
val defaultBandwidthMeter = DefaultBandwidthMeter.Builder(context).build()
val dataSourceFactory: DataSource.Factory = DefaultDataSourceFactory(
            context,
            DefaultHttpDataSourceFactory(
                System.getProperty("http.agent"),
                defaultBandwidthMeter
            )
        )

// create the player
val simplePlayer = ExoPlayerFactory.newSimpleInstance(context)
        simplePlayer.addListener(playerCallback)
        cacheDataSourceFactory = CacheDataSourceFactory(
            simpleCache,
            DefaultHttpDataSourceFactory(
                Util.getUserAgent(
                    context,
                    "exo"
                )
            )
        )

// create subtitle text format
val textFormat = Format.createTextSampleFormat(
                    null,
                    MimeTypes.TEXT_VTT,
                    C.SELECTION_FLAG_DEFAULT,
                    null
                )
// create the subtitle source
val subtitleSource = SingleSampleMediaSource.Factory(dataSourceFactory)
  .createMediaSource(Uri.parse(it), textFormat, C.TIME_UNSET)
                
// create the media source based from video/audio url
val mediaSource = ProgressiveMediaSource.Factory(cacheDataSourceFactory).createMediaSource(uri) 

// merge subtitle source and media source   
val mediaSourceWithsubtitle = MergingMediaSource(mediaSource, subtitleSource)

// setup the player
simplePlayer.prepare(mediaSourceWithsubtitle, true, true)

0
投票

以下解决方案适合我

 val dataSourceFactory = DefaultHttpDataSource.Factory().apply {
                setUserAgent(
                    Util.getUserAgent(
                    requireContext(),
                    getString(R.string.app_name)
                ))
            }
    
            val subtitleUri = Uri.parse("https://tears-of-steel-subtitles.s3.amazonaws.com/tears-en.vtt")
    
                val subtitle = SubtitleConfiguration.Builder(subtitleUri)
                    .setMimeType(MimeTypes.TEXT_VTT) // The correct MIME type (required).
                    .setLanguage("en") // MUST, The subtitle language (optional).
                    .setSelectionFlags(C.SELECTION_FLAG_DEFAULT) //MUST,  Selection flags for the track (optional).
                    .build()
    
                val subtitleSource = SingleSampleMediaSource.Factory(dataSourceFactory)
                    .createMediaSource(subtitle, C.TIME_UNSET)
    
    
                val mediaItem: MediaItem = MediaItem.Builder()
                    .setUri(uri)//videouri
                    .build()
    
                val mediaSource = ProgressiveMediaSource.Factory(dataSourceFactory)
                    .createMediaSource(mediaItem)
    
                // merge subtitle source and media source
                val mediaSourceWithsubtitle = MergingMediaSource(mediaSource, subtitleSource)
    
                 exoPlayer?.setMediaSource(mediaSourceWithsubtitle)
© www.soinside.com 2019 - 2024. All rights reserved.