Android exoplayer vs mediaplayer

Какой видеоплеер лучше подходит для потоковой передачи видео в формате .m3u8 на Android? VideoView или ExoPlayer?

Я хочу воспроизвести потоковое видео в формате .m3u8 с разными звуковыми дорожками и разными субтитрами .

Здесь у меня вопрос, например, какой видеопроигрыватель лучше подходит для воспроизведения потокового видео .m3u8 с большей производительностью.
Я пытаюсь решить эту проблему с помощью собственного проигрывателя, то есть VideoView , но во время работы с аудиодорожками и субтитрами у меня возникла проблема с videoView . Здесь, в videoView, я должен обрабатывать все с помощью кодирования, нет формы поддержки VideoView.

Могу ли я добиться этого с помощью Exo player?
Может ли кто-нибудь предложить лучшее решение для поддержки звуковых дорожек и субтитров в видеоплеере.

2 ответа

ExoPlayer — это медиаплеер прикладного уровня для Android. Он представляет собой альтернативу Android MediaPlayer API для воспроизведения аудио и видео как локально, так и через Интернет. ExoPlayer поддерживает функции, которые в настоящее время не поддерживаются Android MediaPlayer API, включая адаптивное воспроизведение DASH и SmoothStreaming. В отличие от MediaPlayer API, ExoPlayer легко настраивается и расширяется, и его можно обновлять с помощью обновлений приложения Play Store.

Exoplayer очень прост в использовании и поддерживает SmoothStreaming, если ваша ссылка предоставляет несколько треков, он адаптируется к пользовательскому соединению, если у пользователя плохое соединение, он выберет трек более низкого качества, если у пользователя есть хороший Интернет подберет качественный трек.

Если воспроизведение аудио или видео является важной функцией вашего приложения, вам обязательно стоит использовать Exoplayer.

Если вы еще не уверены, Exoplayer используется в Youtube, Google Music, Google Movies, Facebook, Whatsapp, Spotify, Twitter и других 140 000. Вы можете проверить эту лекцию по вводу-выводу.

Если вы хотите проверить простой образец аудио-экзоплеера, вы можете увидеть его здесь. И прочтите эту статью.

Как человек, который справился с той же проблемой, я считаю, что простота важнее других факторов. VideoView настолько прост в использовании, так что пользуйтесь им. Совет: если вы хотите создать что-то вроде стиля игры на YouTube, вы можете использовать макет кадра поверх него и помещать на него кнопки, изображения и другие подобные вещи

Источник

Русские Блоги

Полное понимание Google Exoplayer

Перевод с: https://juejin.im/entry/5884061f128fe1006c34ea43

Воспроизведение аудио и видео на устройствах Android стало очень популярным, и платформа Android предоставляет быстрое решение MediaPlayer для воспроизведения мультимедиа с минимальным кодом. Он также предоставляет низкоуровневые API-интерфейсы для создания индивидуальных решений для медиаплееров, таких как MediaCodec, AudioTrack и MediaDrm.

ExoPlayer — это проигрыватель с открытым исходным кодом на уровне приложений, построенный на низкоуровневом API Android. Проект с открытым исходным кодом включает библиотеку ExoPlayer и демо.

Исходный код библиотеки классов библиотеки ExoPlayer

Демо-демонстрация использования библиотек классов

В этой статье представлена ​​библиотека ExoPlayer и ее использование, плюсы и минусы использования ExoPlayer, конкретные примеры кода демонстрируют, как ее использовать, и показывают, как использовать ExoPlayer для воспроизведения адаптивных потоков DASH, SmoothStreaming и HLS, таких как MP4, M4A, FMP4. , поддерживает WebM, MKV, MP3, OGG, WAV, MPEG-TS, MPEG-PS, FLV и ADTS (AAC). Также обсудите события, сообщения, настройки и поддержку DRM ExoPlayer.

1 преимущества и недостатки

