我正在制作一个流mp3文件列表的应用程序,为此,我使用了带有ConcatenatingMediaSource
的ExoPlayer:
private fun createMediaSource(
tracks: List<Track>
): MediaSource = ConcatenatingMediaSource(true).apply {
tracks.forEach { track ->
val mediaSource = ProgressiveMediaSource
.Factory(DefaultDataSourceFactory(context))
.createMediaSource(MediaItem.fromUri(track.getFullUri()))
addMediaSource(mediaSource)
}
}
这工作得很好,文件作为列表播放,没有任何错误,但是我需要的是将所有这些流作为单个流播放,我在搜索栏上显示所有流的总长度,用户将在它们之间无缝地搜索。
当然,我没有使用ExoPlayer提供的VideoPlayer,因为我需要搜索栏跨越所有媒体源,这显然是不可能与ExoPlayerUi。
这就是我在用户搜索时使用的逻辑:
exoPlayer.apply {
var previousTracksLength = 0L
var windowIndex = 0
var currentItemLength = 0L
run loop@{
tracksList.forEachIndexed { index, track ->
currentItemLength = track.getLengthMillis()
previousTracksLength += currentItemLength
if (newPositionMillis < previousTracksLength) {
windowIndex = index
return@loop
}
}
}
val positionForCurrentTrack = (newPositionMillis - (previousTracksLength - currentItemLength))
pause()
if (windowIndex == currentWindowIndex) {
seekTo(positionForCurrentTrack)
} else {
seekTo(windowIndex, positionForCurrentTrack)
}
play()
}
当ConcatenatingMediaSource只有3个或更少的媒体源时,这非常有效,但如果它大于3个媒体源,就会出现奇怪的行为,我可能只想向前移动10秒,而玩家可能会移动超过2分钟。
在调试之后,我很明显,当我调用:seekTo(windowIndex, positionForCurrentTrack)
exoPlayer正在寻找一个没有映射到ConcatenatingMediaSource中的特定媒体源的窗口!
我的问题来了:
ExoPlayer是否在ConcatenatingMediaSource中为每个mediaSource创建一个单独的窗口?如果没有,有没有办法强制它这样做?
这不是一个真正的答案,但解释为什么当我调用seekTo(windowIndex, position)
播放器似乎是忽略了窗口windex,实际上寻求一个完全意想不到的位置,因为媒体类型是mp3 !
显然,许多开发人员都遇到了同样的问题,即当播放mp3时,播放器查找位置与正在播放的媒体的实际位置不同步。
在使用ExoPlayer播放mp3时遇到奇怪问题的任何人的更多详细信息https://github.com/google/ExoPlayer/issues/6787 issuecomment - 568180969