尽管在 ExoPlayer 中添加了 ConcatenatingMediaSouce,但时间轴为空

Empty Timeline despite adding ConcatenatingMediaSouce in ExoPlayer

我正在制作一堆歌曲 ConcatenatingMediaSource

...

allSongs.forEach {
            concatenatingMediaSource.addMediaSource(makeMediaSource(it.source))
        }
player!!.prepare(concatenatingMediaSource)

Log.d(TAG, "onCreate: period count ==> ${player!!.currentTimeline.periodCount} \n " +
                "window count ==> ${player!!.currentTimeline.windowCount}")

...

MakeMediaSource 函数

private fun makeMediaSource(sourceOfSong: String): ProgressiveMediaSource {

        val dataSourceFactory = DefaultDataSourceFactory(
            this,
            getUserAgent(this, "ApplicationName")
        )

        return ProgressiveMediaSource.Factory(dataSourceFactory)
            .createMediaSource(
                Uri.parse(sourceOfSong)
            )
    }

我想从播放列表中随机播放一首歌曲,所以当我使用 seekTo(windowIndex, playbackPosition) 时,应用程序崩溃了。然后在将 ConcatenatingMediaSource 添加到播放器后检查时间线的 windowCountperiodCount 我得到了 0timeline 也是空的,但我应该让 windowperiod 计数根据官方 sourcesConcatenatingMediaSource 的大小。我不明白为什么会这样?

我终于弄明白了,我正在用 ConcatenatingMediaSource 准备播放器,然后我正在记录 时间轴的 windowCountperiodCount

player!!.prepare(concatenatingMediaSource)
Log.d(TAG, "onCreate: period count ==> ${player!!.currentTimeline.periodCount} \n " +
                "window count ==> ${player!!.currentTimeline.windowCount}")

我发现 prepare 方法 异步工作 并且需要一些时间让玩家准备好否则他们为什么要提供 听众 为。因此,我在 onPlayerStateChanged 中记录了 windowCount 并且它有效。