По сравнению со встроенным в Android MediaPlayer ExoPlayer имеет множество преимуществ:

Поддерживает динамическую адаптивную потоковую передачу через HTTP (DASH) и SmoothStreaming. Для получения дополнительной поддержки см. Страницу с подробной информацией о поддерживаемых форматах.

Поддерживает расширенные функции HLS (HTTP Live Streaming), такие как правильная обработка тегов # EXT-X-DISCONTINUITY.

Возможность беспрепятственно интегрировать, подключать и распространять медиаресурсы.

Читайте также:  Все боссы террария андроид

ExoPlayer поддерживает настройку и расширение, и он разработан с учетом этого и позволяет заменять многие компоненты пользовательскими реализациями.

Более универсальное оборудование

Поддерживает универсальное шифрование Widevine на Android 4.3 (уровень API 18) и выше.

Важно отметить, что есть и недостатки:

Стандартные аудио и видео компоненты ExoPlayer полагаются на MediaCodecAPI Android, выпущенный вместе с Android 4.1 (уровень API 16). Поэтому они не будут работать в более ранних версиях Android. Универсальное шифрование Widevine доступно на Android 4.3 (уровень API 18) и выше.

Ядром библиотеки ExoPlayer является интерфейс ExoPlayer. Интерфейс ExoPlayer предоставляет функции традиционных высокоуровневых проигрывателей, такие как буферизация ресурсов, воспроизведение, пауза и перетаскивание. Класс реализации интерфейса делает предположения о типе воспроизведения мультимедиа, месте хранения и режиме рендеринга, а не об общей загрузке и рендеринге. Exoplayer делегирует такие задачи, как тип воспроизведения, место хранения и метод рендеринга, различным компонентам, а затем внедряет эти компоненты при создании проигрывателя или воспроизведении в фоновом режиме. Эти компоненты включают:

MediaSource — отвечает за загрузку мультимедиа. Медиа, загруженные в MediaSource, можно читать. MediaSource вводится при вызове ExoPlayer.prepare.

Render S — компонент, используемый для визуализации мультимедиа, который вводится при создании плеера.

TrackSelector — выберите медиа из MediaSource и предоставьте его доступному Render S для рендеринга, который вводится при создании проигрывателя.

LoadControl-Controls MediaSource для кэширования большего количества носителей и количества буферизованных носителей. Он вводится при создании игрока.

Библиотека классов предоставляет стандартные реализации этих компонентов при нормальных обстоятельствах, которые подробно описаны ниже. ExoPlayer может использовать эти компоненты. Если стандартная реализация не может удовлетворить требованиям, вы также можете использовать индивидуальную реализацию. Например, настраиваемый LoadControl может изменить стратегию буферизации проигрывателя, или настраиваемый модуль визуализации может реализовать видеокодеки, которые Android не поддерживает.

ExoPlayer предоставляет средства визуализации аудио и видео по умолчанию, используя классы MediaCodec и AudioTrack в платформе Android. Оба они должны быть введены в объект SampleSource, чтобы реализовать воспроизведение мультимедийных образцов.

Внедрение компонентов является обычным делом в текущей библиотеке ExoPlayer. На изображении ниже показано использование ExoPlayer для настройки и воспроизведения расширенной объектной модели медиапотока MP4 。 Средства визуализации аудио и видео по умолчанию были аннотированы в ExoPlayer. Реализация класса ExtractorSampleSource аннотируется в средстве визуализации для обеспечения простых функций воспроизведения мультимедиа. Примеры DataSource и Extractor аннотированы для ExtractorSampleSource для поддержки загрузки медиапотоков и извлечения шаблонов из загруженных данных. В этом примере DefaultUriDataSource и Mp4Extractor используются для воспроизведения потоков MP4, импортированных из URI.

