如何在 ExoPlayer 中连接 MediaSource 的 ArrayList

adr*_*em7 1 android return-type kotlin exoplayer2.x

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

我可以用来ConcatenatingMediaSource连续播放两首歌曲,但我必须将它们作为单独的参数加载到此基金中。我不想对整个歌曲列表执行此操作。我试图找到这个问题的答案,但似乎有一些根本性的误解,因为我似乎无法复制其他人在其他 StackOverflow 问题或博客等中的努力。(许多博客显示了简单的两个媒体源播放列表,如 ExoPlayer 中所示)文档)。

此代码用于上下文:

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

这段代码就是问题所在:

    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])
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

adr*_*em7 5

好的,我刚刚找到了这个视频:https://www.youtube.com/watch ?v=svdq1BWl4r8

事实证明prepare,ExoPlayer 不必有 aMediaSource作为参数,但ConcatenatingMediaSource也可以有 a 作为参数。它们并不相同,但都被prepare函数所接受。

还值得注意的是,ConcatenatingMediaSource可以收到单个MediaSource. 这意味着不需要if对 的大小进行语句检查。MediaSource ArrayList

buildMediaSource因此,解决方案是更改to的返回类型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
    }
Run Code Online (Sandbox Code Playgroud)