Aplikacja demonstracyjna ExoPlayer

Główna aplikacja demonstracyjna ExoPlayer pełni 2 główne cele:

  1. Oto przykład stosunkowo prostego, ale w pełni funkcjonalnego zastosowania ExoPlayer. Aplikacja w wersji demonstracyjnej może stanowić wygodny punkt wyjścia do tworzenia dzięki własnej aplikacji.
  2. Żeby ułatwić Ci wypróbowanie ExoPlayer aplikacji w wersji demonstracyjnej można używać do testowania odtwarzania własne treści oprócz dołączonych fragmentów.

Na tej stronie dowiesz się, jak pobrać, skompilować i uruchomić aplikację w wersji demonstracyjnej. Opisuje także jak jej używać do odtwarzania własnych multimediów.

Pobieram kod

Kod źródłowy głównej aplikacji w wersji demonstracyjnej znajduje się w folderze demos/main naszego projektu GitHub. Skopiuj projekt do pliku katalog lokalny:

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

Następnie otwórz projekt w Android Studio. W Widok projektu na Androida (odpowiednie foldery aplikacji w wersji demonstracyjnej zostały rozwinięte):

Projekt w Android Studio

Kompiluję i uruchamiam

Aby skompilować i uruchomić aplikację w wersji demonstracyjnej, wybierz i uruchom konfigurację demo w Android Studio. Aplikacja w wersji demonstracyjnej zostanie zainstalowana i uruchomiona na połączonym urządzeniu z Androidem. Jeśli to możliwe, zalecamy użycie urządzenia fizycznego. Korzystanie z emulatora przeczytaj sekcję dotyczącą emulatorów obsługiwanych urządzeń i upewnij się, urządzenie wirtualne używa obrazu systemu z interfejsem API poziomu 23.

SampleChooserActivity i PlayerActivity

Aplikacja w wersji demonstracyjnej zawiera listę przykładów (SampleChooserActivity). Wybieram próbka otworzy drugą aktywność (PlayerActivity) do odtwarzania. Wersja demonstracyjna zawiera elementy sterujące odtwarzaniem i funkcję wyboru ścieżki. Wykorzystuje też Klasa narzędzi ExoPlayer EventLogger do przesyłania przydatnych informacji debugowania w dzienniku systemowym. Logowanie można wyświetlić (wraz z logowaniem na poziomie błędu dla inne tagi) za pomocą polecenia:

adb logcat EventLogger:V *:E

Włączanie pakietów dekoderów

ExoPlayer ma wiele rozszerzeń, które umożliwiają korzystanie z oprogramowania zawartego w pakiecie. takich jak AV1, VP9, Opus, FLAC i FFmpeg (tylko dźwięk). Aplikacja w wersji demonstracyjnej Rozszerzenia, które można utworzyć tak, aby uwzględniać i wykorzystywać te rozszerzenia:

  1. Utwórz wszystkie rozszerzenia, które chcesz uwzględnić. Pamiętaj, że jest to ręcznie. Zapoznaj się z plikiem README.md w każdym rozszerzeniu – za instrukcje.
  2. W widoku wariantów kompilacji w Android Studio ustaw wariant kompilacji dla wersji demonstracyjnej. moduł do withDecoderExtensionsDebug lub withDecoderExtensionsRelease jako na poniższej ilustracji.

    Wybieram wariant kompilacji demonstracyjnej `withDecoderExtensionsDebug`

  3. Skompiluj, zainstaluj i uruchom konfigurację demo w zwykły sposób.

Domyślnie dekoder rozszerzeń będzie używany tylko w przypadku odpowiedniego dekodera platformy nie istnieje. Można określić, że dekodery rozszerzeń powinny być zgodnie z opisem w kolejnych sekcjach.

Odtwarzanie własnych treści

Możesz odtwarzać własne treści w aplikacji w wersji demonstracyjnej na kilka sposobów.

1. Edytowanie zasobów/media.exolist.json

Przykłady wymienione w aplikacji w wersji demonstracyjnej są wczytywane z okresu assets/media.exolist.json. Edytując ten plik JSON, możesz dodawać przykłady do wersji demonstracyjnej i usuwać je z niej . Schemat jest następujący, gdzie [O] oznacza atrybut opcjonalny.

