Aplicación de demostración de ExoPlayer

La app de demostración principal de ExoPlayer tiene dos propósitos principales:

  1. Proporcionar un ejemplo relativamente simple y con todas las funciones del uso de ExoPlayer. La app de demostración se puede usar como un punto de partida conveniente para desarrollar tu propia aplicación.
  2. Para que sea fácil probar ExoPlayer. La app de demo se puede usar para probar la reproducción de tu propio contenido, además de los ejemplos incluidos.

En esta página, se describe cómo obtener, compilar y ejecutar la app de demostración. También se describe cómo usarlo para reproducir tu propio contenido multimedia.

Obtén el código

El código fuente de la app principal de demostración se encuentra en la carpeta demos/main de Nuestro proyecto de GitHub. Si aún no lo hiciste, clona el proyecto en un directorio local:

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

A continuación, abre el proyecto en Android Studio. Deberías ver lo siguiente en la Vista de proyectos de Android (se expandieron las carpetas relevantes de la app de demostración):

El proyecto en Android Studio

Compilación y ejecución

Para compilar y ejecutar la app de demostración, selecciona y ejecuta la configuración demo en Android Studio La app de demostración se instalará y se ejecutará en un dispositivo Android conectado. Te recomendamos que uses un dispositivo físico si es posible. Si quieres usar un emulador En su lugar, lee la sección de emuladores en Dispositivos compatibles y asegúrate de que significa que su dispositivo virtual usa una imagen del sistema con un nivel de API de al menos 23.

SampleChooserActivity y PlayerActivity

La app de demostración presenta una lista de muestras (SampleChooserActivity). Selección una muestra abrirá una segunda actividad (PlayerActivity) para su reproducción. La demostración incluye controles de reproducción y funcionalidad de selección de pistas. También usa La clase de utilidad EventLogger de ExoPlayer para enviar información de depuración útil a el registro del sistema. Este registro puede verse (junto con el registro a nivel de error para otras etiquetas) con el siguiente comando:

adb logcat EventLogger:V *:E

Habilitación de decodificadores en paquetes

ExoPlayer tiene una serie de extensiones que permiten el uso de software empaquetado incluidos AV1, VP9, Opus, FLAC y FFmpeg (solo audio). La app de demostración para incluir y usar estas extensiones de la siguiente manera:

  1. Crea cada una de las extensiones que deseas incluir. Ten en cuenta que este es un un proceso manual. Consulta el archivo README.md de cada extensión para instrucciones.
  2. En la vista Build Variants de Android Studio, configura la variante de compilación para la demostración. módulo a withDecoderExtensionsDebug o withDecoderExtensionsRelease como que se muestra en la siguiente imagen.

    Cómo seleccionar la variante de compilación de la demostración `withDecoderExtensionsDebug`

  3. Compila, instala y ejecuta la configuración demo con normalidad.

De forma predeterminada, se usará un decodificador de extensiones solo si se usa un decodificador de plataforma adecuado no existe. Es posible especificar que los decodificadores de extensiones que prefieras, como se describe en las siguientes secciones.

Cómo reproducir tu propio contenido

Existen varias formas de reproducir tu propio contenido en la app de demostración.

1. Edición de assets/media.exolist.json

Las muestras que figuran en la app de demo se cargan desde assets/media.exolist.json. Cuando se edita este archivo JSON, es posible agregar y quitar muestras de la demostración . El esquema es el siguiente, donde [O] indica un atributo opcional.

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

Las playlists de muestras se pueden especificar con el siguiente esquema:

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

Si es necesario, los encabezados de solicitud de clave se especifican como un objeto que contiene una cadena para cada encabezado:

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

En la actividad del selector de muestra, el menú ampliado contiene opciones para que especifica si se prefieren los decodificadores de extensiones.

URI de archivos locales y restricciones de almacenamiento específico

Cuando se especifican los URI de archivos locales, la app de demostración solicita el almacenamiento necesario los permisos de acceso para leer estos archivos. Sin embargo, desde Android 13, es posible cargar archivos arbitrarios que no terminan en un archivo multimedia típico. (como .mp4). Si necesitas cargar un archivo de este tipo, puedes colocarlo en el directorio de almacenamiento específico de la app de demostración que no tiene restricciones de acceso. Esta suele estar en /sdcard/Android/data/androidx.media3.demo.main/files.

