Демо-приложение ExoPlayer

Основное демонстрационное приложение ExoPlayer служит двум основным целям:

  1. Предоставить относительно простой, но полнофункциональный пример использования ExoPlayer. Демо-приложение можно использовать как удобную отправную точку для разработки собственного приложения.
  2. Чтобы было проще попробовать ExoPlayer. Демо-приложение можно использовать для тестирования воспроизведения вашего собственного контента в дополнение к включенным образцам.

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

Получение кода

Исходный код основного демонстрационного приложения можно найти в папке demos/main нашего проекта на GitHub . Если вы еще этого не сделали, клонируйте проект в локальный каталог:

git clone https://github.com/androidx/media.git

Затем откройте проект в Android Studio. В представлении Android Project вы должны увидеть следующее (соответствующие папки демо-приложения развернуты):

Проект в Android Studio

Компиляция и запуск

Чтобы скомпилировать и запустить демонстрационное приложение, выберите и запустите demo конфигурацию в Android Studio. Демо-приложение будет установлено и запущено на подключенном устройстве Android. Мы рекомендуем использовать физическое устройство, если это возможно. Если вместо этого вы хотите использовать эмулятор, прочтите раздел «Эмуляторы» в разделе «Поддерживаемые устройства» и убедитесь, что ваше виртуальное устройство использует образ системы с уровнем API не ниже 23.

SampleChooserActivity и PlayerActivity

Демо-приложение представляет собой список образцов ( SampleChooserActivity ). Выбор образца откроет второе действие ( PlayerActivity ) для воспроизведения. Демо-версия включает элементы управления воспроизведением и функцию выбора трека. Он также использует служебный класс EventLogger ExoPlayer для вывода полезной отладочной информации в системный журнал. Это журналирование можно просмотреть (вместе с журналом уровня ошибок для других тегов) с помощью команды:

adb logcat EventLogger:V *:E

Включение встроенных декодеров

ExoPlayer имеет ряд расширений, которые позволяют использовать встроенные программные декодеры, включая AV1, VP9, ​​Opus, FLAC и FFmpeg (только аудио). Демонстрационное приложение может быть построено для включения и использования этих расширений следующим образом:

  1. Создайте каждое из расширений, которые вы хотите включить. Обратите внимание, что это ручной процесс. Инструкции см. в файле README.md каждого расширения.
  2. В представлении «Варианты сборки» Android Studio установите для варианта сборки демонстрационного модуля значение withDecoderExtensionsDebug или withDecoderExtensionsRelease , как показано на следующем рисунке.

    Выбор демо-варианта сборки withDecoderExtensionsDebug

  3. Скомпилируйте, установите и запустите 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