Основное демонстрационное приложение ExoPlayer служит двум основным целям:
- Предоставить относительно простой, но полнофункциональный пример использования ExoPlayer. Демо-приложение можно использовать как удобную отправную точку для разработки собственного приложения.
- Чтобы было проще попробовать ExoPlayer. Демо-приложение можно использовать для тестирования воспроизведения вашего собственного контента в дополнение к включенным образцам.
На этой странице описано, как получить, скомпилировать и запустить демонстрационное приложение. Здесь также описывается, как использовать его для воспроизведения собственных медиафайлов.
Получение кода
Исходный код основного демонстрационного приложения можно найти в папке demos/main
нашего проекта на GitHub . Если вы еще этого не сделали, клонируйте проект в локальный каталог:
git clone https://github.com/androidx/media.git
Затем откройте проект в Android Studio. В представлении Android Project вы должны увидеть следующее (соответствующие папки демо-приложения развернуты):
Компиляция и запуск
Чтобы скомпилировать и запустить демонстрационное приложение, выберите и запустите demo
конфигурацию в Android Studio. Демо-приложение будет установлено и запущено на подключенном устройстве Android. Мы рекомендуем использовать физическое устройство, если это возможно. Если вместо этого вы хотите использовать эмулятор, прочтите раздел «Эмуляторы» в разделе «Поддерживаемые устройства» и убедитесь, что ваше виртуальное устройство использует образ системы с уровнем API не ниже 23.
Демо-приложение представляет собой список образцов ( SampleChooserActivity
). Выбор образца откроет второе действие ( PlayerActivity
) для воспроизведения. Демо-версия включает элементы управления воспроизведением и функцию выбора трека. Он также использует служебный класс EventLogger
ExoPlayer для вывода полезной отладочной информации в системный журнал. Это журналирование можно просмотреть (вместе с журналом уровня ошибок для других тегов) с помощью команды:
adb logcat EventLogger:V *:E
Включение встроенных декодеров
ExoPlayer имеет ряд расширений, которые позволяют использовать встроенные программные декодеры, включая AV1, VP9, Opus, FLAC и FFmpeg (только аудио). Демо-приложение может быть построено для включения и использования этих расширений следующим образом:
- Создайте каждое из расширений, которые вы хотите включить. Обратите внимание, что это ручной процесс. Инструкции см. в файле
README.md
каждого расширения. В представлении «Варианты сборки» Android Studio установите для варианта сборки демонстрационного модуля значение
withDecoderExtensionsDebug
илиwithDecoderExtensionsRelease
, как показано на следующем рисунке.Скомпилируйте, установите и запустите
demo
конфигурацию как обычно.
По умолчанию декодер расширения будет использоваться только в том случае, если подходящего декодера платформы не существует. Можно указать, что предпочтительным должны быть декодеры расширения, как описано в следующих разделах.
Воспроизведение собственного контента
В демо-приложении есть несколько способов воспроизвести собственный контент.
1. Редактирование ресурсов/media.exolist.json
Примеры, перечисленные в демонстрационном приложении, загружаются из assets/media.exolist.json
. Редактируя этот файл JSON, можно добавлять и удалять образцы из демонстрационного приложения. Схема следующая, где [O] указывает на необязательный атрибут.
[
{
"name": "Name of heading",
"samples": [
{
"name": "Name of sample",
"uri": "The URI of the sample",
"extension": "[O] Sample type hint. Values: mpd, ism, m3u8",
"clip_start_position_ms": "[O] A start point to which the sample should be clipped, in milliseconds"
"clip_end_position_ms": "[O] An end point from which the sample should be clipped, in milliseconds"
"drm_scheme": "[O] Drm scheme if protected. Values: widevine, playready, clearkey",
"drm_license_uri": "[O] URI of the license server if protected",
"drm_force_default_license_uri": "[O] Whether to force use of "drm_license_uri" for key requests that include their own license URI",
"drm_key_request_properties": "[O] Key request headers if protected",
"drm_session_for_clear_content": "[O] Whether to attach a DRM session to clear video and audio tracks"
"drm_multi_session": "[O] Enables key rotation if protected",
"subtitle_uri": "[O] The URI of a subtitle sidecar file",
"subtitle_mime_type": "[O] The MIME type of subtitle_uri (required if subtitle_uri is set)",
"subtitle_language": "[O] The BCP47 language code of the subtitle file (ignored if subtitle_uri is not set)",
"ad_tag_uri": "[O] The URI of an ad tag to load via the IMA extension"
},
...etc
]
},
...etc
]
Списки воспроизведения сэмплов можно указать по схеме:
[
{
"name": "Name of heading",
"samples": [
{
"name": "Name of playlist sample",
"playlist": [
{
"uri": "The URI of the first sample in the playlist",
"extension": "[O] Sample type hint. Values: mpd, ism, m3u8"
"clip_start_position_ms": "[O] A start point to which the sample should be clipped, in milliseconds"
"clip_end_position_ms": "[O] An end point from which the sample should be clipped, in milliseconds"
"drm_scheme": "[O] Drm scheme if protected. Values: widevine, playready, clearkey",
"drm_license_uri": "[O] URI of the license server if protected",
"drm_force_default_license_uri": "[O] Whether to force use of "drm_license_uri" for key requests that include their own license URI",
"drm_key_request_properties": "[O] Key request headers if protected",
"drm_session_for_clear_content": "[O] Whether to attach a DRM session to clear video and audio tracks",
"drm_multi_session": "[O] Enables key rotation if protected",
"subtitle_uri": "[O] The URI of a subtitle sidecar file",
"subtitle_mime_type": "[O] The MIME type of subtitle_uri (required if subtitle_uri is set)",
"subtitle_language": "[O] The BCP47 language code of the subtitle file (ignored if subtitle_uri is not set)"
},
{
"uri": "The URI of the second sample in the playlist",
...etc
},
...etc
]
},
...etc
]
},
...etc
]
При необходимости заголовки запроса ключа указываются как объект, содержащий строковый атрибут для каждого заголовка:
"drm_key_request_properties": {
"name1": "value1",
"name2": "value2",
...etc
}
В действии выбора образца дополнительное меню содержит параметры, позволяющие указать, следует ли отдавать предпочтение декодерам расширения.
URI локальных файлов и ограничения хранилища с ограниченной областью действия.
При указании URI локальных файлов демонстрационное приложение запрашивает необходимые разрешения на доступ к хранилищу для чтения этих файлов. Однако в Android 13 невозможно загружать произвольные файлы, которые не заканчиваются типичным расширением медиафайла (например, .mp4
). Если вам нужно загрузить такой файл, вы можете поместить его в специальный каталог хранилища демонстрационного приложения, к которому нет ограничений доступа. Обычно он находится по адресу /sdcard/Android/data/androidx.media3.demo.main/files
.
2. Загрузка внешнего файла exolist.json
Демо-приложение может загружать внешние файлы JSON, используя приведенную выше схему и именуемые в соответствии с соглашением *.exolist.json
. Например, если вы разместили такой файл по адресу https://yourdomain.com/samples.exolist.json
, вы можете открыть его в демонстрационном приложении, используя:
adb shell am start -a android.intent.action.VIEW \ -d https://yourdomain.com/samples.exolist.json
Если щелкнуть ссылку *.exolist.json
(например, в браузере или почтовом клиенте) на устройстве с установленным демонстрационным приложением, она также откроется в демонстрационном приложении. Следовательно, размещение файла JSON *.exolist.json
обеспечивает простой способ распространения контента, который другие могут попробовать в демонстрационном приложении.
3. Выполнение намерения
Интенты можно использовать для обхода списка сэмплов и запуска непосредственно в воспроизведение. Чтобы воспроизвести один образец, установите для действия намерения значение androidx.media3.demo.main.action.VIEW
, а для его URI данных — значение воспроизводимого образца. Такое намерение можно запустить с терминала, используя:
adb shell am start -a androidx.media3.demo.main.action.VIEW \ -d https://yourdomain.com/sample.mp4
Поддерживаемые дополнительные возможности для одного образца намерения:
- Пример дополнительных настроек конфигурации:
-
mime_type
[String] Пример подсказки типа MIME. Например,application/dash+xml
для контента DASH. -
clip_start_position_ms
[Long] Начальная точка, до которой должен быть обрезан семпл, в миллисекундах. -
clip_end_position_ms
[Long] Конечная точка, от которой должен быть обрезан семпл, в миллисекундах. -
drm_scheme
[String] Схема DRM, если она защищена. Допустимые значения:widevine
,playready
clearkey
. Также принимаются UUID схемы DRM. -
drm_license_uri
[String] URI сервера лицензий, если он защищен. -
drm_force_default_license_uri
[Boolean] Следует ли принудительно использоватьdrm_license_uri
для запросов ключей, которые включают собственный URI лицензии. -
drm_key_request_properties
[массив строк] Заголовки запроса ключа, упакованные как имя1, значение1, имя2, значение2 и т. д., если они защищены. -
drm_session_for_clear_content
[Boolean] Присоединить ли сеанс DRM для очистки видео- и аудиодорожек. -
drm_multi_session
[Boolean] Включает ротацию ключей, если она защищена. -
subtitle_uri
[String] URI дополнительного файла субтитров. -
subtitle_mime_type
[String] MIME-тип subtitle_uri (обязательно, если установлен subtitle_uri). -
subtitle_language
[String] Код языка BCP47 файла субтитров (игнорируется, если subtitle_uri не установлен). -
ad_tag_uri
[String] URI тега объявления, который нужно загрузить с помощью [расширения IMA][]. -
prefer_extension_decoders
[Boolean] Указывает, являются ли декодеры расширений более предпочтительными, чем декодеры платформы.
-
При использовании adb shell am start
намерение, с помощью --es
можно установить дополнительную строку (например, --es extension mpd
). Необязательное логическое значение может быть установлено с помощью --ez
(например, --ez prefer_extension_decoders TRUE
). Необязательное длинное дополнение можно установить с помощью --el
(например, --el clip_start_position_ms 5000
). Дополнительный массив строк можно установить с помощью --esa
(например, --esa drm_key_request_properties name1,value1
).
Чтобы воспроизвести список воспроизведения семплов, установите действие намерения androidx.media3.demo.main.action.VIEW_LIST
. Пример дополнительных настроек конфигурации остается таким же, как и для androidx.media3.demo.main.action.VIEW
, за исключением двух отличий:
- Ключи дополнительных функций должны иметь подчеркивание и индекс образца, начинающийся с 0, в качестве суффикса. Например,
extension_0
будет указывать на тип первой выборки.drm_scheme_1
установит схему DRM для второго образца. - URI образца передается дополнительно с ключом
uri_<sample-index>
.
Другие дополнения, не зависящие от выборки, не меняются. Например, вы можете запустить в терминале следующую команду, чтобы воспроизвести список воспроизведения с двумя элементами, переопределив расширение второго элемента:
adb shell am start -a androidx.media3.demo.main.action.VIEW_LIST \ --es uri_0 https://a.com/sample1.mp4 \ --es uri_1 https://b.com/sample2.fake_mpd \ --es extension_1 mpd