Soluciona problemas


Cómo corregir el error "No se permite el tráfico HTTP de texto simple" errores

Este error se producirá si tu app solicita tráfico HTTP de texto simple (es decir, http:// en lugar de https://) cuando la configuración de seguridad de red sí lo hace. no permitirla. Si tu app se orienta a Android 9 (nivel de API 28) o versiones posteriores, texto simple El tráfico HTTP está inhabilitado según la configuración predeterminada.

Si tu app necesita trabajar con tráfico HTTP de texto simple, debes usar un configuración de seguridad de la red que lo permita. Ver Android documentación de seguridad de red para conocer los detalles. Para habilitar todo el tráfico HTTP de texto simple, puedes agregar android:usesCleartextTraffic="true" al elemento application de la AndroidManifest.xml

La app de demostración de ExoPlayer usa la configuración de seguridad de red predeterminada. no permite el tráfico HTTP de texto simple. Sigue las instrucciones para habilitarla. arriba.

Cómo corregir "SSLHandshakeException", "CertPathValidatorException" y "ERR_CERT_AUTHORITY_INVALID" errores

SSLHandshakeException, CertPathValidatorException y Todos con ERR_CERT_AUTHORITY_INVALID indican un problema con la SSL del servidor certificado. Estos errores no son específicos de ExoPlayer. Consulta Documentación de SSL para Android para obtener más información.

¿Por qué no se pueden realizar búsquedas en algunos archivos multimedia?

De forma predeterminada, ExoPlayer no admite la búsqueda en medios, ya que el único método para realizar operaciones de búsqueda precisas es que el jugador escanee e indexe archivo completo. ExoPlayer considera que estos archivos no se pueden buscar. Medios de comunicación más modernos Los formatos de contenedor incluyen metadatos para buscar (como un índice de muestra), tienen un algoritmo de búsqueda bien definido (por ejemplo, búsqueda de bisección interpolada para Ogg) o indican que su contenido tiene una tasa de bits constante. Las operaciones de búsqueda eficientes y son compatibles con ExoPlayer en estos casos.

Si necesitas realizar búsquedas, pero tienes medios que no se pueden buscar, te sugerimos que conviertas tu el contenido para usar un formato de contenedor más adecuado. Para archivos MP3, ADTS y AMR: También puedes habilitar la búsqueda bajo el supuesto de que los archivos tienen una tasa de bits, como se describe aquí.

¿Por qué la búsqueda de imágenes es imprecisa en algunos archivos MP3?

Los archivos MP3 con tasa de bits variable (VBR) no son adecuados en esencia para casos de uso que requieren una búsqueda exacta. Existen dos motivos para ello:

  1. Para una búsqueda exacta, un formato contenedor idealmente proporcionará una función precisa tiempo a bytes en un encabezado. Este mapeo permite que los jugadores solicitaron el tiempo de búsqueda al desplazamiento de bytes correspondiente y comenzaron a solicitar analizar y reproducir contenido multimedia desde ese ajuste. Los encabezados disponibles que se especifica en MP3 (como encabezados XING) son, desafortunadamente, a menudo imprecisa.
  2. Para los formatos de contenedor que no proporcionan una asignación precisa de tiempo a bytes (o una asignación de tiempo a bytes), es posible realizar una buscar si el contenedor incluye marcas de tiempo de muestra absolutas en la transmisión. En en este caso un jugador puede asignar el tiempo de búsqueda a una mejor aproximación de de desplazamiento de bytes, comienza a solicitar medios de ese desplazamiento, analiza el primer marca de tiempo de muestra absoluta y realizar de manera eficaz una búsqueda de objeto binario guiada hasta que encuentre la muestra correcta. Lamentablemente, MP3 no incluir marcas de tiempo de muestra absolutas en la transmisión, por lo que este enfoque no es como sea posible.

Por estos motivos, la única manera de realizar una búsqueda exacta en un archivo VBR MP3 es para analizar todo el archivo y crear manualmente una asignación de tiempo a bytes en la de fútbol favorito. Puedes habilitar esta estrategia usando FLAG_ENABLE_INDEX_SEEKING, que se puede configurar en un DefaultExtractorsFactory con setMp3ExtractorFlags Ten en cuenta que no se ajusta bien a archivos MP3 grandes, sobre todo si el usuario intenta llegar al final de la transmisión en breve. después de iniciar la reproducción, lo que requiere que el reproductor espere hasta que se descargue. e indexó toda la transmisión antes de realizar la búsqueda. En ExoPlayer, decidió optimizar la velocidad por sobre la exactitud en este caso Por lo tanto, FLAG_ENABLE_INDEX_SEEKING está inhabilitado de forma predeterminada.

Si controlas el contenido multimedia que reproduces, te recomendamos que uses un formato de contenedor adecuado, como MP4. No hay casos de uso que conozcamos donde MP3 es la mejor opción de formato de medios.

¿Por qué las búsquedas en mi video son lentas?

Cuando el reproductor busca una nueva posición de reproducción en un video, debe realizar dos cosas:

  1. Se cargan los datos correspondientes a la nueva posición de reproducción en el búfer. (esto puede no ser necesario si los datos ya están almacenados en búfer).
  2. Vacía el decodificador de video y empieza a decodificar desde el iframe (fotograma clave) antes de la nueva posición de reproducción, debido a la codificación dentro del fotograma que usa la mayoría de los de compresión. Para garantizar que el salto sea preciso (es decir, la reproducción comienza exactamente en la posición de búsqueda), todos los fotogramas entre las I-frame anterior y la posición de búsqueda deben decodificarse e inmediatamente descartadas (sin aparecer en la pantalla).

La latencia que introduce (1) se puede mitigar aumentando la cantidad de datos almacenados en búfer en la memoria por el reproductor o almacenando previamente los datos en el disco.

La latencia que introduce (2) se puede mitigar, ya sea reduciendo la exactitud del salto con ExoPlayer.setSeekParameters o volviendo a codificar el video tengan iframes más frecuentes (lo que dará como resultado un archivo de salida más grande).

¿Por qué no se reproducen algunos archivos MPEG-TS?

Algunos archivos MPEG-TS no contienen delimitadores de unidades de acceso (AUD). De forma predeterminada, ExoPlayer se basa en los AUD para detectar límites de fotogramas de forma económica. De manera similar, algunos Los archivos MPEG-TS no contienen fotogramas clave IDR. De forma predeterminada, estos son el único tipo de fotogramas clave considerados por ExoPlayer.

ExoPlayer parecerá estar bloqueado en el estado de almacenamiento en búfer cuando se te solicite que reproduzcas un Archivo MPEG-TS que carece de AUD o fotogramas clave de IDR. Si necesitas reproducir ese tipo de archivos, puedes hacerlo con FLAG_DETECT_ACCESS_UNITS y FLAG_ALLOW_NON_IDR_KEYFRAMES, respectivamente. Estas marcas se pueden configurar en una DefaultExtractorsFactory con setTsExtractorFlags o en un DefaultHlsExtractorFactory con el constructor. El uso de FLAG_DETECT_ACCESS_UNITS no tiene efectos secundarios, excepto de procesamiento más costoso en comparación con la detección de límites de fotogramas basada en AUD. Uso de FLAG_ALLOW_NON_IDR_KEYFRAMES puede generar daños visuales temporales en el el inicio de la reproducción e inmediatamente después de los saltos cuando reproduces algunos archivos MPEG-TS.

¿Por qué no se encuentran subtítulos en algunos archivos MPEG-TS?

Algunos archivos MPEG-TS incluyen pistas CEA-608 pero no se declaran en el metadatos del contenedor, por lo que ExoPlayer no puede detectarlos. Puedes especificar pistas de subtítulos proporcionando una lista de de subtítulos al DefaultExtractorsFactory, incluida la accesibilidad canales que se pueden utilizar para identificarlos en la transmisión MPEG-TS:

Kotlin

val extractorsFactory =
  DefaultExtractorsFactory()
    .setTsSubtitleFormats(
      listOf(
        Format.Builder()
          .setSampleMimeType(MimeTypes.APPLICATION_CEA608)
          .setAccessibilityChannel(accessibilityChannel)
          // Set other subtitle format info, such as language.
          .build()
      )
    )
val player: Player =
  ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, extractorsFactory)).build()