[
  {
    "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
]

Playlisty próbek można określić za pomocą schematu:

[
  {
    "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
]

W razie potrzeby nagłówki żądań klucza są określane jako obiekt zawierający ciąg znaków dla każdego nagłówka:

"drm_key_request_properties": {
  "name1": "value1",
  "name2": "value2",
  ...etc
}

W przykładowym działaniu selektora rozszerzone menu zawiera opcje określając, czy preferowane są dekodery rozszerzeń.

Identyfikatory URI plików lokalnych i ograniczenia dotyczące miejsca na dane

Gdy określasz identyfikatory URI plików lokalnych, aplikacja w wersji demonstracyjnej prosi o niezbędną pamięć uprawnienia dostępu do odczytu tych plików. Jednak w Androidzie 13 umożliwia ładowanie dowolnych plików, których format nie jest zakończony jako typowy plik multimedialny (np. .mp4). Jeśli musisz wczytać taki plik, możesz umieścić go w katalog pamięci aplikacji w wersji demonstracyjnej, który nie ma ograniczeń dostępu. Ten zwykle znajduje się pod adresem /sdcard/Android/data/androidx.media3.demo.main/files.

2. Wczytywanie zewnętrznego pliku exolist.json

Aplikacja demonstracyjna może ładować zewnętrzne pliki JSON za pomocą powyższego schematu o nazwie zgodnie z konwencją *.exolist.json. Na przykład, jeśli hostujesz pod adresem https://yourdomain.com/samples.exolist.json, możesz go otworzyć w aplikacji w wersji demonstracyjnej:

adb shell am start -a android.intent.action.VIEW \
    -d https://yourdomain.com/samples.exolist.json

kliknięcie linku *.exolist.json (na przykład w przeglądarce lub e-mailu), (klient) na urządzeniu z zainstalowaną aplikacją w wersji demonstracyjnej, zostanie ona również otwarta w wersji demonstracyjnej . Dlatego hostowanie pliku JSON *.exolist.json zapewnia prosty sposób rozpowszechnianie treści do wypróbowania w aplikacji w wersji demonstracyjnej.

3. Uruchamianie intencji

Intencji można używać do omijania listy przykładów i uruchamiania bezpośrednio odtwarzania. Aby odtworzyć 1 próbkę, ustaw działanie intencji na androidx.media3.demo.main.action.VIEW i jego identyfikator URI danych do identyfikatora fragment, który chcesz odtworzyć. Intencję taką można wywołać z terminala za pomocą polecenia:

adb shell am start -a androidx.media3.demo.main.action.VIEW \
    -d https://yourdomain.com/sample.mp4

Obsługiwane opcjonalne dodatki w przypadku pojedynczej przykładowej intencji to:

  • Przykładowe dodatki konfiguracji:
    • mime_type [Ciąg] Przykładowa wskazówka na temat typu MIME. Przykład: application/dash+xml w przypadku treści DASH.
    • clip_start_position_ms [Long] Punkt początkowy, w którym powinna znaleźć się próbka w milisekundach.
    • clip_end_position_ms [Długi] Punkt końcowy, z którego ma pochodzić próbka w milisekundach.
    • drm_scheme [Ciąg znaków] schemat DRM, jeśli jest chroniony. Prawidłowe wartości to widevine, playready i clearkey. Akceptujemy też identyfikatory UUID schematów DRM.
    • drm_license_uri [Ciąg] Identyfikator URI serwera licencji, jeśli jest chroniony.
    • drm_force_default_license_uri [Wartość logiczna] – określa, czy wymusić użycie drm_license_uri w przypadku żądań kluczy, które zawierają własny identyfikator URI licencji.
    • drm_key_request_properties [Tablica ciągu] Nagłówki żądań klucza spakowane jako nazwa1, wartość1, nazwa2, wartość2 itd., jeśli jest chroniona.
    • drm_session_for_clear_content [Wartość logiczna] Określa, czy dołączyć sesję DRM aby wyczyścić ścieżki audio i wideo.
    • drm_multi_session [Wartość logiczna]: włącza rotację klucza, jeśli jest zabezpieczona.
    • subtitle_uri [Ciąg] Identyfikator URI pliku pomocniczego napisów.
    • subtitle_mime_type [Ciąg] Typ MIME parametru Caption_uri (wymagany, jeśli parametr Caption_uri jest ustawiony).
    • subtitle_language [Ciąg] Kod języka BCP47 pliku napisów. (jest ignorowany, jeśli nie określono parametru Caption_uri).
    • ad_tag_uri [Ciąg] Identyfikator URI tagu reklamy do wczytania za pomocą funkcji [Rozszerzenie IMA][].
    • prefer_extension_decoders [wartość logiczna] określa, czy dekodery rozszerzeń są a nie platformowych.

Gdy do uruchamiania intencji za pomocą parametru adb shell am start możesz dodać opcjonalny dodatkowy ciąg znaków, być ustawiany za pomocą atrybutu --es (np. --es extension mpd). Opcjonalna dodatkowa wartość logiczna może być ustawiany za pomocą atrybutu --ez (np. --ez prefer_extension_decoders TRUE). Parametr opcjonalny długiego dodatkowego elementu można ustawić za pomocą parametru --el (np. --el clip_start_position_ms 5000). An opcjonalny ciąg znaków w tablicy można ustawić za pomocą funkcji --esa (np. --esa drm_key_request_properties name1,value1).

Aby odtworzyć playlistę sampli, ustaw działanie intencji na androidx.media3.demo.main.action.VIEW_LIST Przykładowa konfiguracja dodatki pozostają takie same jak w przypadku androidx.media3.demo.main.action.VIEW, oprócz dwóch różnic:

  • Dodatki klucze powinny mieć podkreślenie i indeks zaczynający się od 0, jako przyrostek. Na przykład dyrektywa extension_0 wskaże typ przykładowego pola pierwszego przykład. drm_scheme_1 ustawiłby schemat DRM dla drugiego przykładu.
  • Identyfikator URI próbki jest przekazywany jako dodatkowy za pomocą klucza uri_<sample-index>.

Inne dodatki, które nie są zależne od próbki, nie ulegają zmianie. Na przykład: możesz uruchomić w terminalu to polecenie, by odtworzyć playlistę z 2 elementami: zastępując rozszerzenie drugiego elementu:

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