Концепция внедрения проходит через реализацию всей библиотеки классов. Как можно дополнительно делегировать внедрение класса реализации компонента по умолчанию? Это позволяет индивидуально заменить многие субкомпоненты пользовательскими реализациями. Например, предоставляя настроенную фабрику, можно загружать данные из нестандартного источника или через другой стек сетевых протоколов. Реализация MediaSource по умолчанию требует внедрения одного или нескольких конструкторов фабрики DataSource.

Adaptive media playbacks

ExoPlayer поддерживает адаптивную потоковую передачу, то есть во время воспроизведения качество видео автоматически регулируется в соответствии с условиями сети. DASH, SmoothStreaming и HLS продемонстрировали технологию адаптивной потоковой передачи. Для трех указанных выше типов носитель загружается небольшими порциями (обычно длительностью от 2 до 10 секунд). Всякий раз, когда запрашивается носитель, клиент выбирает возможную спецификацию. Например: если состояние сети относительно хорошее, клиент выберет спецификации высокого качества, если сеть относительно плохая, она будет низкого качества. В обеих технологиях видео и аудио необходимо разделять.

DASH android SmoothStreaming

Библиотека ExoPlayer поддерживает динамическое воспроизведение DASH и SmoothStreaming через ChunkSampleSource, то есть путем чтения независимых медиа-блоков. Каждому ChunkSampleSOurce необходимо ввести ChunkSource с помощью метода построения. ChunkSource в основном отвечает за загрузку и чтение образцов для предоставления фрагментов мультимедиа. Класс DashChunkSource использует форматы контейнеров FMP4 и WebM для обеспечения воспроизведения DASH. Класс SmoothStreamingChunkSource использует формат контейнера FMP4.

Читайте также:  Джойстик для смарт android

Для двух типов экземпляров ChunkSource требуется, чтобы синтаксический анализатор FormatEvaluator и источник данных DataSource были введены посредством конструирования. FormatEvaluator выбирает доступный формат перед загрузкой каждого блока, а DataSource предоставляет источник данных. Наконец, ChunkSampleSource нужен объект LoadControl для управления блоком буфера.
На следующем рисунке показана обычная конфигурация динамического воспроизведения DASH. . Через FormatEvaluator можно добиться динамического изменения качества видео, но качество звука фиксировано.

Чтобы начать использовать ExoPlayer, вам необходимо выполнить следующие действия:

Создайте экземпляр SimpleExoPlayer

Свяжите проигрыватель и просмотр (для вывода видео и ввода пользователя)

Вызовите метод подготовки, введите MediaSource и подготовьтесь к воспроизведению

Отпустите игрока после игры

Эти шаги более подробно описаны ниже. Полный пример можно найти в демонстрационной программе PlayerActivity в ExoPlayer.

Add ExoPlayer as a dependency

Обеспечить поддержку склада Jcenter

4Creating the player

Вы можете создать экземпляр ExoPlayer с помощью фабричного метода ExoPlayerFactory. Фабрика предоставляет ряд методов для создания экземпляров ExoPlayer с разной степенью настройки. Для большинства случаев использования достаточно реализации, предоставляемой библиотекой Renderer по умолчанию. В этом случае следует использовать метод ExoPlayerFactory.newSimpleInstance. Метод возвращает SimpleExoPlayer. SimpleExoPlayer расширяет ExoPlayer и добавляет дополнительные высокоуровневые функции воспроизведения. Ниже показано, как создать SimpleExoPlayer.

5Attaching the player to a view

Библиотека ExoPlayer предоставляет SimpleExoPlayerView, который инкапсулирует PlaybackControlView и Surface для рендеринга видео. SimpleExoPlayerView может быть включен в XML-файл макета. Ниже показано, как привязать игрока