Java

DefaultExtractorsFactory extractorsFactory =
    new DefaultExtractorsFactory()
        .setTsSubtitleFormats(
            ImmutableList.of(
                new Format.Builder()
                    .setSampleMimeType(MimeTypes.APPLICATION_CEA608)
                    .setAccessibilityChannel(accessibilityChannel)
                    // Set other subtitle format info, such as language.
                    .build()));
Player player =
    new ExoPlayer.Builder(context, new DefaultMediaSourceFactory(context, extractorsFactory))
        .build();

¿Por qué algunos archivos MP4/FMP4 se reproducen incorrectamente?

Algunos archivos MP4/FMP4 contienen listas de edición que reescriben el cronograma de medios omitir, mover o repetir listas de muestras. ExoPlayer tiene compatibilidad parcial para aplicar listas de edición. Por ejemplo, puede retrasar o repetir grupos de muestras a partir de una muestra de sincronización, pero no trunca las muestras de audio ni Contenido multimedia previo al video para ediciones que no comienzan en una muestra de sincronización.

Si ves que una parte del contenido multimedia falta o se repite inesperadamente prueba configurar Mp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS o FragmentedMp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS, que provocará que el extractor ignore las listas de edición por completo. Estas se pueden configurar DefaultExtractorsFactory con setMp4ExtractorFlags o setFragmentedMp4ExtractorFlags

