Как переопределить позицию воспроизведения в MediaSessionConnector Exoplayer2?

У меня есть 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 который решает эту проблему на стороне клиента. Мне нужно решить проблему со стороны службы, чтобы все игроки, присоединенные к сеансу (в идеале, включая игрока в панели уведомлений), показывали правильную позицию.

заранее спасибо

Джон

0 ответов

Другие вопросы по тегам