2011-01-26 10 views
13

Dada una ruta (en la tarjeta SD) a un archivo de audio, ¿cuál es la mejor forma de determinar la duración del audio en milisegundos y el formato de archivo (o tipo de medios de Internet) ?Determinación de la duración y el formato de un archivo de audio

(por la duración que se podrían usar MediaPlayer 's getDuration -method, pero esto parece demasiado lento/torpe.)

+2

Este problema también se discute en: - http://stackoverflow.com/questions/4709883/ - http://stackoverflow.com/questions/3357484/ – Kaarel

Respuesta

1

Sólo tomando una puñalada en una respuesta para usted, pero es probable que podrían determinar el tipo de medio de la extensión de archivo - que creo que MediaFile puede poder ayudarte con. En cuanto a la duración, creo que el método getDuration() es realmente una llamada nativa, por lo que no sé si podrás hacerlo mucho más rápido.

+0

Gracias, MediaFile no es parte del SDK, ver http://stackoverflow.com/questions/2726280/ – Kaarel

12

Para la longitud del archivo de audio:

File yourFile; 
MediaPlayer mp = new MediaPlayer(); 
FileInputStream fs; 
FileDescriptor fd; 
fs = new FileInputStream(yourFile); 
fd = fs.getFD(); 
mp.setDataSource(fd); 
mp.prepare(); 
int length = mp.getDuration(); 
mp.release(); 

Comprobar esto para MimeType: https://stackoverflow.com/a/8591230/3937699

+0

Gracias, soy consciente de esta solución. Me pregunto si hay otra forma. – Kaarel

+0

Si puede salirse con la suya sin llamar a prepararse, no debería ser demasiado ineficiente. –

+2

getDuration() se puede llamar en un estado que sea uno de {Prepared, Started, Paused, Stopped, PlaybackCompleted}, por lo que prepare() es obligatorio. – Kaarel

5

Creo que la forma más fácil es:

MediaPlayer mp = MediaPlayer.create(this, Uri.parse(uriOfFile); 
int duration = mp.getDuration(); 
mp.release(); 
/*convert millis to appropriate time*/ 
return String.format("%d min, %d sec", 
      TimeUnit.MILLISECONDS.toMinutes(duration), 
      TimeUnit.MILLISECONDS.toSeconds(duration) - 
      TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration)) 
     ); 
Cuestiones relacionadas