¿Por qué algunas transmisiones fallan con el código de respuesta HTTP 301 o 302?

Los códigos de respuesta HTTP 301 y 302 indican un redireccionamiento. Descripciones breves puedes encontrarlo en Wikipedia. Cuando ExoPlayer hace una solicitud y recibe un con el código de estado 301 o 302, por lo general, sigue el redireccionamiento y comenzar la reproducción normalmente. El único caso en el que esto no ocurre de forma predeterminada es para redireccionamientos entre protocolos. Un redireccionamiento entre protocolos es aquel que redirecciona de HTTPS a HTTP o viceversa (o con menos frecuencia, entre otro par de protocolos). Puedes probar si una URL genera un redireccionamiento entre protocolos mediante el siguiente comando: la herramienta de línea de comandos wget como se indica a continuación:

wget "https://yourserver.com/test.mp3" 2>&1  | grep Location

El resultado debería ser similar a este:

Location: https://second.com/test.mp3 [following]
Location: http://third.com/test.mp3 [following]

En este ejemplo, hay dos redireccionamientos. El primer redireccionamiento es de De https://yourserver.com/test.mp3 a https://second.com/test.mp3. Ambos son HTTPS, por lo que no es un redireccionamiento entre protocolos. El segundo redireccionamiento proviene de De https://second.com/test.mp3 a http://third.com/test.mp3. Esto redirecciona de HTTPS a HTTP y también lo es un redireccionamiento entre protocolos. ExoPlayer no seguir este redireccionamiento en su configuración predeterminada, lo que significa que la reproducción fallará.

Si lo necesitas, puedes configurar ExoPlayer para que siga los redireccionamientos entre protocolos cuando crees instancias de DefaultHttpDataSource.Factory que se usan en tu y mantener la integridad de su aplicación. Más información para seleccionar y configurar la pila de red aquí.

¿Por qué algunas transmisiones fallan con UnrecognizedInputFormatException?

Esta pregunta se relaciona con las fallas de reproducción de la siguiente forma:

UnrecognizedInputFormatException: None of the available extractors
(MatroskaExtractor, FragmentedMp4Extractor, ...) could read the stream.

Existen dos causas posibles para esta falla. La causa más común es que intentas reproducir DASH (mpd), HLS (m3u8) o SmoothStreaming (ism, isml) contenido, pero el reproductor intenta reproducirlo como una transmisión progresiva. Para jugar debes depender del módulo ExoPlayer respectivo. En los casos en que el URI de transmisión no termina con la extensión de archivo estándar, también puedes pasar MimeTypes.APPLICATION_MPD, MimeTypes.APPLICATION_M3U8 o MimeTypes.APPLICATION_SS a setMimeType de MediaItem.Builder para indicar explícitamente especificar el tipo de transmisión.

La segunda causa, menos común, es que ExoPlayer no es compatible con el contenedor formato del contenido multimedia que intentas reproducir. En este caso, la falla es funciona según lo previsto, pero puedes enviar una solicitud de función a nuestro Herramienta de seguimiento de errores que incluye detalles del formato del contenedor y una transmisión de pruebas Busca una solicitud de función existente antes de enviar una nueva.

