Ранний элемент управления MediaPlayer в Android имел плохую совместимость с онлайн-видео, поэтому позже отдельно была запущена библиотека Exoplayer для улучшения поддержки онлайн-видео, как описано в 14-й главе книги «Практика разработки Android Studio: от нулевых основ к App Online (3-я глава). Edition)» Глава «14.3.3 Новый проигрыватель ExoPlayer» подробно описывает использование библиотеки Exoplayer.
Теперь официальные лица Android снова обновили Exoplayer и включили его в медиатеку третьего поколения Jetpack Media3 в качестве унифицированного механизма обработки для операций, связанных с аудио и видео. Модернизированный Exoplayer станет унифицированным механизмом воспроизведения мультимедиа Media3, предоставляющим компоненты прикладного уровня для воспроизведения аудио и видео, стремясь объединить мир в направлении рендеринга аудио и видео. Согласно официальному сайту Android, ExoPlayer также решает проблему фрагментации устройства и операционной системы, позволяя коду приложения работать во всей экосистеме Android согласованным образом. Поскольку Media3 — это совершенно новая библиотека Jetpack, к ней предъявляются относительно высокие требования к среде разработки. Прежде чем Media3 можно будет нормально внедрить, необходимо выполнить следующие условия. 1. Инструмент разработки должен быть Android Studio Jellyfish (версия Jellyfish) или выше. 2. Версия Gradle должна быть не ниже 8.6. 3. CompileSdk и targetSdk в build.gradle модуля приложения должны быть обновлены до версии 34 или выше. Подготовьте среду разработки в соответствии с вышеуказанными условиями, а затем внедрите библиотеку ExoPlayer Media3, как описано ниже. Подробные шаги описаны ниже.
Добавьте следующий оператор пакета импорта в узел зависимостей build.gradle и добавьте все связанные библиотеки, используемые ExoPlayer.
implementation "androidx.media3:media3-exoplayer:1.4.0"
implementation "androidx.media3:media3-exoplayer-hls:1.4.0"
implementation "androidx.media3:media3-exoplayer-rtsp:1.4.0"
implementation "androidx.media3:media3-ui:1.4.0"
implementation "androidx.media3:media3-common:1.4.0"
implementation "androidx.media3:media3-session:1.4.0"
implementation "androidx.media3:media3-datasource:1.4.0"
implementation "androidx.media3:media3-datasource-rtmp:1.4.0"
Откройте XML-файл макета интерфейса воспроизведения и добавьте следующую конфигурацию атрибутов в корневой макет:
xmlns:app="http://schemas.android.com/apk/res-auto"
Затем добавьте внутрь макета узел управления PlayerView из библиотеки ExoPlayer, например:
<!-- Отображает ли use_controller панель управления, show_timeout — интервал исчезновения панели управления, отображает ли show_buffering буфер, режим регулировки размера resize_mode -->
<androidx.media3.ui.PlayerView
android:id="@+id/pv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:show_buffering="always"
app:show_timeout="5000"
app:use_controller="true"
app:resize_mode="fit"/>
Сначала добавьте следующую строку кода для объявления объекта PlayerView:
private ExoPlayer mPlayer; // Объявите новый тип объекта игрока
Затем добавьте следующий код в метод onCreate, чтобы получить объект PlayerView и установить на него объект проигрывателя ExoPlayer:
PlayerView pv_content = findViewById(R.id.pv_content);
mPlayer = new ExoPlayer.Builder(this).build();
pv_content.setPlayer(mPlayer); // Установите объект игрока в представлении игрока
Затем добавьте следующий метод воспроизведения, чтобы начать воспроизведение онлайн-видео по указанной ссылке.
// Воспроизвести видео
private void playVideo(Uri uri) {
DataSource.Factory factory = new DefaultDataSource.Factory(this);
// Создать медиа-объект по указанному адресу
MediaItem videoItem = new MediaItem.Builder().setUri(uri).build();
// Создание медиа-источников на основе фабричных объектов и медиа-объектов.
MediaSource videoSource;
if (uri.getPath().endsWith("m3u8")) { // ссылка на хлс
videoSource = new HlsMediaSource.Factory(factory)
.createMediaSource(videoItem);
} else if (uri.getPath().startsWith("rtsp")) { // rtsp-ссылка
videoSource = new RtspMediaSource.Factory()
.createMediaSource(videoItem);
} else if (uri.getPath().startsWith("rtmp")) { // rtmp-ссылка
videoSource = new ProgressiveMediaSource.Factory(new RtmpDataSource.Factory())
.createMediaSource(videoItem);
} else { // Другие ссылки (обычные ссылки на видео, начинающиеся с http или https)
videoSource = new ProgressiveMediaSource.Factory(factory)
.createMediaSource(videoItem);
}
mPlayer.setMediaSource(videoSource); // Установите источник мультимедиа плеера
mPlayer.prepare(); // Игрок готов
mPlayer.play(); // Игрок начинает играть
}
Из приведенного выше кода воспроизведения мы видим, что здесь используются четыре режима воспроизведения ExoPlayer, а именно: воспроизведение ссылки HLS, воспроизведение ссылки RTMP, воспроизведение ссылки RTSP и воспроизведение обычного сетевого видео.
Откройте AndroidManifest.xml и добавьте следующую конфигурацию разрешений Интернета:
<uses-permission android:name="android.permission.INTERNET" />
Наконец, скомпилируйте и запустите приложение, и эффект проигрывателя, видимый на реальной машине, показан на рисунке ниже.
Видно, что библиотека ExoPlayer Media3 успешно запущена и онлайн-видео можно воспроизводить нормально.
Более подробную информацию о разработке FFmpeg можно найти в книге «Практика разработки FFmpeg: от нулевых основ до короткого онлайн-видео».