У меня есть служба MediaBrowserServiceCompat
, которая использует Exoplayer2
для воспроизведения списка ConcatenatingMediaSource
мультимедийных файлов, как если бы они были одним файлом. Он использует MediaSessionConnector
для подключения Exoplayer к MediaControllerCompat
элементам управления воспроизведением, которые я использую в своем пользовательском интерфейсе через стандартный сеанс MediaBrowserCompat
.
Поскольку я хочу, чтобы список воспроизведения файлов мультимедиа отображался как один бесшовный файл, я сам обрабатываю уведомление о позиции воспроизведения, добавляя продолжительность предыдущих окон к текущей позиции следующим образом:
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()
}
Это в основном работает нормально, и мой пользовательский интерфейс показывает правильную позицию воспроизведения относительно всего списка воспроизведения, так что, например, если первый файл имеет длительность 1 минуту, второй файл отображается как начинающийся с "00:01 : 00 ", а не начинать снова с" 00:00:00 ".
Но пользовательский интерфейс также на мгновение показывает «00:00:00» всякий раз, когда Exoplayer перемещается к следующему объединенному файлу. Где-то MediaSessionConnector, по-видимому, сам устанавливает позицию воспроизведения MediaSessionCompat, и это противоречит позиции воспроизведения, которую я установил в исполняемом файле выше.
Как и где я могу получить MediaSessionConnector для обновления позиции воспроизведения, чтобы она относилась ко всем файлам в конкатенации, или, в качестве альтернативы, как и где я могу запретить MediaSessionConnector полностью обновлять позицию воспроизведения, чтобы я мог просто сделать это сам? Я попытался установить doMaintainMetadata
на false
, но это не останавливает обновление позиции MediaSessionConnector, как я и надеялся.
Моя проблема похожа на " Возможно ли иметь единую панель поиска для ConcatenatingMediaSource? ", но я не могу реализовать предоставленное там решение, потому что
Я использую свой собственный пользовательский интерфейс, а не пользовательский интерфейс Exoplayer, поэтому я не могу использовать setShowMultiWindowTimeBar
, который решает эту проблему на стороне клиента. Мне нужно решить проблему со стороны обслуживания, чтобы все игроки, присоединенные к сеансу (в идеале, включая игрока в панели уведомлений), отображали правильную позицию.
заранее спасибо
Джон