¿Por qué setPlaybackParameters no funciona correctamente en algunos dispositivos?

Al ejecutar una compilación de depuración de tu app en Android M y versiones anteriores, puedes un rendimiento entrecortado, artefactos audibles y un alto uso de CPU cuando con la API de setPlaybackParameters Esto se debe a que una optimización importante para esta API está inhabilitada para las compilaciones de depuración que se ejecutan en estos versiones de Android.

Es importante tener en cuenta que este problema solo afecta a las compilaciones de depuración. No afectan las compilaciones de lanzamiento, para las que la optimización siempre está habilitada. De ahí que la y las versiones que proporciones a los usuarios finales no deberían verse afectadas por este problema.

¿Qué significa el mensaje "Se accede al reproductor en el subproceso equivocado"? significan estos errores?

Consulta Nota sobre los subprocesos en la página de introducción.

¿Cómo puedo corregir el error “Línea de estado inesperado: ICY 200 OK”?

Este problema puede ocurrir si la respuesta del servidor incluye una línea de estado ICY en lugar de uno que cumpla con HTTP. Las líneas de estado del código internacional están obsoletas y no debe usarse. Por lo tanto, si controlas el servidor, debes actualizarlo para proporcionar una respuesta compatible con HTTP. Si no puedes hacerlo, usa el La biblioteca OkHttp de ExoPlayer resolverá el problema, ya que puede controlar ICY. las líneas de estado correctamente.

¿Cómo puedo consultar si la transmisión que se está reproduciendo es en vivo?

Puedes consultar el método isCurrentWindowLive del jugador. Además, Puedes consultar isCurrentWindowDynamic para averiguar si la ventana es dinámica (es decir, se sigue actualizando con el tiempo).

¿Cómo sigo reproduciendo audio cuando mi app está en segundo plano?

Sigue estos pasos para garantizar la reproducción continua de audio cuando la app esté en segundo plano:

  1. Debes tener un servicio en primer plano en ejecución. Esto evita que el sistema desde finalizar el proceso para liberar recursos.
  2. Debes conservar un WifiLock y un WakeLock. Esto garantiza que el mantiene la radio Wi-Fi y la CPU activas. Esto se puede hacer fácilmente si se utiliza ExoPlayer llamando a setWakeMode, lo que hará que adquirir y liberar los bloqueos necesarios en los momentos correctos.

Es importante que liberes los bloqueos (si no usas setWakeMode) y detengas el servicio cuando deje de reproducirse el audio.

¿Por qué ExoPlayer admite mi contenido, pero la biblioteca de Cast de ExoPlayer no?

Es posible que el contenido que intentas reproducir no CORS habilitado. El framework de Cast requiere que el contenido tenga habilitado CORS en para poder tocarla.

¿Por qué no se reproduce el contenido, pero no se muestran errores?

Es posible que el dispositivo en el que estás reproduciendo el contenido no admitir un formato de muestra de medios específico. Esto se puede confirmar fácilmente agregando un objeto EventLogger como objeto de escucha para el reproductor y busca una línea similar a este en Logcat:

[ ] Track:x, id=x, mimeType=mime/type, ... , supported=NO_UNSUPPORTED_TYPE

NO_UNSUPPORTED_TYPE significa que el dispositivo no puede decodificar el contenido multimedia. formato de muestra especificado por mimeType. Consulta los formatos multimedia de Android documentación para obtener información sobre los formatos de muestra admitidos. ¿Cómo puedo obtener una biblioteca de decodificación para cargar y usar para la reproducción? también puede ser útil.

