首页 > 解决方案 > 在 Android 中为 ExoPlayer 使用 ConcatenatingMediaSource

问题描述

我正在阅读有关ConcatenatingMediaSource为我ExoPlayer的 Android 制作播放列表的官方文档。在此链接中,他们提供了以下示例:

MediaSource firstSource =
    new ProgressiveMediaSource.Factory(...).createMediaSource(firstVideoUri);
MediaSource secondSource =
    new ProgressiveMediaSource.Factory(...).createMediaSource(secondVideoUri);
// Plays the first video, then the second video.
ConcatenatingMediaSource concatenatedSource =
    new ConcatenatingMediaSource(firstSource, secondSource);

在该示例中,它们有两个 URI,因此MediaSource将创建两个对象,然后将它们相互连接。

我明白了,但现在我的问题是:假设有 1000 个 URI(每个 URI 代表我的播放列表的一个曲目),那么我需要创建 1000 个MediaSource对象吗?如果我有超过 1000 个,让我们有 10000 个或更多呢?我可以猜测这不会节省内存,对吧?

那么,处理这种情况(超过 2 个MediaSource对象)的正确方法是什么?

标签: playlistexoplayer2.x

解决方案


你可以像这样使用它,假设歌曲列表包含 1000 或更多,它会处理它,结果,你会得到 concatenatingMediaSource

val concatenatingMediaSource = ConcatenatingMediaSource()
        songs.forEach { song ->
            val mediaItem:MediaItem = MediaItem.fromUri(song.getString(METADATA_KEY_MEDIA_URI).toUri())
            val mediaSource = ProgressiveMediaSource.Factory(dataSourceFactory)
                .createMediaSource(mediaItem)
            concatenatingMediaSource.addMediaSource(mediaSource)
        }

推荐阅读