如何在ExoPlayer中连接MediaSource的数组列表

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

我想知道如何使用ArrayList中的MediaSource在ExoPlayer中连续播放多于两首歌曲。

我可以使用ConcatenatingMediaSource来连续播放两首歌曲,但我必须将它们作为单独的参数加载到该库中。我不想对整个歌曲列表进行此操作。我试图找到答案,但似乎存在一些根本性的误解,因为我似乎无法在其他StackOverflow问题或博客等中复制其他人的努力。 docs)。

此代码用于上下文:

    private fun prepareExoPlayer(songs: ListSongs) {
        val uris = parseUris(songs)
        val mediaSource = buildMediaSource(uris)
        applyAudioAttributes()
        simpleExoPlayer!!.prepare(mediaSource, false, false)
    }

此代码是问题所在:

    private fun buildMediaSource(uris: ArrayList<Uri>): MediaSource {
        val userAgent = Util.getUserAgent(this, "MusicPlayer")
        val defaultMediaSource = DefaultDataSourceFactory(this, userAgent)
        val progressiveMediaSource = ProgressiveMediaSource.Factory(defaultMediaSource)
        val mediaSources = ArrayList<MediaSource>()

        for (uri in uris) {
            mediaSources.add(progressiveMediaSource.createMediaSource(uri))
        }

        return if (mediaSources.size == 1) {
            mediaSources[0]
        } else {
            val concatenatingMediaSource = ConcatenatingMediaSource()
            concatenatingMediaSource.addMediaSources(mediaSources)
//            ConcatenatingMediaSource(mediaSources[0], mediaSources[1])
        }
    }

在else语句中,我失败了,因为返回类型不是MediaSource,而是Unit。但是,最后一行上的注释代码可以正常工作。如何修改第二行和第三行才能播放我的歌曲列表?

android kotlin return-type exoplayer2.x
1个回答
0
投票

好,所以我才发现此视频:https://www.youtube.com/watch?v=svdq1BWl4r8

结果ExoPlayer的prepare不必具有MediaSource作为参数,但是也可以具有ConcatenatingMediaSource作为参数。它们并不相同,但都被prepare函数接受。

同样值得注意的是ConcatenatingMediaSource可以接收一个MediaSource。这意味着if语句不需要检查MediaSource ArrayList的大小。

因此,解决方案是将buildMediaSource的返回类型更改为ConcatenatingMediaSource并删除if语句。像这样:

    private fun buildMediaSource(uris: ArrayList<Uri>): ConcatenatingMediaSource {
        val userAgent = Util.getUserAgent(this, "MusicPlayer")
        val defaultMediaSource = DefaultDataSourceFactory(this, userAgent)
        val progressiveMediaSource = ProgressiveMediaSource.Factory(defaultMediaSource)
        val mediaSources = ArrayList<MediaSource>()

        for (uri in uris) {
            mediaSources.add(progressiveMediaSource.createMediaSource(uri))
        }

        val concatenatingMediaSource = ConcatenatingMediaSource()
            concatenatingMediaSource.addMediaSources(mediaSources)

        return concatenatingMediaSource
    }
© www.soinside.com 2019 - 2024. All rights reserved.