【发布时间】:2021-10-25 05:21:03
【问题描述】:
我正在开发一个流式传输 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 个或更少的媒体源时,这非常有效,但如果它比这更大,奇怪的行为开始出现,我可能只想向前寻找 10 秒,播放器会移动超过 2 分钟。
调试后很明显,当我打电话时:seekTo(windowIndex, positionForCurrentTrack) exoPlayer 正在寻找一个未映射到 ConcatenatingMediaSource 中特定媒体源的窗口!
我的问题来了:
ExoPlayer 是否为 ConcatenatingMediaSource 中的每个 mediaSource 创建一个窗口? 如果没有,有没有办法强迫它这样做?
【问题讨论】:
-
"ExoPlayer 是否为 ConcatenatingMediaSource 中的每个 mediaSource 创建一个窗口?"似乎是这样,在我们的例子中,我们播放来自不同视频的剪辑,并为每个剪辑创建一个窗口。不幸的是,不知道如何强制:-(
标签: android exoplayer2.x