【问题标题】:Does ExoPlayer create a windowIndex for each media source in ConcatenatingMediaSource?ExoPlayer 是否为 ConcatenatingMediaSource 中的每个媒体源创建一个 windowIndex?
【发布时间】: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


【解决方案1】:

这不是真正的答案,而是解释为什么当我打电话给seekTo(windowIndex, position) 时,播放器似乎忽略了 windowIndex 并实际上寻求完全出乎意料的位置,因为媒体类型是 mp3!

显然,许多开发者都遇到过同样的问题,即播放器的搜索位置与播放 mp3 时正在播放的媒体的实际位置不同步。

为使用 ExoPlayer 播放 mp3 时遇到奇怪问题的人提供更多详细信息 https://github.com/google/ExoPlayer/issues/6787#issuecomment-568180969

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多