Как объединить ArrayList медиаресурсов в ExoPlayer - PullRequest
0 голосов
/ 30 апреля 2020

Я хотел бы знать, как иметь возможность воспроизводить более двух песен подряд в ExoPlayer, используя MediaSources, которые есть в ArrayList.

Я могу использовать ConcatenatingMediaSource, чтобы иметь возможность воспроизводить две песни спина к спине, но я должен загрузить их в этот фонд как отдельные параметры. Я не хочу делать это для целого списка песен. Я попытался найти ответ на этот вопрос и, похоже, у меня возникло какое-то фундаментальное недоразумение, поскольку я не могу повторить усилия других в других вопросах StackOverflow или блогах и т. Д. c. (Многие блоги показывают простой плейлист из двух источников, как в документации ExoPlayer.)

Этот код предназначен для контекста:

    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. Тем не менее, закомментированный код в последней строке работает нормально. Как изменить 2-ю и 3-ю последнюю строчку, чтобы можно было воспроизвести мой список песен?

1 Ответ

0 голосов
/ 30 апреля 2020

Хорошо, поэтому я только что нашел это видео: https://www.youtube.com/watch?v=svdq1BWl4r8

Получается prepare для ExoPlayer не обязательно должен иметь MediaSource в качестве параметра, но может иметь ConcatenatingMediaSource в качестве параметра. Они не одинаковы, но оба принимаются функцией prepare.

Стоит также отметить, что ConcatenatingMediaSource может получить один MediaSource. Это означает, что проверка оператора if размера MediaSource ArrayList не требуется.

Поэтому решение состоит в том, чтобы изменить тип возвращаемого значения buildMediaSource на ConcatenatingMediaSource и удалить если заявление. Как это:

    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
    }
...