如何在 ExoPlayer 中连接 MediaSources 的 ArrayList
How to Concatenate an ArrayList of MediaSources in ExoPlayer
我想知道如何使用 ArrayList 中的 MediaSources 在 ExoPlayer 中连续播放两首以上的歌曲。
我可以使用 ConcatenatingMediaSource
来连续播放两首歌曲,但我必须将它们作为单独的参数加载到这个基金中。我不想对整个歌曲列表执行此操作。我试图找到这个问题的答案并且似乎有一些基本的误解,因为我似乎无法在其他 Whosebug 问题或博客等中复制其他人的努力。(许多博客显示简单的两个媒体源播放列表,如 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 语句中我失败了,因为 return 类型不是 MediaSource,而是 Unit。但是,最后一行的注释代码工作正常。如何修改倒数第二行和倒数第三行才能播放我的歌曲列表?
好的,所以我刚找到这个视频:https://www.youtube.com/watch?v=svdq1BWl4r8
事实证明,ExoPlayer 的 prepare
不必将 MediaSource
作为参数,但也可以将 ConcatenatingMediaSource
作为参数。它们不一样,但都被 prepare
函数接受。
还值得注意的是 ConcatenatingMediaSource
可以接收单个 MediaSource
。这意味着 if
语句检查 MediaSource
ArrayList
的大小是不必要的。
因此,解决方案是将 buildMediaSource
的 return 类型更改为 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
}
我想知道如何使用 ArrayList 中的 MediaSources 在 ExoPlayer 中连续播放两首以上的歌曲。
我可以使用 ConcatenatingMediaSource
来连续播放两首歌曲,但我必须将它们作为单独的参数加载到这个基金中。我不想对整个歌曲列表执行此操作。我试图找到这个问题的答案并且似乎有一些基本的误解,因为我似乎无法在其他 Whosebug 问题或博客等中复制其他人的努力。(许多博客显示简单的两个媒体源播放列表,如 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 语句中我失败了,因为 return 类型不是 MediaSource,而是 Unit。但是,最后一行的注释代码工作正常。如何修改倒数第二行和倒数第三行才能播放我的歌曲列表?
好的,所以我刚找到这个视频:https://www.youtube.com/watch?v=svdq1BWl4r8
事实证明,ExoPlayer 的 prepare
不必将 MediaSource
作为参数,但也可以将 ConcatenatingMediaSource
作为参数。它们不一样,但都被 prepare
函数接受。
还值得注意的是 ConcatenatingMediaSource
可以接收单个 MediaSource
。这意味着 if
语句检查 MediaSource
ArrayList
的大小是不必要的。
因此,解决方案是将 buildMediaSource
的 return 类型更改为 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
}