studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java android buffer audio-streaming android-mediaplayer

java - para - manual de programacion android pdf



Android MediaPlayer tarda mucho tiempo en prepararse y almacenarse en búfer (3)

Mi aplicación tarda mucho tiempo en preparar y almacenar un flujo de audio. He leído esta pregunta ¿Por qué demora tanto el MediaPlayer de Android preparar algunas transmisiones en vivo para la reproducción? Sin embargo, solo dice que las personas han experimentado este problema, no indica cómo mejorar el problema.

Estoy experimentando esto en todas las versiones de Android, probado desde 2.2 hasta 4.1.2.

Los flujos están en una tasa de bits adecuada para la conexión móvil y 3G. El mismo flujo toma menos de un segundo para iniciar el almacenamiento en búfer en la aplicación de iOS equivalente.

¿Hay una manera de especificar la cantidad de tiempo que se debe almacenar en búfer? Sé que la aplicación de radio Tune In ofrece esta función ( https://play.google.com/store/apps/details?id=tunein.player ).

Gracias.

Edición: lo probé de nuevo y descubrí que solo ocurre en dispositivos que ejecutan Gingerbread y superiores (> = 2.3). Sé que Android cambió el marco subyacente de OpenCore a StageFright. Entonces, ¿cómo puedo optimizar el marco de medios? Parece incorrecto que el antiguo HTC Wildfire pueda preparar, transmitir y reproducir, literalmente 10 veces más rápido que el nuevo HTC One X y Nexus 7.


He luchado con esta pregunta durante meses. Finalmente encontré la solución.

El verdadero problema está en la implementación de la clase MediaPlayer. Particularmente con la forma en que MediaPlayer almacena los datos. Esta es la razón por la que la solución es crear su propio búfer, guardarlo en un archivo temporal y enviarlo a MediaPlayer.

Este tutorial y el código fuente explican exactamente cómo. http://androidstreamingtut.blogspot.nl/2012/08/custom-progressive-audio-streaming-with.html

Al adaptar este código, es fácil crear un reproductor de transmisión mucho mejor.

Los desarrolladores de Google realmente jodieron aquí.

EDIT: Esta respuesta es bastante antigua. Hoy en día recomendaría no usar MediaPlayer y, en su lugar, utilizar ExoPlayer . Es extensible, estable y puede reproducir muchos tipos diferentes de medios. Puede encontrarlo aquí: https://github.com/google/ExoPlayer/


Lo único que recomendaría es jugar un poco con la codificación. Por ejemplo, para MP4s, asegúrese de que MOOV Atom esté ubicado al principio del archivo (hay suficientes preguntas en S / O sobre cómo hacer esto con ffmpeg, etc.). Con los MP3, puedes mirar diferentes códecs o tasas de bits, por ejemplo.

Por ejemplo, puede probar una serie de archivos de audio que encuentre en línea, y si ve uno que no demore mucho en almacenarse en búfer, intente codificar sus archivos de la misma manera.


Realmente no hay mucho que puedas hacer ya que la clase de Android MediaPlayer no proporciona acceso a configuraciones de nivel inferior como el tamaño del búfer. La única alternativa sería crear tu propio reproductor con AudioTrack y una biblioteca como FFmpeg para hacer la decodificación.