Android ExoPlayer: решает проблему без разрыва/беспрепятственного воспроизведения, которая нарушена для Android Media Player
Кто-нибудь пытался использовать ExoPlayer для достижения этого?
Я пробовал искать онлайн без успеха.
Когда я говорю безщелезное воспроизведение, я имею в виду проблему использования медиаплеера для воспроизведения локальных видеороликов. После первого воспроизведения видео происходит заметная задержка в 1 секунду до начала второго видео.
Надеясь, что этот вопрос поможет еще глубже понять этот вопрос.
Для справки, пожалуйста, посмотрите на следующий вопрос:
Android: MediaPlayer безразличный или бесшовный просмотр видео
Ответы
Ответ 1
ExoPlayer 2, который теперь официально выпущен, похоже, поддерживает бесщелевое воспроизведение с использованием класса ConcatenatingMediaSource
. Из руководство разработчика:
Переходы между источниками являются бесшовными. Нет требования, чтобы источники были объединены в один формат (например, его тонкий способ объединить видеофайл, содержащий 480p H264, с одним, который содержит 720p VP9). Источники могут даже быть разных типов (например, его тонкий способ конкатенации видео с потоком только аудио).
И пример кода:
MediaSource firstSource = new ExtractorMediaSource(firstVideoUri, ...);
MediaSource secondSource = new ExtractorMediaSource(secondVideoUri, ...);
// Plays the first video, then the second video.
ConcatenatingMediaSource concatenatedSource =
new ConcatenatingMediaSource(firstSource, secondSource);
Ответ 2
EDIT: ExoPlayer 2 поддерживает безщелезное воспроизведение, но на момент написания еще не выдается как стабильный версия.
Вы, скорее всего, никогда не сможете добиться безупречного воспроизведения нескольких треков с помощью ExoPlayer или Android Media Player. Ни один из них не был написан для поддержки запуска нескольких треков, и я полагаю, что они останутся вне видимости для них обоих.
Вы можете добиться бесщелевого воспроизведения, используя 2 разных экземпляра проигрывателя, как только вы запустили и сыграли в первый раз, вы можете загрузить второй и начать воспроизведение после первого завершения. Используя этот метод, вы можете иметь беспроблемное решение, пока вы готовите второе видео во время воспроизведения первого.
Чтобы сделать это дальше, вы также можете использовать 2 разных текстуры поверхности для рендеринга нескольких видеороликов, как только первое видео дойдет до конца, вы сможете вытереть текстуру и исчезнуть в новом. Результатом приятного бесшовного видеоэффекта.
Из-за характера одновременного воспроизведения нескольких видеороликов вы, скорее всего, захотите создать свой собственный таймер для увеличения времени и принятия решения о переключении на следующее видео, вместо того, чтобы пытаться использовать обратные вызовы от ExoPlayer или Android Media. Это позволит вам отслеживать время более точно, без необходимости разговаривать с несколькими видеокодеками.
Ответ 3
Я знаю, что это не тот ответ, который вы искали, но это единственный разумный ответ. Единственный способ гарантировать отсутствие пробелов в воспроизведении - сначала загрузить весь файл и начать воспроизведение, когда это будет сделано. В противном случае, если вы потеряете связь до того, как файл завершит загрузку, приостановка будет неизбежна.
Ответ 4
Я просто попытался переключиться на ExoPlayer из стандартной реализации MediaPlayer, и разрыв будет таким же, если не хуже. Однако я использовал очень простой способ перезапуска игрока, когда статус изменился до конца. Я не знаю, есть ли лучший способ сделать это, возможно, с двумя разными ExoPlayers.