Если вам нужен более мелкозернистый элемент управления, чем элемент управления проигрывателем и визуализирует видео на поверхности, вы можете установить целевой SurfaceView, TextureView, SurfaceHolder или Surface для проигрывателя и напрямую использовать методы setVideoSurfaceView, setVideoTextureView, setVideoSurfaceHolder и setVideoSurface для SimpleExoPlayer соответственно. . Вы можете использовать PlaybackControlView как независимый компонент или реализовать собственное воспроизведение для непосредственного взаимодействия с проигрывателем. setTextOutput и setId3Output могут использоваться для получения субтитров и вывода метаданных ID3 во время воспроизведения.

6Preparing the player

В ExoPlayer каждый медиа представлен MediaSource. Для воспроизведения мультимедиа необходимо сначала создать соответствующий MediaSource, а затем передать этот объект в ExoPlayer.prepare. Библиотека ExoPlayer предоставляет реализацию DASH MediaSource (настоящий DashMediaSource), реализацию SmoothStreaming (SsMediaSource), реализацию HLS (HlsMediaSource) и реализацию обычных файлов мультимедиа (ExtractorMediaSource). Эти реализации подробно описаны ниже. Следующий код демонстрирует, как использовать MediaSource prapare, проигрыватель, подходящий для воспроизведения файлов MP4.

После подготовки проигрывателя воспроизведением можно управлять, вызывая методы проигрывателя. Например, setPlayWhenReady можно использовать для запуска и приостановки воспроизведения, а различные методы seekTo можно использовать для изменения хода выполнения. Если проигрыватель привязан к SimpleExoPlayerView или PlaybackControlView, то взаимодействие пользователя с этими компонентами вызовет соответствующий метод проигрывателя.

7Releasing the player

Очень важно выпустить проигрыватель, когда он больше не используется, чтобы освободить ограниченные ресурсы, например использование видеодекодеров для других приложений. Это можно сделать, вызвав ExoPlayer.release.

MediaSource

В ExoPlayer каждый медиа представлен MediaSource. Для воспроизведения мультимедиа необходимо сначала создать соответствующий MediaSource, а затем передать этот объект в ExoPlayer.prepare. Библиотека ExoPlayer предоставляет реализацию DASH MediaSource (настоящий DashMediaSource), реализацию SmoothStreaming (SsMediaSource), реализацию HLS (HlsMediaSource) и реализацию обычных файлов мультимедиа (ExtractorMediaSource). Демонстрационное приложение PlayerActivity соответственно демонстрирует, как создать экземпляры четырех вышеуказанных MediaSource.

В дополнение к вышеупомянутой реализации MediaSource, библиотека ExoPlayer также предоставляет MergingMediaSource, LoopingMediaSource и ConcatenatingMediaSource. Эти реализации MediaSource можно комбинировать для поддержки более сложных функций воспроизведения. Ниже описаны некоторые распространенные варианты использования. Обратите внимание, что хотя в следующих примерах используется воспроизведение видео, они также применимы к воспроизведению только аудио, фактически они применимы для воспроизведения всех поддерживаемых типов мультимедиа.

88Side-loading a subtitle file

Имея видеофайл и отдельный файл субтитров, MergingMediaSource может объединить их в один источник для воспроизведения.

Читайте также:  После обновления андроид не работает вай фай

Seamlessly looping a video

LoopingMediaSource может реализовать непрерывный цикл видео. Ниже показано, как достичь бесшовного цикла. Вы также можете создать LoopingMediaSource, который указывает количество циклов.

Seamlessly playing a sequence of videos

ConcatenatingMediaSource обеспечивает поддержку воспроизведения, чтобы последовательно воспроизводить два или более отдельных MediaSource S. В следующем примере два видео воспроизводятся последовательно. Ресурсы переключаются плавно, и нет требований относительно того, одинаковы ли форматы объединенных ресурсов.

Составной MediaSourceS можно дополнительно комбинировать для более необычных случаев использования. Для двух видеороликов A и B в следующем примере показано, как использовать LoopingMediaSource и ConcatenatingMediaSource для беспроводного зацикливания в последовательности (A, A, B).

