Приложению, воспроизводящему мультимедиа, требуются компоненты пользовательского интерфейса для отображения мультимедиа и управления воспроизведением. Библиотека Media3 включает модуль пользовательского интерфейса, содержащий ряд компонентов пользовательского интерфейса. Чтобы зависеть от модуля пользовательского интерфейса, добавьте следующую зависимость:
Котлин
implementation("androidx.media3:media3-ui:1.4.1")
классный
implementation "androidx.media3:media3-ui:1.4.1"
Самый важный компонент — PlayerView
, представление для воспроизведения мультимедиа. PlayerView
отображает видео, изображения, субтитры и обложки альбомов во время воспроизведения, а также элементы управления воспроизведением.
PlayerView
имеет метод setPlayer
для подключения и отсоединения (путем передачи null
) экземпляров проигрывателя.
Просмотр игрока
PlayerView
можно использовать для воспроизведения видео, изображений и аудио. Он визуализирует видео и субтитры в случае воспроизведения видео, растровые изображения для воспроизведения изображений и может отображать изображения, включенные в качестве метаданных в аудиофайлы. Вы можете включить его в файлы макета, как и любой другой компонент пользовательского интерфейса. Например, PlayerView
можно включить в следующий XML-код:
<androidx.media3.ui.PlayerView
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:show_buffering="when_playing"
app:show_shuffle_button="true"/>
Приведенный выше фрагмент показывает, что PlayerView
предоставляет несколько атрибутов. Эти атрибуты можно использовать для настройки поведения представления, а также его внешнего вида. Большинству этих атрибутов соответствуют соответствующие методы установки, которые можно использовать для настройки представления во время выполнения. В документации PlayerView
Java эти атрибуты и методы установки перечислены более подробно.
После того как представление объявлено в файле макета, его можно просмотреть в методе onCreate
действия:
Котлин
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... playerView = findViewById(R.id.player_view) }
Ява
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... playerView = findViewById(R.id.player_view); }
Когда проигрыватель инициализирован, его можно присоединить к представлению, вызвав setPlayer
:
Котлин
// Instantiate the player. val player = ExoPlayer.Builder(context).build() // Attach player to the view. playerView.player = player // Set the media item to be played. player.setMediaItem(mediaItem) // Prepare the player. player.prepare()
Ява
// Instantiate the player. player = new ExoPlayer.Builder(context).build(); // Attach player to the view. playerView.setPlayer(player); // Set the media item to be played. player.setMediaItem(mediaItem); // Prepare the player. player.prepare();
Выберите тип поверхности
Атрибут surface_type
PlayerView
позволяет вам установить тип поверхности, используемой для воспроизведения видео. Помимо значений spherical_gl_surface_view
(специальное значение для воспроизведения сферического видео) и video_decoder_gl_surface_view
(для рендеринга видео с использованием модулей рендеринга расширений), допустимыми значениями являются surface_view
, texture_view
и none
. Если представление предназначено только для воспроизведения звука, none
следует использовать, чтобы избежать необходимости создавать поверхность, поскольку это может оказаться дорогостоящим.
Если представление предназначено для обычного воспроизведения видео, следует использовать surface_view
texture_view
. SurfaceView
имеет ряд преимуществ перед TextureView
при воспроизведении видео:
- Значительно более низкое энергопотребление на многих устройствах.
- Более точная синхронизация кадров, что обеспечивает более плавное воспроизведение видео.
- Поддержка вывода HDR-видео более высокого качества на совместимых устройствах.
- Поддержка безопасного вывода при воспроизведении контента, защищенного DRM.
- Возможность рендеринга видеоконтента с полным разрешением дисплея на устройствах Android TV с возможностью повышения уровня пользовательского интерфейса.
Поэтому там, где это возможно, следует отдавать предпочтение SurfaceView
перед TextureView
. TextureView
следует использовать только в том случае, если SurfaceView
не соответствует вашим потребностям. Одним из примеров является ситуация, когда требуется плавная анимация или прокрутка поверхности видео до Android 7.0 (уровень API 24), как описано в следующих примечаниях. В этом случае предпочтительнее использовать TextureView
только в том случае, если SDK_INT
меньше 24 (Android 7.0), а в противном случае — SurfaceView
.
Навигация по D-pad на Android TV
Пульт дистанционного управления Android TV оснащен крестовиной, которая отправляет команды, которые поступают в качестве ключевого события при dispatchKeyEvent(KeyEvent)
вашего Activity
. Их необходимо делегировать представлению игрока:
Котлин
override fun dispatchKeyEvent(event: KeyEvent?): Boolean{ return playerView.dispatchKeyEvent(event!!) || super.dispatchKeyEvent(event) }
Ява
@Override public boolean dispatchKeyEvent(KeyEvent event) { return playerView.dispatchKeyEvent(event) || super.dispatchKeyEvent(event); }
Запрос фокуса для просмотра проигрывателя важен для навигации по элементам управления воспроизведением и пропуска рекламы. Рассмотрите возможность запроса фокуса в onCreate
Activity
:
Котлин
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... playerView.requestFocus() // ... }
Ява
@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... playerView.requestFocus(); // ... }
Если вы используете Compose на Android TV, вам необходимо сделать AndroidView
фокусируемым и делегировать событие, передав параметр-модификатор в AndroidView
соответствующим образом:
AndroidView(
modifier = modifier
.focusable()
.onKeyEvent { playerView.dispatchKeyEvent(it.nativeKeyEvent) },
factory = { playerView }
)
Переопределить чертежи
PlayerView
использует PlayerControlView
для отображения элементов управления воспроизведением и индикатора выполнения. Drawables, используемые PlayerControlView
могут быть переопределены drawables с теми же именами, которые определены в вашем приложении. См. Javadoc PlayerControlView
для получения списка элементов управления, которые можно переопределить.
Дальнейшая настройка
Там, где требуется настройка, выходящая за рамки описанной выше, мы ожидаем, что разработчики приложений будут реализовывать свои собственные компоненты пользовательского интерфейса, а не использовать те, которые предоставляются модулем пользовательского интерфейса Media3.