我想使用Exoplayer制作动态音频播放列表。我使用DynamicMediaSource以及ConcateMediaSource它可以正常工作但如果我的播放器当前正在播放并且我将尝试添加mediasource,那么当前播放器可以进入暂停状态并且新添加的mediasource将是play.Initially我将只为一个音频创建媒体源,并使player.playWhenReady仅第一次为true。然后在列表中添加另一个源并为我的播放列表创建音频源。那么是否可以在没有暂停播放器的情况下添加mediasouce?播放列表可以添加更多方式吗?下面的代码是为第一个音频创建媒体源: -
fun createAudioSource(data: MusicDetailResponse.AudioX, audioAllItem: MusicDetailResponse.Audio, position: Int) {
player = ExoPlayerFactory.newSimpleInstance(context, DefaultTrackSelector())
val userAgent = Util.getUserAgent(context, context.getString(R.string.label_user_agent))
val dataSourceFactory = DefaultHttpDataSourceFactory(
userAgent, null,
DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS,
1800000,
true)
val hlsMediaSource = HlsMediaSource.Factory(dataSourceFactory)
.createMediaSource(Uri.parse(data.audio))
player!!.prepare(hlsMediaSource)
player!!.playWhenReady = true
}
fun addAudioList(item: MusicDetailResponse.AudioX) {
tempAudioList.add(item)
createHlsMediaSource(tempAudioList)
}
private fun createHlsMediaSource(tempAudioList: ArrayList<MusicDetailResponse.AudioX>) {
for (i in 1 until tempAudioList.size) {
val userAgent = Util.getUserAgent(context, context.getString(R.string.label_user_agent))
val dataSourceFactory = DefaultHttpDataSourceFactory(
userAgent, null,
DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS,
1800000,
true)
val hlsMediaSource = HlsMediaSource.Factory(dataSourceFactory)
.createMediaSource(Uri.parse(tempAudioList[i].audio))
cMediaSource!!.addMediaSource(hlsMediaSource)
}
player?.prepare(cMediaSource, false, false)
}
将所有出现的DynamicConcatenatingMediaSource重命名为ConcatenatingMediaSource。
曾经想在您的Android应用中支持媒体播放列表,用户可以在播放期间随意添加和删除播放列表项吗?现在你可以!
从ExoPlayer 2.8.0开始,我们使用动态播放列表功能更新了ConcatenatingMediaSource。从表面上看,新媒体源有一个非常简单明了的界面:
addMediaSource(mediaSource)在播放列表的末尾附加新的媒体源。 addMediaSource(index,mediaSource)在播放列表中的指定索引处插入新的媒体源。 addMediaSources(Collection)bulk在播放列表的末尾附加一整套新媒体源。 addMediaSources(index,Collection)bulk在播放列表中的指定索引处插入一组新媒体源。 removeMediaSource(index)删除给定索引处的媒体源。 moveMediaSource(fromIndex,toIndex)移动播放列表中的现有媒体源。这很有用,因为您不必创建新的MediaSource对象。您还可以在不中断播放的情况下移动当前播放的项目。 getMediaSource(index)允许您访问给定索引处的媒体源。 getSize()返回当前播放列表长度。