2010-06-15 14 views
12

Die Antworten in How do I get a sound file’s total time in Java? funktionieren gut für WAV-Dateien, aber nicht für MP3-Dateien.Wie bekomme ich die Gesamtzeit einer MP3-Datei in Java?

Sie sind (da eine Datei):

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

und:

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)); 

Sie geben das gleiche richtige Ergebnis für WAV-Dateien, aber falsch und unterschiedliche Ergebnisse für MP3-Dateien.

Eine Idee, was muss ich tun, um die Dauer der MP3-Datei zu bekommen?

+0

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

Antwort

13

MP3SPI Verwendung:

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

Diese Methode funktioniert nicht für diesen Track: https: // www.dropbox.com/s/735fdkp9roskapw/39007.mp3?dl = 0 - Die Spur hat 3:52, aber dieser Code hat 22:17. –

+0

Ich habe es gerade versucht. Die Schlüssel in der 'Eigenschaften'-Map sind:' 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, Album, Autor, mp3.id3tag.v2, mp3.vbr.scale, mp3 .version.encoding, mp3.version.layer, mp3.id3tag.v2.version, mp3.header.pos, comment'. Es gibt keinen "duration" Schlüssel. – Jules

-2

Ich bin altmodisch in diesem, aber ich bekomme immer einfach die Spezifikationen für MP3, schreibe eine Funktion, die die richtigen Bits sucht, und finde es heraus.

Wenn Winamp dies durch Lesen der Bitstream einer MP3-Datei feststellen kann, dann kann ich das richtig?

Und so können Sie, ich glaube an dich, Kumpel!

+12

Ich denke, die Leute kamen zu SO auf der Suche nach Antworten, nicht für Worte des Glaubens, aber trotzdem danke ... –

+0

Übrigens, ich weiß nichts über handle mp3-Dateien, haben Sie ein Beispiel oder Artikel Link über das, was Sie sagen? –

+0

Nun, das ist, wie eingebaute Funktionen es tun. MP3 ist eine Spezifikation, was bedeutet, dass bei irgendeinem Index einer MP3-Datei in irgendeinem Format die Länge geschrieben werden sollte. Nehmen wir an, die Länge liegt beim 129. Byte, Sie laden die Datei einfach als Stream, gehen Sie zu diesem Teil und lesen Sie es aus. Unten hat jemand einen Link der MP3-Dateistruktur gepostet. – Zorf

3

Hier ist die Art, wie ich die Gesamtzeit einer Datei .mp3 bekommen, ich m unter Verwendung der Bibliothek ist 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

Hier ist die Art, wie ich die Gesamtzeit einer Datei .mp3 bekomme, ich benutze die Bibliothek ist Jlayer 1.0.1 –

+0

das hat gut für mich funktioniert, aber die Antwort enthält eine Menge unnötiger Zeug. long tn = neue Datei (Dateiname) .length(); doppelte Dauer = header.total_ms ((int) tn) ​​/ 1000; – feri

Verwandte Themen