2. Carga un archivo exolist.json externo

La app de demostración puede cargar archivos JSON externos usando el esquema anterior y llamado según la convención *.exolist.json. Por ejemplo, si alojas un en https://yourdomain.com/samples.exolist.json, puedes abrirlo en app de demo con lo siguiente:

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

Hacer clic en un vínculo de *.exolist.json (por ejemplo, en el navegador o en un correo electrónico) cliente) en un dispositivo con la app de demostración instalada, también la abrirá en la demostración . Por lo tanto, alojar un archivo JSON *.exolist.json proporciona una forma sencilla de y distribuir contenido para que otros lo prueben en la app de demostración.

3. Cómo activar un intent

Los intents se pueden usar para omitir la lista de muestras y lanzarlos directamente reproducción. Para reproducir una sola muestra, establece la acción del intent en androidx.media3.demo.main.action.VIEW y su URI de datos al del de muestra para tocar. Este intent se puede activar desde la terminal con el siguiente comando:

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

Los extras opcionales admitidos para un único intent de muestra son los siguientes:

  • Ejemplos adicionales de configuración:
    • mime_type [String] Sugerencia de tipo de MIME de muestra. Por ejemplo: application/dash+xml para el contenido DASH.
    • clip_start_position_ms [Long] Un punto de partida hacia el que debe ser la muestra recortado, en milisegundos.
    • clip_end_position_ms [Long] Un punto de destino desde el que debe provenir la muestra recortado, en milisegundos.
    • drm_scheme [String] Esquema DRM si está protegido. Los valores válidos son widevine, playready y clearkey. También se aceptan los UUIDs de esquema de DRM.
    • drm_license_uri [String] URI del servidor de licencias si está protegido.
    • drm_force_default_license_uri [Booleano] Si se debe forzar el uso de drm_license_uri para las solicitudes de clave que incluyen su propio URI de licencia.
    • drm_key_request_properties [Array de cadenas] Encabezados de solicitud clave empaquetados como name1, value1, name2, value2, etc., si están protegidos.
    • drm_session_for_clear_content [Booleano] Si se debe adjuntar una sesión de DRM para borrar pistas de audio y video.
    • drm_multi_session [Booleano] Habilita la rotación de claves si está protegida.
    • subtitle_uri [String] El URI de un archivo de archivo adicional de subtítulos.
    • subtitle_mime_type [String] El tipo MIME de subtitle_uri (obligatorio si subtitle_uri).
    • subtitle_language [String] Es el código de idioma BCP47 del archivo de subtítulos. (se ignora si no se establece subtitle_uri)
    • ad_tag_uri [String] El URI de una etiqueta de anuncio que se cargará mediante el elemento [extensión de IMA][].
    • prefer_extension_decoders [Booleano] Si los decodificadores de extensiones son preferentes a los de la plataforma.

Cuando se usa adb shell am start para activar un intent, se puede agregar una string opcional adicional establecerse con --es (p.ej., --es extension mpd). Un valor booleano adicional opcional puede establecerse con --ez (p.ej., --ez prefer_extension_decoders TRUE). Un El extra largo se puede establecer con --el (p.ej., --el clip_start_position_ms 5000). Los El valor adicional de array de cadenas de cadenas opcional se puede establecer con --esa (p.ej., --esa drm_key_request_properties name1,value1).

Para reproducir una playlist de muestras, establece la acción del intent en androidx.media3.demo.main.action.VIEW_LIST La configuración de muestra los extras siguen siendo los mismos que los de androidx.media3.demo.main.action.VIEW excepto por dos diferencias:

  • Los extras las claves deben tener un guion bajo y el índice basado en 0 de la muestra como sufijo. Por ejemplo, extension_0 sugeriría el tipo de muestra para la primera muestra. drm_scheme_1 establecería el esquema DRM para la segunda muestra.
  • El URI de la muestra se pasa como un extra con la clave uri_<sample-index>.

Otros extras, que no dependen de una muestra, no se modifican. Por ejemplo, puedes ejecutar el siguiente comando en la terminal para reproducir una playlist con dos elementos: anulando la extensión del segundo 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