当前位置: 首页 > 知识库问答 >
问题:

ExoPlayer是否为ConcatenatingMediaSource中的每个媒体源创建windowIndex?

苏君昊
2023-03-14

我正在开发一个应用程序,它可以流式传输mp3文件列表,为此,我使用了ExoPlayer和连接MediaSource,如下所示:

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,因为我需要seekbar来跨越所有媒体源,这显然是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正在寻找一个未与连接MediaSource中的特定媒体源映射的窗口!

下面是我的问题:

ExoPlayer是否为ConcatenatingMediaSource中的每个mediaSource创建一个窗口?如果没有,有没有办法强制它这样做?

共有1个答案

司寇星海
2023-03-14

这并不是一个真正的答案,但解释为什么当我调用seekTo(windowIndex,position)时,播放器似乎忽略了windowIndex,实际上是在寻找一个完全出乎意料的位置,因为媒体类型是mp3!

显然,许多开发人员都遇到了同样的问题,即玩家寻找的位置与MP3播放的媒体的真实位置不同步。

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

 类似资料:
  • 我正在使用在我的android应用程序中播放视频。我从服务器下载媒体并保存在本地数据库中,在特定的时间报警时,我在exo player中使用播放媒体。但首先我要检查所有的视频文件是否下载,并用下载的媒体源启动播放器。如果有任何视频没有下载,那么我想在下载时在后台下载,然后我想把这个视频添加到我已经创建的播放列表中 这是示例代码 我在这里检查视频文件是否下载 如果没有下载,请帮助如何稍后将丢失的视频

  • 我有一个应用程序,可以显示来自互联网的图片和视频。现在我正在实现一个“保存”功能,将图片/视频保存到外部或内部存储器中,无需再次下载。 对于图片,我只是用抓取绘图。我如何用Exoplayer2. x/PlayerView中当前缓冲的视频实现同样的效果?我没有找到一个函数。

  • 所以,我在网上阅读,您不能使配置最终,因为CGLIB扩展了类以创建代理。但是,我阅读了@Scope的文档,默认的proxyMethod值是没有创建代理(此处链接-https://docs.spring.io/springframework/docs/current/javadoc-api/org/springframework/context/annotation/scope.html)。 所以,

  • 1367[AWT-EventQueue-0]信息uk.co.caprica.vlcj.binding.libvlcfactory-libvlc:c:\program files\videolan\vlc\libvlc.dll 2061[AWT-EventQueue-0]错误uk.co.caprica.vlcj.player.DefaultMediaPlayer-未能为“SimpleMedia[mr

  • 我正在用JavaFX开发一个音乐库应用程序,我在如何正确使用MediaPlayer类方面遇到了一些问题。 这是我目前设置和播放音频文件的方法: 比如说,我有两个音频文件。。。 ...以及将这两个文件中的一个发送到上述方法的两个按钮: 通常,两个音频文件都会相互播放是有意义的,因为每次调用该方法时我都会创建一个新的MediaPlayer对象,但是,该对象是静态的。也许我误解了静态对象的工作原理,但这

  • 和类似的服务: 我用的是12个实体,大家的服务方式都一样。 谢谢!