Следующие ниже примеры эквивалентны, что показывает, что есть несколько способов достичь одного и того же результата.

Избегайте использования одного и того же экземпляра MediaSource несколько раз в композиции, если это явно не разрешено в документации. В приведенном выше примере это тот случай, когда firstSource используется дважды.Как ясно указывает ConcatenatingMediaSource в Javadoc, дублирование элементов разрешено. В общем, изгиб объекта, образованного композицией, должен быть деревом. Допускается использование в композиции нескольких экземпляров, эквивалентных MediaSource.

Во время воспроизведения приложение может прослушивать события, генерируемые ExoPlayer, которые указывают все состояния плеера. Пользовательский интерфейс может обновляться на основе этих событий. Многие компоненты ExoPlayer также сообщают о своих собственных конкретных низкоуровневых событиях, которые можно использовать для мониторинга производительности.

High level events

ExoPlayer использует addListener и removeListener для добавления и удаления экземпляров ExoPlayer.EventListener. Зарегистрированный слушатель может публиковать изменение состояния воспроизведения и причину ошибки в случае сбоя.

Разработчики должны зарегистрировать прослушиватель для настраиваемого воспроизведения и обновить элементы управления в соответствии с изменениями состояния проигрывателя. Если воспроизведение не удается, приложение также должно отображать соответствующую ошибку пользователю.

При использовании SimpleExoPlayer вы можете установить дополнительных слушателей на плеере. В частности, setVideoListener позволяет приложениям получать события, связанные с рендерингом видео, которые можно использовать для настройки пользовательского интерфейса. setVideoDebugListener и setAudioDebugListener могут получать отладочную информацию.

Low level events

Помимо слушателей высокого уровня, многие компоненты, предоставляемые библиотекой ExoPlayer, могут иметь собственные слушатели событий. Обычно вам нужно передать обработчик виджету, чтобы определить поток, в котором вызывается метод прослушивателя. В большинстве случаев обработчик должен быть связан с основным потоком приложения.

Sending messages to components

Некоторые компоненты ExoPlayer позволяют изменять конфигурацию во время воспроизведения. По соглашению вы передаете сообщения об изменении компоненту ExoPlayer с помощью метода sendMessages или blockingSendMessages. Таким образом можно обеспечить безопасность двух потоков и упорядочить выполнение изменений конфигурации и других операций на плеере.

По сравнению со встроенным MediaPlayer Android, основным преимуществом ExoPlayer является поддержка настраиваемых и расширенных проигрывателей, чтобы лучше соответствовать реальным вариантам использования разработчиков. Помня об этом при проектировании библиотеки ExoPlayer, определяется большое количество интерфейсов и абстрактных базовых классов, чтобы помочь разработчикам легко заменить реализацию по умолчанию, предоставляемую библиотекой классов. Ниже показаны некоторые варианты использования для создания пользовательских компонентов:

Render — реализация настраиваемого средства визуализации для обработки типов мультимедиа, которые не поддерживаются реализацией по умолчанию, предоставляемой библиотекой.

Если пользовательскому компоненту необходимо публиковать события в приложении, мы рекомендуем использовать существующую модель компонента ExoPlayer и одновременно передавать прослушиватель и обработчик при создании компонента.

Пользовательский компонент, который мы рекомендуем, использует ту же модель, что и существующий компонент ExoPlayer, что позволяет изменять конфигурацию во время процесса воспроизведения. Для этого вам необходимо реализовать интерфейс ExoPlayerComponent и обработать полученную информацию об изменении конфигурации в методе handleMessage. Ваше приложение должно вызывать методы sendMessages и blockingSendMessages ExoPlayer для передачи измененной информации о конфигурации.

PlayerActivity в ExoPlayer Demo демонстрирует, как DrmSessionManager создается и внедряется при инициализации проигрывателя.

Источник

Оцените статью