2010-06-15 11 views
12

Las respuestas proporcionadas en How do I get a sound file’s total time in Java? funcionan bien para archivos wav, pero no para archivos mp3.¿Cómo obtengo el tiempo total de un archivo mp3 en Java?

Son (dado un archivo):

AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file); 
AudioFormat format = audioInputStream.getFormat(); 
long frames = audioInputStream.getFrameLength(); 
double durationInSeconds = (frames+0.0)/format.getFrameRate(); 

y:

AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file); 
AudioFormat format = audioInputStream.getFormat(); 
long audioFileLength = file.length(); 
int frameSize = format.getFrameSize(); 
float frameRate = format.getFrameRate(); 
float durationInSeconds = (audioFileLength/(frameSize * frameRate)); 

Ellos dan el mismo resultado correcto para archivos WAV, pero los resultados erróneos y diferentes para los archivos mp3.

¿Alguna idea de qué debo hacer para obtener la duración del archivo mp3?

+0

Re lated: http://stackoverflow.com/questions/1065086/length-of-an-mp3-wav-audio-file – indiv

Respuesta

13

Usando MP3SPI:

private static void getDurationWithMp3Spi(File file) throws UnsupportedAudioFileException, IOException { 

    AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(file); 
    if (fileFormat instanceof TAudioFileFormat) { 
     Map<?, ?> properties = ((TAudioFileFormat) fileFormat).properties(); 
     String key = "duration"; 
     Long microseconds = (Long) properties.get(key); 
     int mili = (int) (microseconds/1000); 
     int sec = (mili/1000) % 60; 
     int min = (mili/1000)/60; 
     System.out.println("time = " + min + ":" + sec); 
    } else { 
     throw new UnsupportedAudioFileException(); 
    } 

} 
+0

Este método no funciona para esta pista: https: // www.dropbox.com/s/735fdkp9roskapw/39007.mp3?dl = 0 - La pista tiene 3:52, pero este código dice que tiene 22:17. –

+0

Acabo de probar esto. Las claves en el mapa 'properties' son:' mp3.copyright, date, mp3.framesize.bytes, mp3.vbr, mp3.framerate.fps, mp3.id3tag.track, title, mp3.channels, mp3.id3tag.genre , mp3.bitrate.nominal.bps, mp3.padding, mp3.version.mpeg, mp3.crc, mp3.original, mp3.frequency.hz, álbum, autor, mp3.id3tag.v2, mp3.vbr.scale, mp3 .version.encoding, mp3.version.layer, mp3.id3tag.v2.version, mp3.header.pos, comment'. No hay una tecla 'duración'. – Jules

-2

Estoy pasado de moda en esto, pero siempre obtengo las especificaciones para MP3, escribo una función que busca los bits correctos y la descubro.

Si Winamp puede determinar esto leyendo el flujo de bits de un archivo MP3, entonces yo también puedo ¿verdad?

¡Y usted también puede, yo creo en usted compañero!

+12

Creo que la gente vino a TAN en busca de respuestas, no de palabras de fe, pero gracias de todos modos ... –

+0

Por cierto, no sé nada sobre manejar archivos mp3, ¿tiene un vínculo de ejemplo o artículo sobre lo que está diciendo? –

+0

Bueno, así es como lo hacen las funciones incorporadas. MP3 es una especificación, lo que significa que en algún índice de un archivo MP3 en algún formato debe escribirse la longitud. Supongamos que la longitud está en el 129º byte, solo carga el archivo como una secuencia, vaya a esa parte y la lea. A continuación, alguien publicó un enlace de la estructura de archivos MP3. – Zorf

2

Aquí es una explicación detallada de la estructura de archivos MP3

http://www.autohotkey.com/forum/topic29420.html

+2

Tu y yo bebe, somos un equipo. – Zorf

+0

Enlace directo a la página (mejor formateado): http://www.multiweb.cz/twoinches/MP3inside.htm (Estoy leyendo, ¡gracias!) –

3

Aquí es la forma en que sale el tiempo total de un archivo .mp3, I' m utilizando la biblioteca es Jlayer 1.0.1

Header h= null; 
    FileInputStream file = null; 
    try { 
     file = new FileInputStream(filename); 
    } catch (FileNotFoundException ex) { 
     Logger.getLogger(MP3.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    bitstream = new Bitstream(file); 
    try { 
     h = bitstream.readFrame(); 

    } catch (BitstreamException ex) { 
     Logger.getLogger(MP3.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    int size = h.calculate_framesize(); 
    float ms_per_frame = h.ms_per_frame(); 
    int maxSize = h.max_number_of_frames(10000); 
    float t = h.total_ms(size); 
    long tn = 0; 
    try { 
     tn = file.getChannel().size(); 
    } catch (IOException ex) { 
     Logger.getLogger(MP3.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    //System.out.println("Chanel: " + file.getChannel().size()); 
    int min = h.min_number_of_frames(500); 
    return h.total_ms((int) tn)/1000; 
+0

aquí está la manera en que obtengo el tiempo total de un archivo .mp3, estoy usando la biblioteca es Jlayer 1.0.1 –

+0

, esto funcionó bien para mí, pero la respuesta contiene muchas cosas innecesarias. long tn = new Archivo (nombre de archivo) .length(); double duration = header.total_ms ((int) tn) ​​/ 1000; – feri

Cuestiones relacionadas