Основное демонстрационное приложение 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. Cannot be combined with mime_type. 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",
        "mime_type": "[O] The MIME type of the sample. Cannot be combined with extension.",
        "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. Cannot be combined with mime_type. 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",
            "mime_type": "[O] The MIME type of the sample. Cannot be combined with extension.",
            "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,playreadyclearkey. Также принимаются 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