Applicazione demo ExoPlayer

L'app demo principale di ExoPlayer ha due scopi principali:

  1. Per fornire un esempio relativamente semplice ma completo dell'utilizzo di ExoPlayer. L'app demo può essere utilizzata come comodo punto di partenza per sviluppare la tua app.
  2. Per semplificare la prova di ExoPlayer. L'app demo può essere usata per testare la riproduzione dei tuoi contenuti, oltre agli esempi inclusi.

In questa pagina viene descritto come scaricare, compilare ed eseguire l'app demo. Descrive inoltre come usarlo per riprodurre i tuoi contenuti multimediali.

Recupero del codice in corso...

Il codice sorgente dell'app demo principale è disponibile nella cartella demos/main di nel nostro progetto GitHub. Se non l'hai ancora fatto, clona il progetto in un directory locale:

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

Quindi, apri il progetto in Android Studio. Nella sezione Visualizzazione Progetto Android (le cartelle pertinenti dell'app demo sono state espanse):

Il progetto in Android Studio

Compilazione ed esecuzione

Per compilare ed eseguire l'app demo, seleziona ed esegui la configurazione demo in Android Studio. L'app demo verrà installata ed eseguita su un dispositivo Android connesso. Se possibile, consigliamo di utilizzare un dispositivo fisico. Se vuoi utilizzare un emulatore leggi la sezione dedicata agli emulatori di Dispositivi supportati e assicurati che Il dispositivo virtuale utilizza un'immagine di sistema con un livello API di almeno 23.

SampleChooserActivity e PlayerActivity

L'app demo presenta un elenco di esempi (SampleChooserActivity). Selezione un Sample aprirà una seconda attività (PlayerActivity) per la riproduzione. La demo include i controlli di riproduzione e la funzionalità di selezione delle tracce. Utilizza anche Classe di utilità EventLogger di ExoPlayer per restituire informazioni di debug utili a nel log di sistema. È possibile visualizzare questo logging (insieme al logging a livello di errore per altri tag) con il comando:

adb logcat EventLogger:V *:E

Abilitazione dei decoder in bundle

ExoPlayer ha varie estensioni che consentono l'uso di software in bundle tra cui AV1, VP9, Opus, FLAC e FFmpeg (solo audio). L'app demo può essere creato per includere e utilizzare queste estensioni nel seguente modo:

  1. Crea ciascuna delle estensioni che vuoi includere. Tieni presente che si tratta di un processo manuale. Fai riferimento al file README.md in ogni estensione per istruzioni.
  2. Nella visualizzazione Varianti della build di Android Studio, imposta la variante della build per la demo al modulo withDecoderExtensionsDebug o withDecoderExtensionsRelease come come mostrato nell'immagine di seguito.

    Selezione della variante di build demo "withDecoderextensionsDebug"

  3. Compila, installa ed esegui la configurazione demo come di consueto.

Per impostazione predefinita, verrà usato un decoder di estensione solo se un decoder di piattaforma adatto inesistente. È possibile specificare che i decoder delle estensioni come descritto nelle sezioni seguenti.

Riproduzione dei tuoi contenuti

Esistono diversi modi per riprodurre i tuoi contenuti nell'app demo.

1. Modifica di asset/media.exolist.json

Gli esempi elencati nell'app demo vengono caricati da assets/media.exolist.json. Modificando questo file JSON, è possibile aggiungere e rimuovere campioni dalla demo dell'app. Lo schema è il seguente, dove [O] indica un attributo facoltativo.

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

Le playlist di esempi possono essere specificate utilizzando lo schema:

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

Se necessario, le intestazioni delle richieste di chiave vengono specificate come oggetti contenenti una stringa per ciascuna intestazione:

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

Nell'attività di esempio del selettore, il menu extra contiene le opzioni per che specifica se preferire i decoder delle estensioni.

URI dei file locali e restrizioni relative all'archiviazione dell'ambito

Quando specifichi gli URI dei file locali, l'app demo richiede lo spazio di archiviazione necessario le autorizzazioni di accesso per leggere questi file. Tuttavia, da Android 13, possibile caricare file arbitrari che non terminano in un tipico file multimediale (ad esempio .mp4). Se devi caricare un file di questo tipo, puoi inserirlo la directory di archiviazione specifica dell'app demo senza limitazioni di accesso. Questo si trova in genere presso /sdcard/Android/data/androidx.media3.demo.main/files.

2. Caricamento di un file exolist.json esterno

L'app demo può caricare file JSON esterni utilizzando lo schema sopra indicato e denominato in base alla convenzione *.exolist.json. Ad esempio, se ospiti un file in https://yourdomain.com/samples.exolist.json, puoi aprirlo nel app demo con:

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

Facendo clic su un link *.exolist.json (ad esempio, nel browser o in un'email) client) su un dispositivo su cui è installata l'app demo, la aprirà anche nella demo dell'app. Pertanto, ospitare un file JSON *.exolist.json offre un modo semplice mentre distribuisce contenuti che altri possano provare nell'app demo.

3. Attivare un intent

Gli intent possono essere usati per bypassare l'elenco dei campioni e avviarli direttamente per riprodurre un video. Per riprodurre un singolo Sample, imposta l'azione dell'intent su androidx.media3.demo.main.action.VIEW e il relativo URI di dati a quello del campione da riprodurre. Un intent di questo tipo può essere attivato dal terminale utilizzando:

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

Gli extra facoltativi supportati per un singolo intent di esempio sono:

  • Esempi di configurazione extra:
    • mime_type [Stringa] Suggerimento per il tipo MIME di esempio. Ad esempio: application/dash+xml per i contenuti DASH.
    • clip_start_position_ms [Lungo] Un punto di partenza a cui deve essere posizionato il campione troncato in millisecondi.
    • clip_end_position_ms [Lungo] Un punto finale da cui dovrebbe essere il campione troncato in millisecondi.
    • drm_scheme [Stringa] Schema DRM se protetto. I valori validi sono widevine, playready e clearkey. Sono accettati anche gli UUID dello schema DRM.
    • drm_license_uri [Stringa] URI del server di licenze, se protetto.
    • drm_force_default_license_uri [Booleano] Se forzare l'utilizzo di drm_license_uri per le richieste chiave che includono l'URI della propria licenza.
    • drm_key_request_properties [Array di stringhe] Intestazioni delle richieste chiave, pacchettizzate come name1, value1, name2, value2 ecc. se protetti.
    • drm_session_for_clear_content [Booleano] Se collegare una sessione DRM per cancellare le tracce video e audio.
    • drm_multi_session [Booleano] Attiva la rotazione della chiave se protetta.
    • subtitle_uri [Stringa] L'URI di un file collaterale dei sottotitoli.
    • subtitle_mime_type [Stringa] Il tipo MIME di subtitle_uri (obbligatorio se Sottotitoli_uri è impostato).
    • subtitle_language [Stringa] Il codice lingua BCP47 del file dei sottotitoli (ignorato se subtitle_uri non è impostato).
    • ad_tag_uri [Stringa] L'URI di un tag annuncio da caricare utilizzando la proprietà [estensione IMA][].
    • prefer_extension_decoders [Booleano] Se i decoder delle estensioni sono preferiti rispetto a quelli della piattaforma.

Quando utilizzi adb shell am start per attivare un intent, un extra facoltativo di stringa può essere impostato con --es (ad es. --es extension mpd). Un extra booleano facoltativo può essere impostato con --ez (ad es. --ez prefer_extension_decoders TRUE). Un'intestazione facoltativa gli extra lunghi possono essere impostati con --el (ad es. --el clip_start_position_ms 5000). Un un array di stringhe facoltativo può essere impostato con --esa (ad es. --esa drm_key_request_properties name1,value1).

Per riprodurre una playlist di esempi, imposta l'azione dell'intent su androidx.media3.demo.main.action.VIEW_LIST. La configurazione di esempio i vantaggi extra rimangono invariati rispetto a androidx.media3.demo.main.action.VIEW, tranne che per due differenze:

  • Gli extra le chiavi devono avere un trattino basso e un indice in base a 0 del campione come suffisso. Ad esempio, extension_0 suggerisce il tipo di esempio per il primo campione. drm_scheme_1 imposterebbe lo schema DRM per il secondo campione.
  • L'URI del campione viene passato come extra con la chiave uri_<sample-index>.

Gli altri extra, che non dipendono dal campione, non cambiano. Ad esempio, puoi eseguire questo comando nel terminale per riprodurre una playlist con due elementi: eseguendo l'override dell'estensione del secondo elemento:

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