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 .
- ¿Qué tan mala es Android SoundPool? ¿Qué alternativa usar?
- Detectar si el auricular tiene micrófono
- ¿Cómo grabo simultáneamente el audio de cada micrófono en una matriz de micrófonos en un buffer separado en Android?
- Android deja de grabar falla
- Modificación de la secuencia de audio de llamada en Android 4.0 ICS
¿Cuál podría ser la razón de esto?
- Comunicación de datos por canal de audio
- Cómo extraer muestras de PCM de la salida del decodificador de MediaCodec
- Música de backround de Android a través de múltiples actividades; Cómo presionar el botón Inicio
- La muerte global de AudioTrack
- Múltiples AudioTracks, Single Thread o Multiple?
- Android emulador en ADT plugin no se ejecuta
- Grabar sonido en Android y leer Amplitud
- Bajo retardo de audio en Android vía NDK
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.
- Android – ¿Por qué utilizar una Interfaz considerada la mejor práctica de comunicación entre Actividad y Fragmento?
- ¿Por qué el tipo primitivo corto es significativamente más lento que largo o int?