MediaPlayer.getCurrentPosition ()> mediaPlayer.getDuration () al final de la reproducción del archivo mp3

Estoy reproduciendo un archivo mp3 transmitido desde la red en mi aplicación, algunos archivos mp3 tiene un comportamiento extraño: mediaPlayer.getCurrentPosition() es mayor que mediaPlayer.getDuration() al final, durante unos 3 segundos.

Los archivos mp3 están codificados en CBR .

¿Cuál podría ser la razón de esto?

Finalmente resolvió el problema mediante la conversión de los archivos mp3, este es el comando que estoy usando:

lame --mp3input -t -ms -b 128 --cbr input.mp3 output.mp3

Hay algunas razones por las que puede obtener este comportamiento.

Primero parece que la gente tenía mejores resultados usando archivos mp3 a exactamente 44100Hz , porque aparentemente la clase MediaPlayer está asumiendo este valor y escala el tiempo en consecuencia, haciendo valores extraños para los archivos que no utilizan este muestreo.

También es necesario comprobar el modo de sus canales, e intente utilizar estereofonia conjunta o estéreo L / R forzado. Joint debe ser el predeterminado, pero sus archivos podrían haber sido anteriormente codificados mal, por lo que vale la pena intentarlo. Es interesante observar que Forced L / R Stereo podría perder calidad para el mismo bitrate que Joint.

También sería útil comprobar la salida de soxi que es parte del paquete sox (también se puede hacer con ffmpeg), que le dará el número de canales, tasa de muestreo, velocidad de bits y número de canales.

También es posible que desee comprobar el contenido sin formato del archivo mp3 si hizo algún tratamiento en ellos utilizando cualquier aplicación para la presencia de contenido xml basura que podría haber sido insertado durante la exportación.

Si tienes la posibilidad de modificar los archivos mp3 que estás transmitiendo, (lo cual suena como lo haces ya que puedes contar la velocidad de bits) estos son lo que intentaría primero. Si es más como un tipo de carga de usuario de material, tal vez debería tener una mirada a otra solución en su lugar, como ExoPlayer que tiene unos miles de estrellas y desarrollo activo. Envuelve el api de MediaPlayer todavía, pero vale la pena intentarlo.

También tienes que considerar que podría ser un problema de roscado, donde el jugador dejaría de jugar, pero el cronómetro en realidad seguir adelante, dándole este resultado en el que es superior a la duración real de la canción. 3 segundos parece un poco demasiado para explicar por eso, pero eso es sólo una idea.

  • ¿Cómo se determina la latencia de audio (AudioTrack) en Android?
  • Necesita ayuda / sugerencias sobre el procesamiento de sonido Android
  • Android: Cómo detener el servicio de música de mi aplicación, si otra aplicación reproduce música.
  • ¿Grabar audio en Android con MediaPlayer como fuente?
  • Directorio para almacenar archivos de audio en Android
  • Reproducir stream de RTMP de audio en android
  • Sonido de carga de Soundpool Ya existe un componente del nombre 'OMX.qcom.audio.decoder.aac', ignorando éste
  • Cómo dibujar la forma de onda del reproductor de música de Android?
  • Obtener la frecuencia de un archivo de audio en cada 1/4 segundos en android
  • Análisis de audio de Android en tiempo real
  • PhoneGap plugin de Android para la grabación de audio de mayor calidad?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.