如何覆盖Exoplayer2的MediaSessionConnector中的播放位置?

时间:2018-09-17 02:55:17

标签: exoplayer exoplayer2.x mediabrowserservicecompat

我有一个MediaBrowserServiceCompat服务,使用Exoplayer2播放ConcatenatingMediaSource媒体文件列表,就好像它们是一个文件一样。它使用MediaSessionConnector来将Exoplayer挂钩到MediaControllerCompat回放控件,而这些回放控件是通过标准的MediaBrowserCompat会话在我的UI中使用的。

因为我希望媒体文件的播放列表显示为一个无缝文件,所以我自己处理播放位置的通知,方法是将先前窗口的持续时间添加到当前位置,如下所示:

private val updatesRunnable = Runnable {
    run {
        val currentPosition = mSimpleExoPlayer.currentPosition
        val windowIndex = mSimpleExoPlayer.currentWindowIndex
        val position = mOffsetsArray[windowIndex] + currentPosition
        val playbackStateBuilder = PlaybackStateCompat.Builder()
                .setState(PlaybackStateCompat.STATE_PLAYING, position, 0f)
        mMediaSessionCompat.setPlaybackState(playbackStateBuilder.build())
    }
    showUpdates()
}

大多数情况下都可以正常工作,并且我的UI相对于整个播放列表显示了正确的播放位置,因此,例如,如果第一个文件长1分钟,则第二个文件显示为从“ 00:01开始” :00”,而不是从“ 00:00:00”重新开始。

但是,每当Exoplayer移至下一个串联文件时,UI也会暂时显示“ 00:00:00”。 MediaSessionConnector似乎在某个地方自己设置了MediaSessionCompat播放位置,并且与我在上面的可运行位置中设置的播放位置相冲突。

如何使MediaSessionConnector更新播放位置,使其与临时文件中的所有文件相关,或者如何以及在何处阻止MediaSessionConnector完全更新播放位置,所以我自己可以做到这一点?我尝试将doMaintainMetadata设置为false,但这并没有像我希望的那样停止MediaSessionConnector的位置更新。

我的问题类似于“ Is it possible to have single seekbar for ConcatenatingMediaSource?”,但是我无法实现那里提供的解决方案,因为 我使用的是我自己的UI,而不是Exoplayer UI,所以我无法使用setShowMultiWindowTimeBar来解决客户端的此问题。我需要在服务端解决此问题,以便连接到该会话的所有玩家(最好在通知栏中包括该玩家)都显示正确的位置。

预先感谢

约翰

0 个答案:

没有答案