¿Cómo puedo hacer que se cargue una biblioteca de decodificación y se use para la reproducción?

  • La mayoría de las bibliotecas de decodificador tienen pasos manuales para extraer y compilar las dependencias. asegúrate de haber seguido los pasos del archivo README de la biblioteca correspondiente. Por ejemplo, para la biblioteca FFmpeg de ExoPlayer, es necesario seguir el en libraries/decoder_ffmpeg/README.md, incluida la transferencia marcas de configuración para habilitar decodificadores para cualquier formato que desees reproducir.
  • Para las bibliotecas que tienen código nativo, asegúrate de usar el del NDK de Android como se especifica en el archivo README y busca si hay errores que aparecen durante la configuración y la compilación. Deberías ver .so aparecerán en el subdirectorio libs de la ruta de acceso de la biblioteca para cada arquitectura compatible después de seguir los pasos en el archivo README.
  • Para probar la reproducción con la biblioteca de la aplicación de demostración, consulta habilitar decodificadores en paquetes. Consulta el archivo README de la biblioteca para instrucciones para usar la biblioteca desde tu propia aplicación.
  • Si usas DefaultRenderersFactory, deberías ver un nivel de información línea de registro como "Loaded FfmpegAudioRenderer" en Logcat cuando se carga el decodificador. Si falta, asegúrate de que la aplicación dependa del biblioteca de decodificación.
  • Si ves registros de nivel de advertencia de LibraryLoader en Logcat, indica que falló la carga del componente nativo de la biblioteca. Si esta comprueba que hayas seguido correctamente los pasos en el archivo README de la biblioteca y que no se muestren errores mientras se siguen las instrucciones.

Si sigues teniendo problemas para usar la decodificación de bibliotecas, consulta la Herramienta de seguimiento de errores de Media3 para detectar problemas recientes relevantes Si necesitas presentar un problema nuevo relacionado con la construcción de la parte nativa de la biblioteca, incluir el resultado completo de la línea de comandos de la ejecución de instrucciones README para ayudarnos para diagnosticar el problema.

¿Puedo reproducir videos de YouTube directamente con ExoPlayer?

No, ExoPlayer no puede reproducir videos de YouTube, como las URLs del formulario https://www.youtube.com/watch?v=... En cambio, debes utilizar la página API del reproductor IFrame, que es la manera oficial de reproducir videos de YouTube en Android.

La reproducción del video se entrecorta

Por ejemplo, es posible que el dispositivo no pueda decodificar el contenido con suficiente rapidez si, por ejemplo, la resolución o la tasa de bits del contenido superan las capacidades del dispositivo. Es posible que necesites usar contenido de menor calidad para obtener un buen rendimiento en dichos dispositivos.

Si experimentas interrupciones en el video en un dispositivo que ejecuta una versión de Android desde Android 6.0 (nivel de API 23) hasta Android 11 (nivel de API 30), especialmente cuando se reproduce contenido protegido por DRM o de alta velocidad de fotogramas, puedes probar Habilitar la cola de búfer asíncrona.

Errores de lint de API inestables

Media3 garantiza la compatibilidad binaria para un subconjunto de la plataforma de la API. El las partes que no garantizan la compatibilidad binaria se marcan con @UnstableApi Para dejar en claro esta distinción, los usos de Los símbolos de API generan un error de lint, a menos que tengan anotaciones con @OptIn.

La anotación @UnstableApi no implica nada sobre la calidad o el rendimiento de una API, solo el hecho de que no está "congelada".

Tienes dos opciones para controlar los errores inestables de lint de la API:

  • Cambia a una API estable que logre el mismo resultado.
  • Sigue usando la API inestable y anota el uso con @OptIn, como se mostrará más adelante.
Agrega la anotación @OptIn

Android Studio puede ayudarte a agregar la anotación:

Captura de pantalla: Cómo agregar la anotación de habilitación
Figura 2: Incorporación de una anotación @androidx.annotations.OptIn con Android Studio.

También puedes anotar manualmente sitios de uso específicos en Kotlin:

import androidx.annotation.OptIn
import androidx.media3.common.util.UnstableApi

@OptIn(UnstableApi::class)
fun functionUsingUnstableApi() { ... }

Y también en Java:

import androidx.annotation.OptIn;
import androidx.media3.common.util.UnstableApi;

@OptIn(markerClass = UnstableApi.class)
private void methodUsingUnstableApis() { ... }

Para habilitar los paquetes enteros, agrega un archivo package-info.java:

@OptIn(markerClass = UnstableApi.class)
package name.of.your.package;

import androidx.annotation.OptIn;
import androidx.media3.common.util.UnstableApi;

Se pueden habilitar proyectos enteros suprimendo el error de lint específico en su Archivo lint.xml:

 <?xml version="1.0" encoding="utf-8"?>
 <lint>
   <issue id="UnsafeOptInUsageError">
     <option name="opt-in" value="androidx.media3.common.util.UnstableApi" />
   </issue>
 </lint>

También hay una anotación kotlin.OptIn que no se debe usar. Es importante usar la anotación androidx.annotation.OptIn.