我有一个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
来解决客户端的此问题。我需要在服务端解决此问题,以便连接到该会话的所有玩家(最好在通知栏中包括该玩家)都显示正确的位置。
预先感谢
约翰