- Cómo corregir el error "No se permite el tráfico HTTP de texto simple" errores
- Cómo corregir "SSLHandshakeException", "CertPathValidatorException" y "ERR_CERT_AUTHORITY_INVALID" errores
- ¿Por qué no se pueden realizar búsquedas en algunos archivos multimedia?
- ¿Por qué la búsqueda no es precisa en algunos archivos MP3?
- ¿Por qué las búsquedas en mis videos son lentas?
- ¿Por qué no se reproducen algunos archivos MPEG-TS?
- ¿Por qué no se encuentran subtítulos en algunos archivos MPEG-TS?
- ¿Por qué algunos archivos MP4/FMP4 se reproducen incorrectamente?
- ¿Por qué algunas transmisiones fallan con el código de respuesta HTTP 301 o 302?
- ¿Por qué algunas transmisiones fallan con UnrecognizedInputFormatException?
- ¿Por qué setPlaybackParameters no funciona correctamente en algunos dispositivos?
- ¿Qué significa el mensaje "Se accede al reproductor en el subproceso equivocado"? significan estos errores?
- ¿Cómo puedo corregir el error “Línea de estado inesperado: ICY 200 OK”?
- ¿Cómo puedo consultar si la transmisión que se está reproduciendo es una transmisión en vivo?
- ¿Cómo sigo reproduciendo audio cuando mi app está en segundo plano?
- ¿Por qué ExoPlayer admite mi contenido, pero la biblioteca de Cast de ExoPlayer no?
- ¿Por qué no se reproduce el contenido, pero no se muestran errores?
- ¿Cómo puedo hacer que se cargue una biblioteca de decodificación y se use para la reproducción?
- ¿Puedo reproducir videos de YouTube directamente con ExoPlayer?
- La reproducción de videos se entrecorta
- Errores de lint de API inestables
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:
- 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.
- 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:
- 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).
- 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:
- Debes tener un servicio en primer plano en ejecución. Esto evita que el sistema desde finalizar el proceso para liberar recursos.
- Debes conservar un
WifiLock
y unWakeLock
. Esto garantiza que el mantiene la radio Wi-Fi y la CPU activas. Esto se puede hacer fácilmente si se utilizaExoPlayer
llamando asetWakeMode
, 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 subdirectoriolibs
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:
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
.